Ubuntu云服务部署MiniO && AWS-SDK-CPP访问MiniO
Ubuntu云服务部署MiniO
1.腾讯云服务选择ubuntu对应版本
2.登录进入对应的云
#进入root
sudo -s
# 下载minio服务端
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 将下载所得minio文件拷贝到指定文件夹并赋权
sudo cp minio /usr/local/bin/
sudo chmod +x /usr/local/bin/minio
3.进入根节点为minio创建存储目录
#进入根节点
cd /
#创建minio存储目录
mkdir data
4.启动minio服务端
#设置minio API端口为9003,console端口为9001,若端口有占用情况需要更换端口号
minio server /data/minioData/ --address 0.0.0.0:9003 --console-address ":9001" >/data/minio.log 2>&1 &
#查看是否启动
ps -ef | grep minio
5.进入对应的网址
(1).进入云服务找到对应的公网IP
(2).访问http://公网IP:9001进入minio界面,账号:minioadmin 密码:minioadmin 为初始账号密码
(3).若出现访问被拒或者进不去上述界面需要配置云服务防火墙
6.配置Minio桶
(1).创建桶(buckets -> create bucket)
(2).设置桶访问权限为public(buckets -> demo -> Access Policy)
(3).设置桶的内存大小(buckets -> demo -> Quota)
(4).上传文件(Objetc browser -> demo ->upload)
(5).设置 access key(Access key -> create access key -> create) 记得保存key,它在创建后只显示这一次
AWS-SDK-CPP访问MiniO
1.下载aws-sdk-cpp
#拉取github aws-sdk-cpp 文件
git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
#更新aws-sdk-cpp
cd aws-sdk-cpp
git checkout main
git pull origin main
git submodule update --init --recursive
#下载所有依赖项的捆绑包,并将其扩展到正确的位置
./prefetch_crt_dependency.sh
2.编译
#创建文件夹
mkdir build
cd build
#CMAKE_PREFIX_PATH 指定编译的aws-sdk-cpp路径
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_PREFIX_PATH=./aws-sdk-cpp ..
#编译并按照默认安装aws-sdk-cpp
make && make install
3.Aws访问云服务部署的minio
#include <iostream>
#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/core/auth/AWSCredentialsProvider.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/ListObjectsRequest.h>
#include <fstream>
#include <string>
Aws::S3::S3Client *s3_client=nullptr;
/// @brief 初始化获取S3client指针
void init()
{
Aws::Client::ClientConfiguration config;
config.endpointOverride = "公网IP:API端口";
config.scheme = Aws::Http::Scheme::HTTP;
config.verifySSL = false;
//minioadmin可以替换成minio中申请的access key
s3_client=new Aws::S3::S3Client(Aws::Auth::AWSCredentials("minioadmin", "minioadmin"), config,
Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false);
}
/// @brief 下载指定桶的指定文件
/// @param objectKey 指定文件
/// @param fromBucket 指定桶
/// @return
bool downloadFile(const Aws::String &objectKey, const Aws::String &fromBucket)
{
Aws::S3::Model::GetObjectRequest object_request;
object_request.SetBucket(fromBucket);
object_request.SetKey(objectKey);
//等同
// Aws::S3::Model::GetObjectRequest object_request;
// object_request.WithBucket(fromBucket).WithKey(objectKey);
Aws::S3::Model::GetObjectOutcome get_object_outcome = s3_client->GetObject(object_request);
if (get_object_outcome.IsSuccess())
{
Aws::OFStream local_file;
local_file.open(objectKey, std::ios::out | std::ios::binary);
local_file << get_object_outcome.GetResultWithOwnership().GetBody().rdbuf();
return true;
} else {
auto err = get_object_outcome.GetError();
std::cout << "Error: GetObject: " << err.GetExceptionName() << ": " << err.GetMessage() << std::endl;
return false;
}
}
/// @brief 获取桶名称和桶内名称
void GetObject()
{
auto reponse=s3_client->ListBuckets();
if(reponse.IsSuccess())
{
auto but=reponse.GetResult().GetBuckets();
for (auto it=but.begin();it!=but.end();it++)
{
std::cout<<"Buckets:"<<it->GetName()<<std::endl;
Aws::S3::Model::ListObjectsRequest request;
request.WithBucket(it->GetName());
auto object=s3_client->ListObjects(request);
if (object.IsSuccess())
{
auto list_name=object.GetResult().GetContents();
for (auto iter=list_name.begin();iter!=list_name.end();iter++)
{
std::cout<<"Object:"<<iter->GetKey()<<std::endl;
}
}
}
}
}
bool uploadFile()
{
Aws::S3::Model::PutObjectRequest request;
//这里指定桶和数据
request.WithBucket("demo").WithKey("libchilkat-9.5.0.a");
auto data=Aws::MakeShared<Aws::FStream>("PutObjectInputStream","/home/jinx/object/lib/libchilkat-9.5.0.a", std::ios_base::in | std::ios_base::binary);
request.SetBody(data);
auto putObjectResult = s3_client->PutObject(request);
if (putObjectResult.IsSuccess())
{
std::cout << "Done!" << std::endl;
return true;
}
else
{
std::cout << "Faild!" << std::endl;
return false;
}
}
int main(int, char **)
{
Aws::SDKOptions options;
Aws::InitAPI(options);
{
const Aws::String bucket_name = "demo";//已经有的桶名称
const Aws::String object_name = "credentials.json";//已有的桶内文件的名称
//初始化基本信息
init();
//文件上传到minio
uploadFile();
//查看所有的公共桶和桶内的文件
GetObject();
//下载桶内文件
if (!downloadFile(object_name, bucket_name)) {
return 1;
}
delete s3_client;
}
Aws::ShutdownAPI(options);
return 0;
}
4.CMakeLists.txt信息
cmake_minimum_required(VERSION 3.8)
project(sota_curl)
find_package(Threads REQUIRED)
find_package(AWSSDK REQUIRED COMPONENTS s3)
add_executable(main src/minioDownload.cpp)
target_link_libraries(
main
${AWSSDK_LINK_LIBRARIES}
)