Qtの応用 - AWS

提供: MochiuWiki : SUSE, EC, PCB

概要

AWS SDK for C++は、Amazon Web Services (AWS) 向けのモダンなC++ 11以降のインターフェースを提供するSDKである。
ほぼ全てのAWS機能に対して高レベルAPIと低レベルAPIの両方を提供しており、依存関係を最小限に抑えながら、Windows、MacOS、Linux、モバイルでのプラットフォーム移植性を実現している。

パフォーマンスを重視して設計されており、低レベルと高レベルの両方のSDKを完全に機能させながら、依存関係を最小限に抑えている。

300以上のAWSサービスに対応しており、コンピューティング (EC2、Lambda、ECS等)、ストレージ (S3、EBS、Glacier等)、データベース (DynamoDB、RDS、Redshift等)、
機械学習 (SageMaker、Bedrock、Rekognition等) などの主要なサービスが含まれている。

Standard Template Library (STL) との連携、C++11機能の使用とサポート、例外安全性、広範囲で設定可能なロギング、デフォルトの認証情報プロバイダー等の特徴がある。

AWS SDK for C++は現在General Availability (一般提供) で、本番環境での使用が推奨されている。


AWS SDK for C++のインストール

RHEL、SUSE、Debianの標準パッケージ管理システムからAWS SDK for C++を直接インストールすることは公式にはサポートされていない。
そのため、ソースコードからAWS SDK for C++をインストールすることが推奨される。

  • システム要件
    4[GB]以上のRAMが必要となるため、t2.micro、t2.small等の小さいEC2インスタンスではメモリ不足でビルドが失敗する可能性がある。

  • 必要なコンパイラ
    • Visual Studio 2015以降
    • GCC 4.9以降
    • Clang 3.3以降


Linux

AWS SDK for C++のビルドに必要なライブラリをインストールする。

# RHEL
sudo dnf install libcurl-devel openssl-devel libuuid-devel pulseaudio-libs-devel

# SUSE
sudo zypper install zlib-devel libcurl-devel libopenssl-devel libopenssl-3-devel

# Debian
sudo apt install cmake libcurl4-openssl-dev libssl-dev uuid-dev zlib1g-dev libpulse-dev


AWS SDK for C++のソースコードをダウンロードする。

git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
cd aws-sdk-cpp


AWS SDK for C++をビルドおよびインストールする。

cmake \
     -DCMAKE_BUILD_TYPE=Release \
     -DCMAKE_INSTALL_PREFIX=<AWS SDK for C++のインストールディレクトリ> \
     -DBUILD_ONLY="dynamodb;s3;lambda" \  # DynamoDB, S3, Lambdaのみを使用する場合
     ..
make -j $(nproc)
make install


Windows

vcpkgパッケージマネージャは外部コントリビューターによって管理されているパッケージマネージャであり、AWSから直接提供されているものではない。

vcpkgパッケージマネージャをインストールする。

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install


AWS SDK for C++をインストールする。

./vcpkg install aws-sdk-cpp


BUILD_ONLYオプション

