翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Step Functions と Lambda プロキシ関数を使用して AWS アカウント間で CodeBuild プロジェクトを起動する
Amazon Web Services、Richard Milner-Watts および Amit Anjarlekar
概要
このパターンは、AWS Step Functions と AWS Lambda プロキシ関数を使用して複数の AWS アカウント間で AWS CodeBuild プロジェクトを非同期で起動する方法を示しています。パターンのサンプル Step Functions ステートマシンを使用して、CodeBuild プロジェクトの成功をテストできます。
CodeBuild は、フルマネージドのランタイム環境から AWS コマンドラインインターフェイス (AWS CLI) を使用して運用タスクを起動するのに役立ちます。環境変数をオーバーライドすることで、ランタイムにおける CodeBuild プロジェクトの動作を変更できます。また、CodeBuild を使用してワークフローを管理できます。詳細については、AWS ワークショップウェブサイトの「サービスカタログツール」と、AWS データベースブログの「AWS CodeBuild と Amazon EventBridge を使用して Amazon RDS for PostgreSQL のジョブをスケジュールする」を参照してください。
前提条件と制限
前提条件
制限事項
アーキテクチャ
このパターンが構築するアーキテクチャを次の図に示します。
この図表は、次のワークフローを示しています:
Step Functions ステートマシンは、指定された入力マップを解析し、定義したアカウント、リージョン、プロジェクトごとに Lambda プロキシ関数 (codebuild-proxy-lambda) を呼び出します。
Lambda プロキシ関数は、AWS Security Token Service (AWS STS) を使用して、ターゲットアカウントで IAM ポリシー (codebuild-proxy-policy) に関連付けられている IAM プロキシロール (codebuild-proxy-role) を引き受けます。
引き受けたロールを使用して、Lambda 関数は CodeBuild プロジェクトを起動し、CodeBuild ジョブ ID を返します。Step Functions ステートマシンは、成功または失敗のステータスを受け取るまでループし、CodeBuild ジョブをポーリングします。
ステートマシンロジックを次の図に示します。
テクノロジースタック
AWS CloudFormation
CodeBuild
IAM
Lambda
ステップ関数
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は、AWS Lambda関数と他のAWS サービスを組み合わせてビジネスクリティカルなアプリケーションを構築できるサーバーレスオーケストレーションサービスです。
AWS X-Ray は、アプリケーションで処理するリクエストに関するデータを収集するのに役立ち、さらにデータの表示、フィルタリング、インサイトによって問題や機会を特定して最適化するために使用できるツールを提供します。
Code
このパターンのサンプルコードは、GitHub クロスアカウント CodeBuild プロキシリポジトリにあります。このパターンでは、AWS Lambda Powertools for Python ライブラリを使用してロギング機能とトレース機能を提供しています。このライブラリとそのユーティリティの詳細については、「Powertools for AWS Lambda (Python)」を参照してください。
ベストプラクティス
ジョブステータスのポーリングリクエストを最小限に抑えるために、Step Function ステートマシンの待機時間の値を調整します。CodeBuild プロジェクトの予想される実行時間を使用します。
Step Functions のマップの MaxConcurrency プロパティを調整して、並行して実行できる CodeBuild プロジェクトの数を制御します。
必要に応じて、サンプルコードを確認して本番稼働への準備状況を確認します。ソリューションによってログに記録される可能性のあるデータと、デフォルトの Amazon CloudWatch 暗号化で十分かどうかを検討します。
エピック
| タスク | 説明 | 必要なスキル |
|---|
AWS アカウント ID を記録する。 | アカウント間のアクセスを設定するには、AWS アカウント ID が必要です。 ソースアカウントとターゲットアカウントの AWS アカウント ID を記録します。詳細については、IAM ドキュメントの「 アカウント ID の検索」を参照してください。 | AWS DevOps |
AWS CloudFormation のテンプレートをダウンロードする。 | このパターンの sample_target_codebuild_template.yamlAWS CloudFormation テンプレートを GitHub リポジトリからダウンロードします。 このパターンの codebuild_lambda_proxy_template.yamlAWS CloudFormation テンプレートを GitHub リポジトリからダウンロードします。
AWS CloudFormation テンプレートでは、<SourceAccountId> はソースアカウントの AWS アカウント ID で、<TargetAccountId> はターゲットアカウントの AWS アカウント ID です。 | AWS DevOps |
AWS CloudFormation スタックを設定しデプロイします。 | ソースアカウントの AWS マネジメントコンソールにサインインし、AWS CloudFormation コンソールを開いて、[スタック] を選択します。 [スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。 [テンプレートソース] で、[テンプレートファイルのアップロード] を選択します。 [テンプレートファイルのアップロード] で [ファイル] を選択し、ダウンロードしたファイルcodebuild_lambda_proxy_template.yamlを選択します。[次へ] を選択します。 [スタック名] にスタックの名前 (例: codebuild-lambda-proxy) を入力します。 crossAccountTargetRoleArn パラメータをお使いの <TargetAccountId> (例えば <arn:aws:iam::123456789012:role/proxy-lambda-codebuild-role>) に置き換えます。targetCodeBuildProject パラメータのデフォルト値を更新する必要はありません。
[次へ] を選択し、デフォルトのスタック作成オプションを許可してから、[次へ] を選択します。 [AWS CloudFormation によって、カスタム名の IAM リソースが作成される場合があることを承認します] チェックボックスを選択した後、[スタックの作成] を選択します。
ターゲットアカウントにリソースを作成する前に、プロキシ Lambda 関数用の AWS CloudFormation スタックを作成する必要があります。ターゲットアカウントで信頼ポリシーを作成すると、IAM ロールはロール名から内部識別子に変換されます。これが、IAM ロールが既に存在している必要がある理由です。 | AWS DevOps |
プロキシ関数とステートマシンが作成されていることを確認します。 | AWS CloudFormation スタックが CREATE_COMPLETE ステータスになるまで待ちます。この所要時間は 1 分以内となります。 AWS Lambda コンソールを開き、[関数] を選択し、次に lambda-proxy-ProxyLambda-<GUID> 関数を選択します。 AWS Step Functions コンソールを開き、ステートマシンを選択し、sample-crossaccount-codebuild-state-machine ステートマシンを検索します。
| AWS DevOps |
| タスク | 説明 | 必要なスキル |
|---|
AWS CloudFormation スタックを設定しデプロイします。 | ターゲットアカウントの AWS マネジメントコンソールにサインインし、AWS CloudFormation コンソールを開いて、[スタック] を選択します。 [スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。 [テンプレートソース] で、[テンプレートファイルのアップロード] を選択します。 [テンプレートファイルのアップロード] で [ファイルの選択] を選択し、sample_target_codebuild_template.yaml ファイルを選択します。[次へ] を選択します。 [スタック名] にスタックの名前 (例: sample-codebuild-stack) を入力します。 crossAccountSourceRoleArn パラメータをお使いの <SourceAccountId> (例えば <arn:aws:iam::123456789012:role/codebuild-proxy-lambda-role>) に置き換えます。
[次へ] を選択し、デフォルトのスタック作成オプションを許可してから、[次へ] を選択します。 [AWS CloudFormation によって、カスタム名の IAM リソースが作成される場合があることを承認します] チェックボックスを選択した後、[スタックの作成] を選択します。
| AWS DevOps |
サンプル CodeBuild プロジェクトが作成されていることを確認します。 | AWS CloudFormation スタックが CREATE_COMPLETE ステータスになるまで待ちます。この所要時間は 1 分以内となります。 AWS CodeBuild コンソールを開き、sample-codebuild-project プロジェクトを検索します。
| AWS DevOps |
| タスク | 説明 | 必要なスキル |
|---|
ステートマシンを起動します。 | ソースアカウントの AWS マネジメントコンソールにサインインし、AWS Step Functions コンソールを開いて、[ステートマシン] を選択します。 sample-crossaccount-codebuild-state-machine ステートマシンを選択し、次に[実行開始] を選択します。
入力エディタで、次の JSON を入力し、<TargetAccountID> を CodeBuild プロジェクトを含むアカウントの AWS アカウント ID に置き換えます。 {
"crossAccountTargetRoleArns": [
{
"arn": "arn:aws:iam::<TargetAccountID>:role/proxy-lambda-codebuild-role",
"region": "eu-west-1",
"codeBuildProject": "sample-codebuild-project",
"SampleValue1": "Value1",
"SampleValue2": "Value2"
}
]
}
キーと値のペアは、ソースアカウントの関数からターゲットアカウントの CodeBuild プロジェクトに環境変数として渡されます。 [実行のスタート] を選択します。 ステートマシンページの [詳細] タブで、[実行ステータス] が [成功] に設定されているかどうかを確認します。これで、ステートマシンの実行が確認できました。注: ステートマシンが [成功] ステータスになるまで約 30 秒かかることがあります。 ステートマシンのステップの出力と入力を確認するには、[実行イベント履歴] セクションでそのステップを展開します。例えば、「Lambda - CodeBuild プロキシ – 開始」ステップを展開します。出力には、オーバーライドされた環境変数、元のペイロード、および CodeBuild ジョブ ID の詳細が含まれます。
| AWS DevOps |
環境変数を検証します。 | ターゲットアカウントの AWS マネジメントコンソールにサインインします。 AWS CodeBuild コンソールを開き、[ビルド] を展開して [プロジェクトのビルド] を選択します。 sample-codebuild-project プロジェクトを選択し、[詳細の表示] を選択します。
[ビルド履歴] タブでプロジェクトの最新のビルドを選択し、[ログの表示] を選択します。 ログ出力で、STDOUT に出力される環境変数が Step Functions サンプルステートマシンの環境変数と一致することを確認します。
| AWS DevOps |
トラブルシューティング
| 問題 | ソリューション |
|---|
Step Functions の実行には予想よりも時間がかかります。 | Step Function ステートマシンのマップの MaxConcurrency プロパティを調整して、並行して実行できる CodeBuild プロジェクトの数を制御します。 |
CodeBuild ジョブの実行には予想よりも時間がかかります。 | ジョブステータスのポーリングリクエストを最小限に抑えるために、Step Functions ステートマシンの待機時間の値を調整します。CodeBuild プロジェクトの予想される実行時間を使用します。 CodeBuild が使用するのに適切なツールであるかどうかを検討してください。例えば、CodeBuild ジョブの初期化に必要な時間は、AWS Lambda よりも大幅に長くなる可能性があります。高いスループットと迅速な完了時間が求められる場合は、ビジネスロジックを AWS Lambda に移行し、ファンアウトアーキテクチャを使用することを検討してください。
|