AWS SDK for C++を利用した開発を行うのにDockerとMinioを利用して開発環境を用意してみました。
環境構築
GitHubに設定と実装をアップしていますので、よければご参考ください。
https://github.com/kai-kou/aws-sdk-cpp-on-docker
Dockerfile
でAWS SDK for C++がインストールされたイメージをビルドできるようにします。
ベースとなるイメージにubuntu
指定していますが、他に変えてもおkです。お好みで。
SDKのビルド時に-DBUILD_ONLY
を指定しないとSDK全体がビルドされることになり、おそらく数時間かかりますので、ご注意ください。
Dockerfile
FROM ubuntu:18.04 RUN apt-get update && \ apt-get install -y git build-essential cmake clang RUN apt-get update && \ apt-get install -y libcurl4-openssl-dev libssl-dev uuid-dev zlib1g-dev libpulse-dev RUN git clone https://github.com/aws/aws-sdk-cpp.git && \ mkdir aws-sdk-cpp-build && \ cd aws-sdk-cpp-build && \ cmake -DBUILD_ONLY="s3" ../aws-sdk-cpp && \ make && \ make install
AWS SDK for C++を利用してS3へアクセスするのに、ローカル環境としてMinioを利用しています。
Minioについては下記をご参考ください。
S3互換のオブジェクトストレージ MinioをDocker Composeで利用する – Qiita
https://cloudpack.media/46077
docker-compose.yaml
version: '3.3' services: dev: build: . volumes: - type: bind source: ./src target: /cpp-dev minio: image: minio/minio volumes: - type: bind source: ./data target: /export ports: - "9000:9000" environment: MINIO_ACCESS_KEY: hogehoge MINIO_SECRET_KEY: hogehoge command: server /export
上記ファイルを含むファイル構成は以下のようになります。
> tree . ├── Dockerfile ├── data │ └── hoge ├── docker-compose.yml └── src ├── CMakeLists.txt ├── build └── main.cpp
実装
put_object
メソッドでS3(Minio)へファイルをPUTしています。
Minioを利用する都合、endpointOverride
を利用しています。
詳細は下記をご参考ください。
S3互換のオブジェクトストレージ MinioにAWS SDK for C++でアクセスするのにハマるポイント – Qiita
https://cloudpack.media/46084
main.cpp
#include <iostream> #include <aws/core/Aws.h> #include <aws/core/auth/AWSCredentialsProvider.h> #include <aws/core/auth/AWSAuthSigner.h> #include <aws/s3/S3Client.h> #include <aws/s3/model/PutObjectRequest.h> void put_object(Aws::String key_name) { const Aws::String endpoint = "minio:9000"; const Aws::String bucket_name = "hoge"; auto input_data = Aws::MakeShared<Aws::StringStream>(""); *input_data << "hoge!" << '\n'; Aws::S3::Model::PutObjectRequest object_request; object_request.WithBucket(bucket_name) .WithKey(key_name) .SetBody(input_data); Aws::SDKOptions options; Aws::InitAPI(options); // Minioを利用する場合、ちょっと面倒 Aws::Auth::AWSCredentials cred = Aws::Auth::EnvironmentAWSCredentialsProvider().GetAWSCredentials(); Aws::Client::ClientConfiguration clientConfig; if (!endpoint.empty()) { clientConfig.scheme = Aws::Http::Scheme::HTTP; clientConfig.endpointOverride = endpoint; } auto const s3_client = Aws::S3::S3Client(cred, clientConfig, Aws::Client::AWSAuthV4Signer::PayloadSigningPolicy::Never, false); // Minioを利用しない場合、下記でおk // Aws::S3::S3Client s3_client(clientConfig); auto const outcome = s3_client.PutObject(object_request); if (outcome.IsSuccess()) { std::cout << key_name << " Done!" << std::endl; } else { std::cout << key_name << " Error: "; std::cout << outcome.GetError().GetMessage().c_str() << std::endl; } Aws::ShutdownAPI(options); } int main() { put_object("hoge1.txt"); return 0; }
CMakeLists.txt
でAWS SDK for C++が利用できるように指定します。
CMakeLists.txt
cmake_minimum_required(VERSION 3.5) find_package(AWSSDK REQUIRED COMPONENTS s3) add_definitions(-DUSE_IMPORT_EXPORT) add_executable(main main.cpp) target_link_libraries(main ${AWSSDK_LINK_LIBRARIES})
Dockerコンテナの立ち上げ
> docker-compose build > docker-compose up -d minio > docker-compose run dev bash #
Minioの準備
docker-compose up -d minio
でMinioのコンテナが立ち上がったらhttp://localhost:9000
にブラウザでアクセスしてバケットhoge
を作成します。作成後、Bucket PolicyをPrefix:*
にRead and Write
で設定します。
設定の詳細は下記をご参考ください。
S3互換のオブジェクトストレージ MinioをDocker Composeで利用する – Qiita
https://cloudpack.media/46077
ビルドして実行する
コンテナ内
# cd /cpp-dev/build # cmake .. # cmake --build . # ./main hoge1.txt Done!
問題なく実行できました。
Minioが利用するディレクトリにファイルが保存されたのも確認できます。
> tree data/hoge data/hoge/ └── hoge1.txt > cat data/hoge/hoge1.txt hoge!
やったぜ。
参考
aws/aws-sdk-cpp: AWS SDK for C++
https://github.com/aws/aws-sdk-cpp
S3互換のオブジェクトストレージ MinioをDocker Composeで利用する – Qiita
https://cloudpack.media/46077
S3互換のオブジェクトストレージ MinioにAWS SDK for C++でアクセスするのにハマるポイント – Qiita
https://cloudpack.media/46084