Help us understand the problem. What is going on with this article?

DockerとMinioでAWS SDK for C++の開発環境を構築する

More than 1 year has passed since last update.

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://qiita.com/kai_kou/items/9fe06d4d24928d9efa2a

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://qiita.com/kai_kou/items/095e409539fbe77f0d59

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://qiita.com/kai_kou/items/9fe06d4d24928d9efa2a

ビルドして実行する

コンテナ内
# 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://qiita.com/kai_kou/items/9fe06d4d24928d9efa2a

S3互換のオブジェクトストレージ MinioにAWS SDK for C++でアクセスするのにハマるポイント - Qiita
https://qiita.com/kai_kou/items/095e409539fbe77f0d59

kai_kou
2004年からWeb系のシステムエンジニアとして開発、運用、マネジメントを経験。現在はアイレット(クラウドパック)に所属。 べ、別にいいね貰えたからってモチベーションが上がって記事とコードの品質があがるわけじゃないんだからね///
https://twitter.com/k_aik_ou
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした