Qtの応用 - AWS
概要
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オプション
| カテゴリ | 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メソッド前に破棄すること。
初期化からシャットダウンまでの基本フロー
- Aws::SDKOptionsオブジェクトでAWS SDK全体の設定を行う。
- Aws::InitAPIメソッドでSDKを初期化する。(1回のみ)
- Aws::Client::ClientConfigurationでクライアント設定を行う。
- AWSサービスのオブジェクト (Aws::DynamoDB::DynamoDBClient等) を生成する。
- AWSサービスを操作する。
- クライアントオブジェクトを破棄する。
- Aws::ShutdownAPIメソッドでSDKをシャットダウンする。(1回のみ)
重要なポイントを以下に示す。
- InitAPI / ShutdownAPIはメインスレッドで呼び出す。
- クライアントオブジェクトはスレッドセーフ。
- ShutdownAPIメソッドを実行する前に全てのクライアントを破棄する。
- 認証情報とリージョンは環境変数や設定ファイルから自動取得可能である。
- Qtではシングルトンパターンの使用を推奨する。