(同じ利用者による、間の2版が非表示)
5行目: 5行目:
== AWS SDK for C++のインストール ==
== AWS SDK for C++のインストール ==
[[Qtの応用_-_AWS|Qtの応用_-_AWS#AWS_SDK_for_C++のインストール]]のページを参照すること。<br>
[[Qtの応用_-_AWS|Qtの応用_-_AWS#AWS_SDK_for_C++のインストール]]のページを参照すること。<br>
<br><br>
==== AWS認証情報 ====
AWS SDKのメソッドを使用する前に、以下に示すいずれかの方法でAWS認証情報を設定する必要がある。<br>
<br>
* 環境変数
** AWS_ACCESS_KEY_ID
**: AWSアクセスキーID
** AWS_SECRET_ACCESS_KEY
**: AWSシークレットアクセスキー
** AWS_SESSION_TOKEN
**: 一時認証情報を使用する場合のセッショントークン
*: <br>
* AWS認証情報ファイル<br>~/.aws/credentialsファイル
*: <syntaxhighlight lang="ini">
[default]
aws_access_key_id = <アクセスキーID>
aws_secret_access_key = <シークレットアクセスキー>
</syntaxhighlight>
*: <br>
* IAMロール
** EC2インスタンスやLambda関数内で実行する場合
** IAMロールが自動的にアタッチされ、認証情報の管理が不要
*: <br>
* AWS SDK設定ファイル<br>~/.aws/configファイル
*: <syntaxhighlight lang="ini">
[default]
region = <リージョン名  例 : us-east-1>
output = json
</syntaxhighlight>
<br><br>
<br><br>


29行目: 59行目:
  // 全てのLambda操作 (Invoke, ListFunctions等) はこのクライアントを通じて実行される
  // 全てのLambda操作 (Invoke, ListFunctions等) はこのクライアントを通じて実行される
  auto lambdaClient = std::make_unique<Aws::Lambda::LambdaClient>(clientConfig);
  auto lambdaClient = std::make_unique<Aws::Lambda::LambdaClient>(clientConfig);
</syntaxhighlight>
<br><br>
== Lambda関数の呼び出し ==
Lambda関数を呼び出し、レスポンスを取得する。<br>
<br>
以下の例では、同期呼び出し、非同期呼び出し、ドライランに対応している。<br>
<br>
<syntaxhighlight lang="c++">
#include <aws/lambda/LambdaClient.h>
#include <aws/lambda/model/InvokeRequest.h>
// Aws::Lambda::Model::InvokeRequest
// Lambda関数呼び出しリクエストを表すクラス
// 関数名、ペイロード、呼び出しタイプ、ログタイプ等を設定する
Aws::Lambda::Model::InvokeRequest request;
// SetFunctionName()
// 呼び出すLambda関数の名前またはARN(Amazon Resource Name)を指定する
// 例 : "my-function" または "arn:aws:lambda:us-east-1:123456789012:function:my-function"
request.SetFunctionName(functionName.toStdString());
// InvocationType (呼び出しタイプ) の設定
// Lambda関数の呼び出し方法を指定する列挙型
if (invocationType == "RequestResponse") {
    // RequestResponse - 同期呼び出し
    // 関数の実行完了を待ち、結果(レスポンスペイロード)を返す
    // リアルタイムで結果が必要な場合に使用
    request.SetInvocationType(Aws::Lambda::Model::InvocationType::RequestResponse);
}
else if (invocationType == "Event") {
    // Event - 非同期呼び出し
    // 関数をイベントキューに追加し、すぐに制御を返す(結果は返らない)
    // 処理の完了を待つ必要がない場合に使用
    request.SetInvocationType(Aws::Lambda::Model::InvocationType::Event);
}
else if (invocationType == "DryRun") {
    // DryRun - テスト呼び出し
    // 実際には関数を実行せず、アクセス許可のみを検証する
    // 本番実行前の権限チェックに使用
    request.SetInvocationType(Aws::Lambda::Model::InvocationType::DryRun);
}
// LogType(ログタイプ)の設定
// 実行ログの取得方法を指定する列挙型
if (logType == "Tail") {
    // Tail - 最後の4KBの実行ログをBase64エンコードして返す
    // デバッグ時に関数の実行状況を確認する場合に使用
    request.SetLogType(Aws::Lambda::Model::LogType::Tail);
}
else {
    // None - ログを返さない
    // ログが不要な場合に使用 (デフォルト)
    request.SetLogType(Aws::Lambda::Model::LogType::None);
}
// SetBody() - ペイロード (入力データ) の設定
// Lambda関数に渡すデータを設定する (JSON形式が一般的)
// Aws::MakeShared
// AWS SDKのメモリアロケータを使用してshared_ptrを作成する関数
// 第1引数は識別用のタグ (メモリトラッキング用)
std::shared_ptr<Aws::IOStream> payload_stream = Aws::MakeShared<Aws::StringStream>("PayloadStream");
*payload_stream << payload.toStdString();
request.SetBody(payload_stream);
// Invoke() - Lambda関数を実際に呼び出すメソッド
// 戻り値はOutcomeオブジェクト (成功 / 失敗の結果を保持)
//
// Outcome
// AWS SDK for C++の結果を表すテンプレートクラス
// 成功時はGetResult(), 失敗時はGetError()でアクセスする
auto outcome = m_lambdaClient->Invoke(request);
// IsSuccess() - 呼び出しが成功したかをチェック
if (outcome.IsSuccess()) {
    // GetResult() - 成功時の結果オブジェクトを取得
    const auto& result = outcome.GetResult();
    // GetStatusCode()
    // HTTPステータスコードを取得
    // 通常、成功時は200が返る
    int statusCode = result.GetStatusCode();
    // GetFunctionError()
    // Lambda関数内でエラーが発生した場合、エラータイプを返す
    // "Handled" - 関数コード内でキャッチされたエラー
    // "Unhandled" - 関数コードでキャッチされなかったエラー
    // 空文字列 - エラーなし
    std::string functionError = result.GetFunctionError();
    // GetPayload()
    // Lambda関数から返されたレスポンスデータのストリームを取得
    // 通常、JSON形式のデータが返される
    auto& payload_stream = result.GetPayload();
    std::stringstream ss;
    ss << payload_stream.rdbuf();
    std::string response_payload = ss.str();
    // GetLogResult()
    // 実行ログ (Base64エンコード済み) を取得
    // LogType::Tailを指定した場合のみ利用可能
    // デコードすることで関数の実行ログ (print文やエラーメッセージ等) を確認できる
    std::string logResult = result.GetLogResult();
    return true;
}
else {
    // GetError() - 失敗時のエラー情報を取得
    // GetMessage() - エラーメッセージを取得
    std::cerr << "✗ 呼び出し失敗: " << outcome.GetError().GetMessage() << std::endl;
    return false;
}
</syntaxhighlight>
<br><br>
== Lambda関数の一覧の取得 ==
アカウント内に存在するLambda関数の一覧を取得する。<br>
関数の基本情報 (ランタイム、メモリ、タイムアウト等) も同時に取得することができる。<br>
<br>
<syntaxhighlight lang="c++">
#include <aws/lambda/LambdaClient.h>
#include <aws/lambda/model/ListFunctionsRequest.h>
// Aws::Lambda::Model::ListFunctionsRequest
// Lambda関数一覧取得リクエストを表すクラス
// オプションで最大取得数 (MaxItems) や ページネーショントークン (Marker) を設定できる
Aws::Lambda::Model::ListFunctionsRequest request;
// ListFunctions()
// アカウント内のLambda関数一覧を取得するメソッド
// 指定したリージョン内の全ての関数情報を返す
auto outcome = m_lambdaClient->ListFunctions(request);
// IsSuccess() : 呼び出しが成功したかをチェック
if (outcome.IsSuccess()) {
    // GetResult() - 成功時の結果オブジェクトを取得
    const auto& result = outcome.GetResult();
    // GetFunctions()
    // Lambda関数設定のベクトル (std::vector) を返す
    // 各要素はFunctionConfigurationオブジェクト (個々のLambda関数の設定情報)
    const auto& functions = result.GetFunctions();
    // 各関数の情報を取得
    for (const auto& func : functions) {
      // GetFunctionName()
      // Lambda関数の名前を取得
      // 例 : "my-function", "data-processor", "api-handler"
      std::string functionName = func.GetFunctionName();
      // GetHandler()
      // Lambda関数のハンドラを取得
      // ハンドラは関数のエントリーポイントを指定する
      // 例 : "index.handler" (Node.js), "lambda_function.lambda_handler" (Python)
      std::string handler = func.GetHandler();
      // GetRuntime()
      // Lambda関数のランタイム環境を列挙型で取得
      // 例 : Python3_9, nodejs18_x, java17, dotnet6, go1_x, ruby3_2
      Aws::Lambda::Model::Runtime runtime = func.GetRuntime();
      // RuntimeMapper::GetNameForRuntime()
      // Runtime列挙型を文字列表現に変換するユーティリティメソッド
      // 例 : Runtime::Python3_9 → "python3.9"
      std::string runtimeName = Aws::Lambda::Model::RuntimeMapper::GetNameForRuntime(runtime);
      // GetMemorySize()
      // Lambda関数に割り当てられたメモリサイズ (MB単位) を取得
      // 設定可能範囲 : 128[MB]~10,240[MB] (10[GB])
      // メモリサイズに比例してCPUパワーも増加する
      int memorySize = func.GetMemorySize();
      // GetTimeout()
      // Lambda関数のタイムアウト時間 (秒単位) を取得
      // 設定可能範囲: 1秒~900秒 (15分)
      // この時間を超えると関数の実行が強制終了される
      int timeout = func.GetTimeout();
      // GetLastModified()
      // 関数が最後に更新された日時をISO 8601形式で取得
      // 例 : "2024-01-15T10:30:45.123+0000"
      std::string lastModified = func.GetLastModified();
      // GetFunctionArn()
      // Lambda関数のAmazon Resource Name (ARN) を取得
      // ARNは関数を一意に識別するグローバル識別子
      // 例 : "arn:aws:lambda:us-east-1:123456789012:function:my-function"
      std::string functionArn = func.GetFunctionArn();
      // GetDescription()
      // Lambda関数の説明文を取得
      // コンソールやCLIで設定した関数の説明を返す
      std::string description = func.GetDescription();
      // その他にも取得可能な情報:
      // - GetCodeSize()    : 関数コードのサイズ (バイト単位)
      // - GetRole()        : 関数に関連付けられたIAMロールのARN
      // - GetVersion()    : 関数のバージョン番号
      // - GetLayers()      : 関数にアタッチされたレイヤーの情報
      // - GetEnvironment() : 環境変数の設定
    }
    return true;
}
else {
    // GetError() - 失敗時のエラー情報を取得
    std::cerr << "✗ 取得失敗: " << outcome.GetError().GetMessage() << std::endl;
    return false;
}
</syntaxhighlight>
<br><br>
== エラーハンドリング ==
全ての操作はOutcomeオブジェクトを返すため、必ず <code>IsSuccess</code> メソッドで確認する。<br>
<br>
<syntaxhighlight lang="c++">
auto outcome = m_lambdaClient->Invoke(request);
// 必ず成功 / 失敗を確認
if (!outcome.IsSuccess()) {
    // GetError() : エラー情報オブジェクトを取得
    auto error = outcome.GetError();
    // GetErrorType() : エラーの種類を列挙型で取得
    // 例 : INVALID_PARAMETER_VALUE, RESOURCE_NOT_FOUND, ACCESS_DENIED
    std::cerr << "エラーコード: " << error.GetErrorType() << std::endl;
    // GetMessage() : エラーの詳細メッセージを取得
    // ユーザーに表示可能な分かりやすいエラー説明
    std::cerr << "メッセージ: " << error.GetMessage() << std::endl;
    // GetExceptionName() : AWS APIが返した例外の名前を取得
    // 例 : "ResourceNotFoundException", "InvalidParameterValueException"
    std::cerr << "例外名: " << error.GetExceptionName() << std::endl;
}
  </syntaxhighlight>
  </syntaxhighlight>
<br><br>
<br><br>