2
4

More than 5 years have passed since last update.

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

Posted at

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

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4