CodePipeline と既定 ACL を使用して、別のアカウントの Amazon S3 にアーティファクトをデプロイする方法を教えてください。
最終更新日: 2020 年 6 月 24 日
既定の アクセスコントロールリスト (ACL) と、S3 デプロイアクションプロバイダーで AWS CodePipeline を使用して、別のアカウントの Amazon Simple Storage Service (Amazon S3) にアーティファクトをデプロイしたいと考えています。
簡単な説明
次の解決方法は、以下を前提とするシナリオの例に基づいています。
- 開発用 (dev) アカウントと本稼働 (prod) アカウントの 2 つのアカウントがあります。
- 開発アカウントの入力バケットは codepipeline-input-bucket (バージョニングが有効になっている) と呼ばれます。
- 開発アカウントのデフォルトのアーティファクトバケットは、codepipeline-us-east-1-0123456789 と呼ばれます。
- 本稼働アカウントの出力バケットは codepipeline-output-bucket と呼ばれます。
- 開発アカウントから本稼働アカウントの S3 バケットにアーティファクトをデプロイしています。
- 既定 ACL を使用して、本稼働アカウントのバケット所有者に開発アカウントが所有するオブジェクトへのアクセスを提供します。アーティファクトをデプロイし、本稼働アカウントをオブジェクト所有者として設定するには、「CodePipeline を使用して、別のアカウントの Amazon S3 にアーティファクトをデプロイする方法を教えてください」を参照してください。
解決方法
開発アカウントで CodePipeline を作成する
1. CodePipeline コンソールを開き、[パイプラインの作成] を選択します。
2. [パイプライン名] に「crossaccountdeploy」と入力します。
注意: 「crossaccountdeploy」 をパイプラインの名前に置き換えます。
[ロール名] テキストボックスには、サービスロール名「AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy」が自動的に入力されます。既存のサービスロールを選択することもできます。
3. [詳細設定] セクションを展開します。
4. [アーティファクトストア] の場合は、[デフォルトの場所] を選択します。
注意: シナリオで必要な場合は、カスタムの場所を選択できます。
5. [暗号化キー] で、[デフォルトの AWS マネージド型キー] を選択します。
6. [次へ] を選択します。
7. [ソースステージの追加] ページの [ソースプロバイダー] で、[Amazon S3] を選択します。
8. [バケット] に、[codepipeline-input-bucket] と入力します。
注意: codepipeline-input-bucket を、入力バケットの名前に置き換えます。
重要: CodePipeline を使用するには、入力バケットでバージョニングが有効になっている必要があります。
9. [S3 オブジェクトキー] に、「sample-website.zip」と入力します。
重要: 独自のウェブサイトの代わりにサンプルの AWS ウェブサイトを使用するには、「チュートリアル: デプロイプロバイダーとして Amazon S3 を使用するパイプラインを作成する」を参照してください。次に、[1: 静的ウェブサイトファイルを Amazon S3 にデプロイする] セクションの [前提条件] で、「静的ウェブサイトのサンプル」を検索します。
10. [変更検出オプション] で、[Amazon CloudWatch Events (推奨)] を選択します。
11. [次へ] を選択します。
12. [ビルドステージの追加] ページで、[ビルドステージをスキップ]、[スキップ] を選択します。
13. [デプロイステージの追加] ページの [デプロイプロバイダー] で、[Amazon S3] を選択します。
14. [リージョン] で、[米国東部 (バージニア北部)] を選択します。
重要: 米国東部 (バージニア北部) を出力バケットの AWS リージョンに置き換えます。
15. [バケット] に、製品バケットの名前 「codepipeline-output-bucket」を入力します。
注意: 「codepipeline-input-bucket」を、出力バケットの名前に置き換えます。
16. [デプロイする前にファイルを抽出する] チェックボックスをオンにします。
注意: 必要に応じて、[デプロイパス] にパスを入力します。
17. [追加設定] を展開します。
18. [既定 ACL] では、[bucket-owner-full-control] を選択します。
注意: bucket-owner-full-control は、ターゲットの本稼働アカウントのバケット所有者に、開発アカウントがデプロイおよび所有するオブジェクトへのフルアクセスを付与します。詳細については、「既定 ACL」を参照してください。
19. [次へ] を選択します。
20. [パイプラインを作成] をクリックします。
これで、パイプラインはトリガーされますが、ソースステージは失敗します。次のエラーが表示されます。
The object with key 'sample-website.zip' does not exist.
[サンプルウェブサイトを入力バケットにアップロードする] セクションには、後からこのエラーを解決する方法が示されています。
CodePipeline サービスロールを AWS Identity and Access Management (IAM) ポリシーで設定し、本稼働アカウントの出力バケットに S3 アクセスを追加する
1. 開発アカウントで IAM コンソールを開きます。
2. ナビゲーションペインで、[ポリシー] をクリックしてから [ポリシーの作成] をクリックします。
3. [JSON] タブを選択して、JSON エディタで以下のポリシーを入力します。
{
"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"
}
]
}
注意: 「codepipeline-input-bucket」を、出力バケットの名前に置き換えます。
4. [ポリシーの確認] をクリックします。
5. [名前] に「prodbucketaccess」と入力します。
注意: prodbucketaccess を独自のポリシー名に置き換えます。
6. [ポリシーの作成] を選択します。
7. ナビゲーションペインで、[ロール] を選択します。
8. ロールのリストから、[AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy] を選択します。これは、CodePipeline で使用するサービスロールです。
注意: 該当する場合、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy を独自のサービスロールに置き換えます。
9. [ポリシーをアタッチ] を選択します。
10. 前に作成した [prodbucketaccess] ポリシーを選択し、 [ポリシーのアタッチ] を選択します。
CodePipeline は、本稼働アカウントの出力バケットにアクセスできるようになりました。
開発アカウントからのアクセスを許可するように 本稼働アカウントで出力バケットを設定する
1. 本稼働アカウントで Amazon S3 コンソールを開きます。
2. [バケット名] 一覧で、[codepipeline-output-bucket] を選択します。
注意: 「codepipeline-input-bucket」を、出力バケットの名前に置き換えます。
3. [Permissions] を選択してから、[Bucket Policy] を選択します。
4. テキストエディタで、次のポリシーを入力します。
{
"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"
}
]
}
注意: dev-account-id を開発環境のアカウント ID に置き換えます。codepipeline-output-bucket を出力バケット名に置き換えます。
5. [保存] をクリックします。
サンプルウェブサイトを入力バケットにアップロードする
1. 開発アカウントで Amazon S3 コンソールを開きます。
2. [バケット名] 一覧で、codepipeline-input-bucket を選択します。
注意: codepipeline-input-bucket を、入力バケットの名前に置き換えます。
3. [アップロード] を選択し、[ファイルの追加] を選択します。
4. 前にダウンロードした sample-website.zip ファイルを選択します。
5. [アップロード] をクリックします。
これで、CodePipeline がトリガーされ、以下の状況が発生します。
1. ソースアクションは、codepipeline-input-bucket から sample-website.zip を選択し、codepipeline-us-east-1-0123456789 アーティファクトバケット内に zip ファイルをソースアーティファクトとして配置します。
2. デプロイアクションでは、CodePipeline サービスロール AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy がそのアクセス権を使用して 本稼働アカウントの codepipeline-output-bucket にデプロイし、既定 ACL bucket-owner-full-controlを適用します。
開発アカウントは codepipeline-output-bucket で抽出されたオブジェクトの所有者になりましたが、本稼働アカウントのバケット所有者も、デプロイされたアーティファクトへのフルアクセス権を持ちます。