AWS SDK for C++ BUILD_ONLYパラメータ一覧
カテゴリ BUILD_ONLYパラメータ サービス名
コンピューティング系 ec2 Amazon EC2
ecs Amazon ECS
eks Amazon EKS
lambda AWS Lambda
batch AWS Batch
lightsail Amazon Lightsail
ストレージ系 s3 Amazon S3
s3-crt Amazon S3 (CRT client)
glacier Amazon Glacier
ebs Amazon EBS
fsx Amazon FSx
storage-gateway AWS Storage Gateway
データベース系 dynamodb Amazon DynamoDB
rds Amazon RDS
redshift Amazon Redshift
neptune Amazon Neptune
docdb Amazon DocumentDB
timestream-write Amazon Timestream (書き込み)
timestream-query Amazon Timestream (クエリ)
分析系 athena Amazon Athena
emr Amazon EMR
kinesis Amazon Kinesis
kinesis-analytics Amazon Kinesis Analytics
glue AWS Glue
quicksight Amazon QuickSight
機械学習・AI系 sagemaker Amazon SageMaker
rekognition Amazon Rekognition
comprehend Amazon Comprehend
translate Amazon Translate
transcribe Amazon Transcribe
polly Amazon Polly
lex Amazon Lex
bedrock Amazon Bedrock
bedrock-runtime Amazon Bedrock Runtime
ネットワーク・配信系 cloudfront Amazon CloudFront
route53 Amazon Route 53
elb Elastic Load Balancing
elasticloadbalancing Elastic Load Balancing
elbv2 Elastic Load Balancing v2
elasticloadbalancingv2 Elastic Load Balancing v2
apigateway Amazon API Gateway
directconnect AWS Direct Connect
セキュリティ・認証系 iam AWS IAM
cognito-identity Amazon Cognito Identity
cognito-idp Amazon Cognito Identity Provider
kms AWS KMS
secretsmanager AWS Secrets Manager
acm AWS Certificate Manager
guardduty Amazon GuardDuty
inspector Amazon Inspector
管理・監視系 cloudwatch Amazon CloudWatch
cloudwatch-logs Amazon CloudWatch Logs
cloudtrail AWS CloudTrail
config AWS Config
organizations AWS Organizations
cloudformation AWS CloudFormation
ssm AWS Systems Manager
メッセージング系 sqs Amazon SQS
sns Amazon SNS
ses Amazon SES
pinpoint Amazon Pinpoint
eventbridge Amazon EventBridge
統合・ワークフロー系 stepfunctions AWS Step Functions
swf Amazon SWF
mq Amazon MQ
その他 iot AWS IoT
greengrass AWS Greengrass
mediaconvert AWS Elemental MediaConvert
elastictranscoder Amazon Elastic Transcoder


上記は主要なサービスのリストであるが、実際には300以上のサービスがサポートされている。
そのため、最新の完全なリストは、GitHubリポジトリで直接確認することを推奨する。

  • サービス名の完全なリストを取得する方法
    AWS SDK for C++おソースコードをダウンロードする。
    git clone --recurse-submodules https://github.com/aws/aws-sdk-cpp
    

    サービス名の一覧を表示する。
    cd aws-sdk-cpp
    ls -d aws-cpp-sdk-* | sed 's/aws-cpp-sdk-//' | sort
    


  • vcpkg (Windows) を使用して利用可能な全ての機能を確認する場合
    vcpkg search aws-sdk-cpp
    



AWS DynamoDB

Qtの応用 - AWS DynamoDBのページを参照すること。


AWS S3

Qtの応用 - AWS S3のページを参照すること。


AWS SDKの初期化 : InitAPIメソッド

AWS SDK for C++を使用する前に、SDKの初期化を行う必要がある。

 Aws::SDKOptions options;
 Aws::InitAPI(options);



SDK設定オプション : SDKOptionsオブジェクト

AWS SDK全体の動作を制御するグローバル設定を保持するクラスである。
ロギング、メモリ管理、HTTPクライアント、暗号化などの設定を含む。

プログラム全体で1つのSDKOptionsインスタンスを使用する。

主要な設定オプションを以下に示す。

  • ロギング設定 (loggingOptions)
 Aws::SDKOptions options;
 
 // ログレベルの設定
 // LogLevel: Off, Fatal, Error, Warn, Info, Debug, Trace
 options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Warn;
 
 // カスタムロガーの設定 (ファイル出力)
 options.loggingOptions.logger_create_fn = []() {
    return Aws::MakeShared<Aws::Utils::Logging::DefaultLogSystem>(
       "MyApp",
       Aws::Utils::Logging::LogLevel::Debug,
       "aws_sdk_"  // ログファイルのプレフィックス
    );
 };
 
 // コンソール出力ロガー
 options.loggingOptions.logger_create_fn = []() {
    return Aws::MakeShared<Aws::Utils::Logging::ConsoleLogSystem>(
       "MyApp",
       Aws::Utils::Logging::LogLevel::Info
    );
 };


  • メモリ管理設定 (memoryManagementOptions)
 // カスタムメモリマネージャの設定
 options.memoryManagementOptions.memoryManager = nullptr;  // デフォルト使用
 
 // または独自のメモリマネージャを実装
 class MyMemoryManager : public Aws::Utils::Memory::MemorySystemInterface {
 public:
    void* AllocateMemory(std::size_t blockSize, std::size_t alignment, const char *allocationTag = nullptr) override
    {
       // カスタムメモリ割り当て
       return aligned_alloc(alignment, blockSize);
    }
 
    void FreeMemory(void* memoryPtr) override
    {
       // カスタムメモリ解放
       free(memoryPtr);
    }
 };
 
 // 使用例
 auto myMemoryManager = std::make_shared<MyMemoryManager>();
 options.memoryManagementOptions.memoryManager = myMemoryManager;


  • HTTP設定 (httpOptions)
 // HTTP接続プール設定
 options.httpOptions.initAndCleanupCurl = true;  // libcurlの初期化/クリーンアップ
 
 // SIGPIPEシグナルハンドラのインストール (Linux / Unix)
 options.httpOptions.installSigPipeHandler = true;
 
 // カスタムHTTPクライアントファクトリ
 options.httpOptions.httpClientFactory_create_fn = []() {
    return Aws::MakeShared<Aws::Http::CurlHttpClientFactory>("MyFactory");
 };


  • 暗号化設定 (cryptoOptions)
 // 暗号化プロバイダの初期化/シャットダウン
 options.cryptoOptions.initAndCleanupOpenSSL = true;
 
 // SecureRandomバイト生成の設定
 options.cryptoOptions.secureRandomFactory_create_fn = []() {
    return Aws::MakeShared<Aws::Utils::Crypto::DefaultSecureRandomBytes>("MyApp");
 };


  • デフォルト設定で使用する場合
 // 最もシンプルな形式 (全てデフォルト値)
 Aws::SDKOptions options;
 Aws::InitAPI(options);



