Step Functions と Lambda プロキシ関数を使用してAWSアカウント間で CodeBuild プロジェクトを起動する - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Step Functions と Lambda プロキシ関数を使用してAWSアカウント間で CodeBuild プロジェクトを起動する

作成者: Richard Milner-Watts (AWS) と Amit Anjarlekar (AWS)

コードリポジトリ: Cross-Account CodeBuild Proxy

環境:本稼働

テクノロジー: DevOps、管理とガバナンス、オペレーション、サーバーレス

AWS サービス: AWS CodeBuild、AWSLambda、AWSStep Functions、AWSX-Ray、 AWS CloudFormation

[概要]

このパターンは、AWSStep Functions と AWS Lambda プロキシ関数を使用して、複数のAWSアカウントでAWS CodeBuild プロジェクトを非同期的に起動する方法を示しています。パターンのサンプル Step Functions ステートマシンを使用して、 CodeBuild プロジェクトの成功をテストできます。

CodeBuild は、フルマネージドランタイム環境から AWS コマンドラインインターフェイス (AWS CLI) を使用して運用タスクを起動するのに役立ちます。環境変数を上書きすることで、実行時に CodeBuild プロジェクトの動作を変更できます。さらに、 CodeBuild を使用してワークフローを管理できます。詳細については、AWS「ワークショップウェブサイト」の「サービスカタログツール」およびAWS「データベースブログ」の「Amazon RDS for PostgreSQL でのジョブのスケジュールAWS CodeBuild EventBridge」を参照してください。

前提条件と制限

前提条件

  • 2 つのアクティブなAWSアカウント: Step Functions を使用して Lambda プロキシ関数を呼び出すためのソースアカウントと、リモート CodeBuild サンプルプロジェクトを構築するためのターゲットアカウント

制約事項

  • このパターンを使用して、アーティファクトをアカウント間でコピーすることはできません。

アーキテクチャ

このパターンが構築するアーキテクチャを次の図に示します。

複数のAWSアカウントで CodeBuild プロジェクトを起動するアーキテクチャ図

この図表は、次のワークフローを示しています:

  1. Step Functions ステートマシンは、指定された入力マップを解析し、定義したアカウント、リージョン、プロジェクトごとに Lambda プロキシ関数 (codebuild-proxy-lambda) を呼び出します。

  2. Lambda プロキシ関数は、AWSSecurity Token Service (AWS STS) を使用して、ターゲットアカウントのIAMポリシー (codebuild-proxy-role) に関連付けられているIAMプロキシロール (codebuild-proxy-policy) を引き受けます。

  3. 引き受けたロールを使用して、Lambda 関数は CodeBuild プロジェクトを起動し、 CodeBuild ジョブ ID を返します。Step Functions は、マシンループをステートし、成功または失敗のステータスを受信するまで CodeBuild ジョブをポーリングします。

ステートマシンロジックを次の図に示します。

Step Functions ステートマシンのワークフロー

テクノロジースタック

  • AWS CloudFormation

  • CodeBuild

  • IAM

  • Lambda

  • Step Functions

  • X-Ray

ツール

  • AWS CloudFormation は、AWSリソースをセットアップし、迅速かつ一貫してプロビジョニングし、AWSアカウントとリージョン全体のライフサイクルを通じてリソースを管理するのに役立ちます。

  • AWS CloudFormation Designer には、 CloudFormation テンプレートの表示と編集に役立つ統合JSONエディタとYAMLエディタが用意されています。

  • AWS CodeBuild は、ソースコードのコンパイル、ユニットテストの実行、デプロイの準備が整ったアーティファクトの生成に役立つフルマネージドビルドサービスです。

  • AWS Identity and Access Management (IAM) は、誰が認証され、誰に使用を許可されているかを制御することで、AWSリソースへのアクセスを安全に管理します。

  • AWS Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードを実行するのに役立つコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS Step Functions は、Lambda AWS 関数とその他のサービスを組み合わせてビジネスクリティカルなアプリケーションを構築するのに役立つサーバーレスオーケストレーションAWSサービスです。

  • AWS X-Ray は、アプリケーションが処理するリクエストに関するデータを収集するのに役立ちます。また、そのデータを表示、フィルタリング、インサイトを取得して、最適化の問題や機会を特定できるツールも提供します。

