Knowledge Center Monthly Newsletter - March 2025
Stay up to date with the latest from the Knowledge Center. See all new and updated Knowledge Center articles published in the last month and re:Post’s top contributors.
CodePipeline を使用してアーティファクトを別の AWS アカウントの Amazon S3 にデプロイする方法を教えてください。
アーティファクトを別のアカウントの Amazon Simple Storage Service (Amazon S3) バケットにデプロイしたいです。さらに、Amazon S3 デプロイアクションプロバイダで AWS CodePipeline を使用して、宛先アカウントをオブジェクト所有者に設定したいです。
解決策
注: 以下の手順例では、次のことを前提としています。
- 開発アカウントと本番アカウントの 2 つのアカウントがある。
- 開発アカウントの入力バケットには codepipeline-input-bucket という名前が付けられており、バージョニングが有効になっている。
- 開発アカウントのデフォルトのアーティファクトバケットの名前は、codepipeline-us-east-1-0123456789 である。
- 本番アカウントの出力バケットの名前は、codepipeline-output-bucket である。
- 開発アカウントから本番アカウントの S3 バケットにアーティファクトをデプロイします。
- アーティファクトをデプロイするために、本番アカウントで作成されたクロスアカウントロールを引き受けます。このロールにより、開発アカウントではなく、本番アカウントがオブジェクト所有者になります。本番アカウントのバケット所有者に、開発アカウントが所有するオブジェクトへのアクセスを許可するには、次の記事を参照してください。CodePipeline と既定 ACL を使用して、別の AWS アカウントの Amazon S3 にアーティファクトをデプロイする方法を教えてください。
開発アカウントの CodePipeline で使用する AWS KMS キーを作成する
重要: クロスアカウントデプロイには、AWS Key Management Service (AWS KMS) のカスタマーマネージドキーを使用する必要があります。キーが設定されていない場合、CodePipeline はデフォルトの暗号化でオブジェクトを暗号化しますが、宛先アカウントのロールでは復号できません。
1.開発アカウントで AWS KMS コンソールを開きます。
2.ナビゲーションペインで、[カスタマーマネージドキー] を選択します。
3.[キーを作成] を選択します。
4.[キータイプ] で [対称キー] を選択します。
5.[詳細オプション] を展開します。
6.[キーマテリアルオリジン] で [KMS] を選択します。[次へ] を選択します。
7.[エイリアス] に、キーのエイリアスを入力します。(s3deploykey など。)
8.[次へ] をクリックします。[キー管理アクセス許可の定義] ページが開きます。
9.[キー管理者] セクションで、キー管理者に AWS Identity and Access Management (IAM) ユーザーまたはロールを選択します。
10**[次へ]** を選択します。[キーの使用アクセス許可の定義] ページが開きます。
11.[他の AWS アカウント] セクションで、[別の AWS アカウントを追加] を選択します。
12.表示されたテキストボックスに、本番アカウントのアカウント ID を追加します。[次へ] を選択します。
注: [このアカウント] セクションで既存のサービスロールを選択することもできます。既存のサービスロールを選択する場合は、「開発アカウントの KMS 使用ポリシーを更新する」セクションの手順をスキップしてください。
13.キーポリシーを確認します。次に、[完了] を選択します。
開発アカウントで CodePipeline を作成する
1.CodePipeline コンソールを開きます。次に、[パイプラインを作成] を選択します。
2.[パイプライン名] に、パイプラインの名前を入力します。(crossaccountdeploy など。)
注: [ロール名] テキストボックスには、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy というサービスロール名が自動的に入力されます。KMS キーにアクセスできる別の既存のサービスロールを選択することもできます。
3.[詳細設定] セクションを展開します。
4.[アーティファクトストア] で [デフォルトの場所] を選択します。
注: ユースケースで必要な場合は、カスタムロケーションを選択することもできます。
5.[暗号化キー] で [カスタマーマネージドキー] を選択します。
6.KMS カスタマーマネージドキーの場合は、リストからキーのエイリアス (この例では s3deploykey) を選択し、[次へ] を選択します。 [ソースステージの追加] ページが開きます。
7.[ソースプロバイダー] で [Amazon S3] を選択します。
8.[バケット] に、開発入力 S3 バケットの名前を入力します。(codepipeline-input-bucket など。)
重要: CodePipeline と連携するには、入力バケットでバージョニングが有効になっている必要があります。
9.[S3 オブジェクトキー] に sample-website.zip と入力します。
重要: 独自のウェブサイトではなく、サンプルの AWS ウェブサイトを使用するには、「チュートリアル: Amazon S3 をデプロイプロバイダーとして使用するパイプラインを作成する」を参照してください。次に、前提条件 (**1: 静的ウェブサイトのファイルを Amazon S3 にデプロイする ** セクション) にある "sample static website" を検索します。
10.[変更検出オプション] には、[Amazon CloudWatch Events (推奨)] を選択します。[次へ] を選択します。
11.[ビルドステージの追加] ページで、[ビルドステージをスキップ] を選択します。次に、[スキップ] を選択します。
12.[デプロイステージの追加] ページで、[デプロイプロバイダー] に [Amazon S3] を選択します。
13.[リージョン] には、本番出力 S3 バケットがある AWS リージョンを選択します。例: 米国東部 (バージニア北部)
重要: 本番出力バケットのリージョンがパイプラインのリージョンと異なる場合は、次のことも確認する必要があります。
- AWS KMS マルチリージョンキーを複数のレプリカで使用している。
- 両方のリージョンのパイプラインにアーティファクトストアがある。
14.[バケット] に、本番出力 S3 バケットの名前を入力します。(codepipeline-output-bucket など。)
15.[デプロイ前にファイルを抽出] にチェックをつけます。
注: 必要に応じて、[デプロイパス] にパスを入力します。
16.[次へ] をクリックします。
17.[パイプラインを作成] を選択します。パイプラインが実行されますが、ソースステージは失敗します。次のエラーが表示されます。 "キー 'sample-website.zip' のあるオブジェクトは存在しません。"
この記事の「入力バケットにサンプルウェブサイトをアップロードする」セクションで、このエラーの解決方法について説明しています。
開発アカウントの KMS 使用ポリシーを更新する
重要: 既存の CodePipeline サービスロールを使用している場合は、このセクションをスキップしてください。
1.開発アカウントで AWS KMS コンソールを開きます。
2.キーのエイリアス (この例では s3deploykey) を選択します。
3.**[キーユーザー]セクションで、[追加]**を選択します。
4.検索ボックスに、サービスロール AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy を入力します。
5.[追加] を選択します。
本番アカウントでクロスアカウントロールを設定する
**本番環境の出力 S3 バケットに Amazon S3 アクセスアクセス許可を付与するロールの IAM ポリシーを作成する **
1.本番アカウントで IAM コンソールを開きます。
2.ナビゲーションペインで [ポリシー] を選択します。次に、[ポリシーを作成] を選択します。
3.[JSON] タブを選択します。次に、JSON エディタに次のポリシーを入力します。
重要: codepipeline-output-bucket は、本番出力の S3 バケット名に置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Put*" ], "Resource": [ "arn:aws:s3:::codepipeline-output-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-output-bucket" ] } ] }
4.**[ポリシーの確認]**を選択します。
5.[名前] にポリシーの名前を入力します。(outputbucketdeployaccess など。)
6.[ポリシーを作成] を選択します。
必要な KMS アクセス許可を付与するロールの IAM ポリシーを作成する
1.IAM コンソールで、[ポリシーの作成] を選択します。
2.[JSON] タブを選択します。次に、JSON エディタに次のポリシーを入力します。
注: 作成した KMS キーの ARN を置き換えます。codepipeline-us-east-1-0123456789 は、開発アカウント内のアーティファクトバケットの名前に置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:<dev-account-id>:key/<key id>" ] }, { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-1-0123456789/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-1-0123456789" ] } ] }
3.**[ポリシーの確認]**を選択します。
4.[名前] にポリシーの名前を入力します。(devkmss3access など。)
5.[ポリシーを作成] を選択します。
開発アカウントがアーティファクトをデプロイするために引き受けることができるクロスアカウントロールを作成する
1.本番アカウントで IAM コンソールを開きます。
2.ナビゲーションペインで、[ロール] を選択します。そして、[ロールを作成] を選択します。
3.[別の AWS アカウント] を選択します。
4.[アカウント ID] に、開発アカウントの AWS アカウント ID を入力します。
5.[次へ: アクセス許可] を選択します。
6.ポリシーのリストから、outputbucketdeployaccess およびdevkmss3access を選択します。
7. [次へ: タグ] を選択します。
8.(オプション) タグを追加し、[次へ: 確認] を選択します。
9.[ロール名] に prods3role と入力します。
10.[ロールを作成] を選択します。
11.ロールのリストから、prods3role を選択します。
12.[信頼関係] を選択します。次に、[信頼関係の編集] を選択します。
13.ポリシードキュメントエディタで、次のポリシーを入力します。
重要: dev-account-id は、お使いの開発アカウントの AWS アカウント IDに置き換えます。AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy は、パイプラインのサービスロール名に置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::<dev-account-id>:role/service-role/AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy" ] }, "Action": "sts:AssumeRole", "Condition": {} } ] }
14.**[信頼ポリシーの更新]**を選択します。
開発アカウントの CodePipeline アーティファクトバケット用のバケットポリシーを更新します。
1.開発アカウントで Amazon S3 コンソールを開きます。
2.[バケット名] リストで、開発アカウントにあるアーティファクトバケットの名前を選択します (この例では、codepipeline-us-east-1-0123456789)。
3.[アクセス許可]を選択します。次に、[バケットポリシー] を選択します。
4.テキストエディタで既存のポリシーを更新し、次のポリシーステートメントを含めます。
重要: 適切な JSON フォーマットに合わせるために、既存のステートメントの後にカンマを追加します。prod-account-id を本番アカウントの AWS アカウント ID に置き換えます。codepipeline-us-east-1-0123456789 をアーティファクトバケットの名前に置き換えます。
{ "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<prod-account-id>:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<prod-account-id>:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-1-0123456789" }
5.[保存] を選択します。
開発アカウントの CodePipeline サービスロールに、作成したクロスアカウントロールを引き受けられるようにするポリシーをアタッチします。
1.開発アカウントで IAM コンソールを開きます。
2.ナビゲーションペインで [ポリシー] を選択します。次に、[ポリシーを作成] を選択します。
3.[JSON] タブを選択します。次に、JSON エディタに次のポリシーを入力します。
重要: prod-account-id は、本番アカウントの AWS アカウント ID に置き換えます。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::<prod-account-id>:role/prods3role" ] } }
4. **[ポリシーの確認]**を選択します。
5.[名前] に assumeprods3role と入力します。
6.[ポリシーを作成] を選択します。
7.ナビゲーションペインで、[ロール] を選択します。次に、パイプライン用のサービスロールの名前を選択します (この例では、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy)。
8.[ポリシーをアタッチ] を選択します。次に、assumeprods3role を選択します。
9.[ポリシーをアタッチ] を選択します。
開発アカウントでクロスアカウントロールを使用するようにパイプラインを更新する
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用しているかどうかを確認してください。
1.次の AWS CLI コマンドを実行して、パイプライン定義を codepipeline.json という名前のファイルとして取得します。
重要: crossaccountdeploy は、お使いのパイプライン名に置き換えます。
aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json
2.codepipeline.json ファイルのデプロイアクションセクションに、クロスアカウント IAM ロール の ARN (roleArn) を追加します。詳細については、CodePipeline ユーザーガイドの「CodePipeline のパイプライン構造に関するリファレンス」を参照してください。
クロスアカウント IAM roleArn の例
"roleArn": "arn:aws:iam::your-prod-account id:role/prods3role",
クロスアカウント IAM ロール ARN を含むデプロイアクションの例
重要: prod-account-id は、本番アカウントの AWS アカウント ID に置き換えます。
{ "name": "Deploy", "actions": [ { "name": "Deploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "provider": "S3", "version": "1" }, "runOrder": 1, "configuration": { "BucketName": "codepipeline-output-bucket", "Extract": "true" }, "outputArtifacts": [], "inputArtifacts": [ { "name": "SourceArtifact" } ], "roleArn": "arn:aws:iam::<prod-account-id>:role/prods3role", "region": "us-east-1", "namespace": "DeployVariables" } ] }
3.codepipeline.json ファイルの末尾にあるメタデータセクションを削除します。
重要: メタデータセクションの前にあるカンマも削除する必要があります。
メタデータセクションの例
"metadata": { "pipelineArn": "arn:aws:codepipeline:us-east-1:<dev-account-id>:crossaccountdeploy", "created": 1587527378.629, "updated": 1587534327.983 }
4.次のコマンドを実行してパイプラインを更新します。
aws codepipeline update-pipeline --cli-input-json file://codepipeline.json
サンプルウェブサイトを入力バケットにアップロードする
1.開発アカウントで Amazon S3 コンソールを開きます。
2.[バケット名] リストで、開発入力 S3 バケットを選択します。(codepipeline-input-bucket など。)
3.[アップロード]を選択します。次に、[ファイルを追加] を選択します。
4.先ほどダウンロードした sample-website.zip ファイルを選択します。
5.[アップロード] を選択してパイプラインを実行します。パイプラインを実行すると、次のことが起こります。
- ソースアクションは、開発入力 S3 バケット (codepipeline-input-bucket) から sample-website.zip を選択します。次に、ソースアクションは zip ファイルをソースアーティファクトとして開発アカウントのアーティファクトバケット内に配置します (codepipeline-us-east-1-0123456789)。
- デプロイアクションでは、CodePipeline のサービスロール (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) が本番アカウントのクロスアカウントロール (prods3role) を引き受けます。
- CodePipeline はクロスアカウントロール (prods3role) を使用して開発アカウントの KMS キーとアーティファクトバケットにアクセスします。次に、CodePipeline は抽出されたファイルを本番アカウントの本番出力 S3 バケット (codepipeline-output-bucket) にデプロイします。
**注:**本番アカウントが、本番出力 S3 バケット (codepipeline-output-bucket) 内の抽出されたオブジェクトの所有者です。

関連するコンテンツ
- 質問済み 7年前lg...
- AWS公式更新しました 5ヶ月前