SDK初期化メソッド : InitAPI

全てのAWSクライアント (DynamoDBClient等) を作成する前に実行する。
これは、プログラム開始時に1回だけ呼び出す必要がある。

InitAPIの役割を以下に示す。

  • AWS SDK for C++のグローバルリソースを初期化する。
  • HTTPクライアント、暗号化ライブラリ、ロガーなどの内部コンポーネントをセットアップする。


InitAPIが行う処理は以下の通りである。

  • libcurl (HTTPクライアント) の初期化
  • OpenSSL (暗号化ライブラリ) の初期化
  • メモリアロケータの設定
  • ロギングシステムの初期化
  • HTTP接続プールの作成
  • スレッドプールの初期化


基本的な使用例を以下に示す。

 #include <QCoreApplication>
 #include <aws/core/Aws.h>
 #include <aws/dynamodb/DynamoDBClient.h>
 
 int main(int argc, char *argv[])
 {
    QCoreApplication app(argc, argv);
 
    // ステップ 1 : SDKOptionsの設定
    Aws::SDKOptions options;
    options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
 
    // ステップ 2 : SDK初期化 (プログラム開始時に1回だけ実行)
    Aws::InitAPI(options);
 
    {
       // ステップ 3 : AWSクライアントの作成と使用
       Aws::Client::ClientConfiguration config;
       Aws::DynamoDB::DynamoDBClient client(config);
 
       // AWSサービス操作
       // ...略
    }  // ステップ 4 : クライアントオブジェクトの破棄
 
    // ステップ 5 : SDKシャットダウン (プログラム終了時に1回だけ実行)
    Aws::ShutdownAPI(options);
 
    return 0;
 }


※注意

  • InitAPIメソッドはスレッドセーフではないため、メインスレッドで呼び出すこと。
  • InitAPIメソッドとShutdownAPIメソッドは、1対1で対応させること。
  • 複数回のInitAPIメソッドの呼び出しは可能であるが、各呼び出しに対して対応するShutdownAPIメソッドが必要となる。
  • 全てのAWSクライアントオブジェクトをShutdownAPIメソッド前に破棄すること。



初期化からシャットダウンまでの基本フロー

  1. Aws::SDKOptionsオブジェクトでAWS SDK全体の設定を行う。
  2. Aws::InitAPIメソッドでSDKを初期化する。(1回のみ)
  3. Aws::Client::ClientConfigurationでクライアント設定を行う。
  4. AWSサービスのオブジェクト (Aws::DynamoDB::DynamoDBClient等) を生成する。
  5. AWSサービスを操作する。
  6. クライアントオブジェクトを破棄する。
  7. Aws::ShutdownAPIメソッドでSDKをシャットダウンする。(1回のみ)


重要なポイントを以下に示す。

  • InitAPI / ShutdownAPIはメインスレッドで呼び出す。
  • クライアントオブジェクトはスレッドセーフ。
  • ShutdownAPIメソッドを実行する前に全てのクライアントを破棄する。
  • 認証情報とリージョンは環境変数や設定ファイルから自動取得可能である。
  • Qtではシングルトンパターンの使用を推奨する。