コード

このパターンのサンプルコードは GitHub、クロスアカウント CodeBuild プロキシリポジトリで使用できます。このパターンでは、AWSLambda Powertools for Python ライブラリを使用してログ記録とトレース機能を提供します。このライブラリとそのユーティリティの詳細については、「Powertools for AWS Lambda (Python)」を参照してください。

ベストプラクティス

  1. Step Function ステートマシンの待機時間値を調整して、ジョブステータスのポーリングリクエストを最小限に抑えます。 CodeBuild プロジェクトで予想される実行時間を使用します。

  2. Step Functions でマップのMaxConcurrencyプロパティを調整して、並列に実行できる CodeBuild プロジェクトの数を制御します。

  3. 必要に応じて、サンプルコードを確認して本番稼働準備を整えます。ソリューションによってログに記録される可能性のあるデータと、デフォルトの Amazon CloudWatch 暗号化で十分かどうかを検討します。

エピック

タスク説明必要なスキル

AWS アカウント を記録しますIDs。

AWS アカウント間のアクセスを設定するには、 アカウントIDsが必要です。

ソースAWSアカウントとターゲットアカウントのアカウント ID を記録します。詳細については、IAMドキュメントのAWS「アカウント ID の検索」を参照してください。

AWS DevOps

AWS CloudFormation テンプレートをダウンロードします。

  1. このパターンのGitHub リポジトリからsample_target_codebuild_template.yamlAWS CloudFormation テンプレートをダウンロードします。

  2. このパターンのGitHub リポジトリからAWS CloudFormation テンプレートをダウンロードしますcodebuild_lambda_proxy_template.yaml

: AWS CloudFormation テンプレートでは、 <SourceAccountId>はソースAWSアカウントのアカウント ID であり、 <TargetAccountId>はターゲットアカウントのアカウント AWS ID です。

AWS DevOps

