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

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

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

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

概要

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

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

前提条件と制限

前提条件

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

制約事項

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

アーキテクチャ

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

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

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

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

  2. Lambda プロキシ関数はAWS、Security Token Service (AWSSTS) を使用して、ターゲットアカウントの 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 デザイナー には、 CloudFormation テンプレートの表示と編集に役立つ統合JSONYAMLエディタが用意されています。

  • AWS CodeBuild は、フルマネージド型のビルドサービスであり、ソースコードのコンパイル、ユニットテストの実行、デプロイ可能なアーティファクトの生成に役立ちます。

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

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

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

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

コード

このパターンのサンプルコードは、 GitHubCross Account CodeBuild Proxy リポジトリにあります。このパターンでは、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 可能性があることを確認したチェックボックスを選択し、スタックの作成を選択します。

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 に移行し、ファンアウトアーキテクチャを使用することを検討してください。