AWS CodeBuild を使用して複数の AWS アカウント間で AWS コマンドラインインターフェイス (AWS CLI) コマンドを実行したいと考えています。
解決策
注: AWS CLI コマンドの実行時にエラーが発生する場合は、「AWS CLI でのエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
以下の解決策では、アカウント A の CodeBuild プロジェクトを設定して、アカウント B で AWS CLI コマンドを実行します。
前提条件: アカウント A でビルドプロジェクトを作成します。
アカウント B に IAM ロールを作成して AWS CLI コマンドを実行する
次の手順を実行します。
- アカウント B で AWS Identity and Access Management (IAM) コンソールを開きます。
- ナビゲーションペインで [ロール] を選択し、[ロールを作成] を選択します。
- [AWS アカウント] ロールタイプを選択します。
- [AWS アカウント] セクションで、[別の AWS アカウント] を選択します。
- [アカウント ID] に、アカウント A のアカウント ID を入力します。
- [次へ] をクリックします。
- アカウント B で AWS CLI コマンドを実行するアクセス許可を持つポリシーを選択します。
- [次へ] をクリックします。
- [ロール名] フィールドに、ロールの名前を入力します。
- [ロールの作成] を選択します。
- IAM ロールの Amazon リソースネーム (ARN) をメモします。
IAM ポリシーを CodeBuild サービスロールにアタッチしてロールを引き受ける
次の手順を実行します。
- アカウント A で、CodeBuild コンソールを開きます。
- ナビゲーションペインで、[ビルドプロジェクト] を選択します。
- クロスアカウントアクションを実行するビルドプロジェクトを選択します。
- CodeBuild プロジェクトで、[プロジェクト詳細] タブを選択します。
- [環境] セクションで、[サービスロール] ARN を選択します。
- 新しい IAM コンソールウィンドウで、[アクセス許可を追加] を選択し、[インラインポリシーを追加] を選択します。
- JSON タブで、次のポリシーを入力します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountAccess",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "ACCOUNT_B_ROLE_ARN"
}
]
}
注: ACCOUNT_B_ROLE_ARN を IAM ロールの ARN に置き換えてください。
- [次へ] をクリックします。
- [ポリシー名] フィールドに、ポリシーの名前を入力します。
- [ポリシーを作成] を選択します。
CodeBuild プロジェクトの buildspec を修正する
buildspec ファイルが CodeBuild プロジェクトにある場合は、次の手順を実行します。
- CodeBuild コンソールを開きます。
- ナビゲーションペインで、[ビルドプロジェクト] を選択します。
- 対象のビルドプロジェクトを選択し、[編集] を選択します。
- [Buildspec] セクションで、assume-role AWS CLI コマンドとクロスアカウントコマンドを次の順序で追加します。
- CREDS=$(aws sts assume-role \
--role-arn $ACCOUNT_B_ROLE_ARN \
--role-session-name "session")
- export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId')
- export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey')
- export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken')
注: ACCOUNT_B_ROLE_ARN を IAM ロールの ARN に置き換えてください。buildspec ファイルがソースコードにある場合は、buildspec ファイルのクロスアカウントコマンドの前に assume-role AWS CLI コマンドを追加します。
- [プロジェクトを更新] を選択します。
アカウント B で AWS CLI コマンドを実行するには、assume-role コマンドと export コマンドの後に CLI コマンドを実行します。
以前の CodeBuild サービスロールのアクセス許可に戻すには、次の unset コマンドを実行します。
- unset AWS_ACCESS_KEY_ID
- unset AWS_SECRET_ACCESS_KEY
- unset AWS_SESSION_TOKEN