AWS CloudFormation スタックを作成してデプロイします。

  1. ソースアカウントのAWSマネジメントコンソールにサインインし、AWS CloudFormation コンソール を開き、スタック を選択します。

  2. [スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。

  3. [テンプレートソース] で、[テンプレートファイルのアップロード] を選択します。

  4. [テンプレートファイルのアップロード] で [ファイル] を選択し、ダウンロードしたファイルcodebuild_lambda_proxy_template.yamlを選択します。[Next (次へ)] を選択します。

  5. [スタック名] にスタックの名前 (例: codebuild-lambda-proxy) を入力します。

  6. crossAccountTargetRoleArn パラメータをお使いの <TargetAccountId> (たとえば <arn:aws:iam::123456789012:role/proxy-lambda-codebuild-role>) に置き換えます。: targetCodeBuildProject パラメータのデフォルト値を更新する必要はありません。

  7. [次へ] を選択し、デフォルトのスタック作成オプションを許可してから、[次へ] を選択します。

  8. カスタム名でIAMリソースを作成するAWS CloudFormation 可能性がある 確認応答チェックボックスをオンにし、スタックの作成 を選択します。

: ターゲットアカウントにリソースを作成する前に、プロキシ Lambda 関数のAWS CloudFormation スタックを作成する必要があります。ターゲットアカウントに信頼ポリシーを作成すると、IAMロールはロール名から内部識別子に変換されます。そのため、IAMロールはすでに存在している必要があります。

AWS DevOps

プロキシ関数とステートマシンが作成されていることを確認します。

  1. AWS CloudFormation スタックが CREATE_COMPLETEstatus に達するまで待ちます。この所要時間は 1 分以内となります。

  2. AWS Lambda コンソール を開き、関数 を選択し、lambda-proxy-ProxyLambda-<GUID>関数を検索します。

  3. AWS Step Functions コンソール を開き、ステートマシン を選択し、sample-crossaccount-codebuild-state-machineステートマシンを検索します。

AWS DevOps
タスク説明必要なスキル

AWS CloudFormation スタックを作成してデプロイします。

  1. ターゲットアカウントのAWSマネジメントコンソールにサインインし、AWS CloudFormation コンソール を開き、スタック を選択します。

  2. [スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。

  3. [テンプレートソース] で、[テンプレートファイルのアップロード] を選択します。

  4. [テンプレートファイルのアップロード] で [ファイルの選択] を選択し、sample_target_codebuild_template.yaml ファイルを選択します。[Next (次へ)] を選択します。

  5. [スタック名] にスタックの名前 (例: sample-codebuild-stack) を入力します。

  6. crossAccountSourceRoleArn パラメータをお使いの <SourceAccountId> (たとえば <arn:aws:iam::123456789012:role/codebuild-proxy-lambda-role>) に置き換えます。

  7. [次へ] を選択し、デフォルトのスタック作成オプションを許可してから、[次へ] を選択します。

  8. カスタム名でIAMリソースを作成AWS CloudFormation できる可能性がある I acknowledge チェックボックスを選択し、次に Create stack を選択します。

AWS DevOps

サンプル CodeBuild プロジェクトの作成を確認します。

  1. AWS CloudFormation スタックが CREATE_COMPLETE ステータスになるまで待ちます。この所要時間は 1 分以内となります。

  2. AWS CodeBuild コンソールを開き、sample-codebuild-projectプロジェクトを検索します。

AWS DevOps
タスク説明必要なスキル

ステートマシンを起動します。

  1. ソースアカウントのAWSマネジメントコンソールにサインインし、AWSStep Functions コンソール を開き、ステートマシン を選択します。

  2. sample-crossaccount-codebuild-state-machine ステートマシンを選択し、次に[実行開始] を選択します。

  3. 入力エディタで、次の を入力しJSON、 を CodeBuild プロジェクトを含むアカウントのアカウント AWS ID <TargetAccountID>に置き換えます。

    { "crossAccountTargetRoleArns": [ { "arn": "arn:aws:iam::<TargetAccountID>:role/proxy-lambda-codebuild-role", "region": "eu-west-1", "codeBuildProject": "sample-codebuild-project", "SampleValue1": "Value1", "SampleValue2": "Value2" } ] }

    : キーと値のペアは、ソースアカウントの 関数からターゲットアカウントの CodeBuild プロジェクトに環境変数として渡されます。

  4. [実行のスタート] を選択します。

  5. ステートマシンページの [詳細] タブで、[実行ステータス] が [成功] に設定されているかどうかを確認します。これで、ステートマシンの実行が確認できました。: ステートマシンが [成功] ステータスになるまで約 30 秒かかることがあります。

  6. ステートマシンのステップの出力と入力を確認するには、[実行イベント履歴] セクションでそのステップを展開します。例えば、Lambda - CodeBuild Proxy – Start ステップを展開します。出力には、オーバーライドされた環境変数、元のペイロード、 CodeBuild ジョブ ID の詳細が含まれます。

AWS DevOps

環境変数を検証します。

  1. ターゲットアカウントのAWSマネジメントコンソールにサインインします。

  2. AWS CodeBuild コンソール を開き、ビルド を展開してから、ビルドプロジェクト を選択します。

  3. sample-codebuild-projectプロジェクトを選択し、詳細の表示 を選択します。

  4. ビルド履歴タブで、プロジェクトの最新のビルドを選択し、ログの表示 を選択します。

  5. ログ出力で、Step Functions サンプルステートマシンの環境変数STDOUTと一致するように印刷された環境変数を確認します。

AWS DevOps

トラブルシューティング

問題ソリューション

Step Functions の実行に想定以上に時間がかかります。

Step Function ステートマシンのマップのMaxConcurrencyプロパティを調整して、並列に実行できる CodeBuild プロジェクトの数を制御します。

CodeBuild ジョブの実行に予想以上に時間がかかります。

  1. Step Functions ステートマシンの待機時間値を調整して、ジョブステータスのポーリングリクエストを最小限に抑えます。 CodeBuild プロジェクトで予想される実行時間を使用します。

  2. CodeBuild が使用する適切なツールであるかどうかを検討します。例えば、 CodeBuild ジョブの初期化に必要な時間は、AWSLambda よりも大幅に長くなります。高いスループットと高速完了時間が要件である場合は、ビジネスロジックを AWS Lambda に移行し、ファンアウトアーキテクチャを使用することを検討してください。