Amazon S3 デプロイアクションプロバイダーと既定アクセスコントロールリスト (ACL) を持つ AWS CodePipeline を使用して、別のアカウントの Amazon Simple Storage Service (Amazon S3) バケットにアーティファクトをデプロイしたいと考えています。
解決策
注: 以下の手順例では、次のことを前提としています。
- あなたは、次の 2 つの AWS アカウントを持っています。 開発アカウントと本番アカウント。
- 開発アカウントの入力バケットは、codepipeline-input-bucket と呼ばれます (バージョン管理が有効になっています)。
- 開発アカウントのデフォルトのアーティファクトバケットは、codepipeline-us-east-1-0123456789 と呼ばれます。
- 本番アカウントの出力バケットは、codepipeline-output-bucket と呼ばれます。
- 開発アカウントから本番アカウントの S3 バケットにアーティファクトをデプロイしています。
- 既定 ACL を使用して、本番アカウントのバケット所有者に、開発アカウントが所有するオブジェクトへのアクセス許可を付与しています。
注: アーティファクトをデプロイし、本番アカウントをオブジェクト所有者として設定するには、「CodePipeline を使用して別のアカウントの Amazon S3にアーティファクトをデプロイする方法」を参照してください。
開発アカウントで CodePipeline を作成する
1. CodePipeline コンソールを開きます。次に、[パイプラインを作成] を選択します。
2. [パイプライン名] に、パイプラインの名前を入力します。例: crossaccountdeploy。
注: [ロール名] テキストボックスには、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy というサービスロール名が自動的に入力されます。既存のサービスロールをもう 1 つ選択することもできます。
3. [詳細設定] セクションを展開します。
4. [アーティファクトストア] には、[デフォルトの場所] を選択します。
注: ユースケースで必要な場合は、[カスタムロケーション] を選択できます。
5. [暗号化キー] には、[デフォルト AWS 管理キー] を選択します。
6.[次へ] をクリックします。
7. [ソースステージの追加] ページの [ソースプロバイダー] で、**[Amazon S3] **を選択します。
8. **[バケット] **に、開発入力 S3 バケットの名前を入力します。例: codepipeline-input-bucket。
重要: CodePipeline と連携するには、入力バケットのバージョニングが有効になっている必要があります。
9. [S3 オブジェクトキー] に sample-website.zip と入力します。
重要: 独自のウェブサイトではなく、AWS ウェブサイトの例を使用するには、「チュートリアル: Amazon S3 をデプロイプロバイダーとして使用するパイプラインを作成する」を参照してください。次に、前提条件にある "sample static website" を検索します (1: 静的ウェブサイトファイルを Amazon S3 セクションにデプロイするセクション)。
10. [変更検出オプション] に [Amazon CloudWatch イベント (推奨)] を選択します。
11.[次へ] をクリックします。
12. [ビルドステージの追加] ページで [ビルドステージをスキップ] を選択します。次に、[スキップ] を選択します。
13. [デプロイステージの追加] ページの [デプロイプロバイダー] で、[Amazon S3] を選択します。
14. [リージョン] では、出力 S3 バケットがある AWS リージョンを選択します。例: 米国東部 (バージニア北部)
15. [バケット] に、本番出力の S3 バケットの名前を入力します。例: codepipeline-output-bucket。
16. [デプロイ前にファイルを抽出] にチェックを入れます。
注: 必要に応じて、[デプロイパス] にパスを入力します。
17. [その他の設定] を選択します。
18. [既定 ACL] で [bucket-owner-full-control] を選択します。
注: **bucket-owner-full-control ** は、本番アカウントのバケット所有者に、開発アカウントによってデプロイおよび所有されているオブジェクトへのフルアクセスを付与します。詳細については、「既定 ACL」を参照してください。
19. [次へ] をクリックします。
20. [パイプラインを作成] を選択します。パイプラインは実行されますが、ソースステージは失敗します。次のエラーが表示されます。 「キー 'sample-website.zip' のオブジェクトは存在しません」
この記事の「入力バケットにサンプルウェブサイトをアップロードする」セクションで、このエラーの解決方法について説明します。
本番アカウントの出力バケットに S3 アクセスを追加する AWS Identity and Access Management (IAM) ポリシーを使用して CodePipeline サービスロールを設定する
1. 開発アカウントで IAM コンソールを開きます。
2. ナビゲーションペインで、[ポリシー] を選択します。その後、[ポリシーを作成] を選択します。
3. [JSON] タブを選択します。次に、JSON エディターに次のポリシーを入力します。
重要: codepipeline-output-bucket を本番出力 S3 バケット名に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "arn:aws:s3:::codepipeline-output-bucket/*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::codepipeline-output-bucket"
}
]
}
4. **[ポリシーの確認]**を選択します。
5. [名前] にポリシーの名前を入力します。例: prodbucketaccess。
6. [ポリシーを作成] を選択します。
7. ナビゲーションペインで、[ロール] を選択します。
8. ロールのリストから、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy を選択します。これは CodePipeline のサービスロールです。
注: ユースケースに必要な場合は、独自のサービスロールを使用できます。
9. [ポリシーをアタッチ] を選択します。
10. 作成したポリシー (prodbucketaccess) を選択します。次に、[ポリシーをアタッチ] を選択し、CodePipeline に本番出力 S3 バケットへのアクセス許可を付与します。
開発アカウントからのアクセスを許可するように本番アカウントの出力バケットを設定する
1. 本番アカウントで Amazon S3 コンソールを開きます。
2. [バケット名リスト] で、本番出力の S3 バケットを選択します。例: codepipeline-output-bucket。
3. [アクセス許可] を選択します。次に、[バケットポリシー] を選択します。
4. テキストエディタで次のポリシーを入力し、[保存] を選択します。
重要: dev-account-id は、開発環境の AWS アカウント ID に置き換えます。codepipeline-output-bucket は、本番出力 S3 バケット名に置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::dev-account-id:root"
},
"Action": "s3:Put*",
"Resource": "arn:aws:s3:::codepipeline-output-bucket/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::dev-account-id:root"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::codepipeline-output-bucket"
}
]
}
ウェブサイトの例を入力バケットにアップロードする
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) がそのアクセス許可を使用して、本番環境の出力S3バケット (codepipeline-output-bucket) にデプロイします。デプロイアクションにより、既定 ACL の bucket-owner-full-control も適用されます。
注: 開発アカウントは、本番環境の出力 S3 バケット (codepipeline-output-bucket) 内の抽出されたオブジェクトの所有者となります。本番アカウントのバケット所有者も、デプロイされたアーティファクトへのフルアクセスを持っています。