CodePipeline と既定 ACL を使用して、異なる AWS アカウントの Amazon S3 にアーティファクトをデプロイするにはどうすればよいですか?

最終更新日: 2022 年 1 月 5 日

別のアカウントの Amazon Simple Storage Service (Amazon S3) バケットにアーティファクトをデプロイしたいと考えています。Amazon S3 デプロイアクションプロバイダーと既定アクセスコントロールリスト (ACL) で AWS CodePipeline を使用してこれを実行する方法はありますか?

解決方法

注: 次の手順例では、以下を前提としています。

  • 開発アカウントと本番稼働用アカウントの 2 つの AWS アカウントがあります。
  • 開発アカウントの入力バケットは、codepipeline-input-bucket (バージョニングがアクティブ化されています) です。
  • 開発アカウントのデフォルトのアーティファクトバケットは、codepipeline-us-east-1-0123456789 です。
  • 本番稼働用アカウントの出力バケットは、codepipeline-output-bucket です。
  • 開発アカウントから本番稼働用アカウントの S3 バケットにアーティファクトをデプロイしようとしています。
  • 既定 ACL を使用して、本番稼働用アカウントのバケット所有者に開発アカウントが所有するオブジェクトへのアクセスを提供します。
    注: アーティファクトをデプロイし、本番稼働用アカウントをオブジェクト所有者として設定するには、CodePipeline を使用して、別のアカウントの Amazon S3 にアーティファクトをデプロイする方法を教えてくださいを参照してください。

開発アカウントで CodePipeline を作成する

1.    CodePipeline コンソールを開きます。その後、[Create pipeline] (パイプラインを作成) を選択します。

2.    [Pipeline name] (パイプライン名) で、パイプラインの名前を入力します。例: crossaccountdeploy

注: [Role name] (ロール名) テキストボックスには、サービスロール名 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy が自動的に入力されます。また、別の既存のサービスロールを選択することもできます。

3.    [詳細設定] セクションを展開します。

4.    [Artifact store] (アーティファクトストア) で、[Default location] (デフォルトの場所) を選択します。
注: ユースケースで必要な場合は、[Custom location] (カスタムの場所) を選択できます。

5.    [暗号化キー] で、[デフォルトの AWS マネージド型キー] を選択します。

6.    [次へ] を選択します。

7.    [ソースステージの追加] ページの [ソースプロバイダー] で、[Amazon S3] を選択します。

8.    [Bucket] (バケット) で、開発入力 S3 バケットの名前を入力します。例: codepipeline-input-bucket
重要: CodePipeline を使用するには、入力バケットでバージョニングがアクティブ化されている必要があります。

9.    [S3 object key] (S3 オブジェクトキー) で、sample-website.zip と入力します。

重要: 独自のウェブサイトの代わりにサンプルの AWS ウェブサイトを使用するには、チュートリアル: デプロイプロバイダーとして Amazon S3 を使用するパイプラインを作成するを参照してください。その後、[1: Deploy Static Website Files to Amazon S3] (1: 静的ウェブサイトファイルを Amazon S3 にデプロイする) のセクションの [Prerequisites] (前提条件) で、「静的ウェブサイトのサンプル」を検索します。

10.    [変更検出オプション] で、[Amazon CloudWatch Events (推奨)] を選択します。

11.    [次へ] を選択します。

12.    [Add build stage] (ビルドステージの追加) のページで、[Skip build stage] (ビルドステージをスキップ) を選択します。その後、[Skip] (スキップ) を選択します。

13.    [デプロイステージの追加] ページの [デプロイプロバイダー] で、[Amazon S3] を選択します。

14.    [Region] (リージョン) で、出力 S3 バケットがある AWS リージョンを選択します。例: 米国東部 (バージニア北部)

15.    [Bucket] (バケット) で、本番稼働用の出力 S3 バケットの名前を入力します。例: codepipeline-output-bucket

16.    [デプロイする前にファイルを抽出する] チェックボックスをオンにします。
注意: 必要に応じて、[デプロイパス] にパスを入力します。

17.    [追加設定] を展開します。

18.    [Canned ACL] (既定 ACL) で、[bucket-owner-full-control] を選択します。
注: bucket-owner-full-control は、本番稼働用アカウントのバケット所有者に、開発アカウントがデプロイおよび所有するオブジェクトへのフルアクセスを付与します。詳細については、既定 ACLを参照してください。

19.    [次へ] を選択します。

20.    [Create pipeline] (パイプラインを作成) を選択します。パイプラインは実行されますが、ソースステージは失敗します。「キー『sample-website.zip』を持つオブジェクトは存在しません」というエラーが表示されます。

この記事のサンプルウェブサイトを入力バケットにアップロードするのセクションには、このエラーを解決する方法が記載されています。

CodePipeline サービスロールを AWS Identity and Access Management (IAM) ポリシーで設定し、本番稼働用アカウントの出力バケットに S3 アクセスを追加する

1.    開発アカウントで IAM コンソールを開きます。

2.    ナビゲーションペインで、[Policies] (ポリシー) を選択します。その後、[Create policy] (ポリシーを作成) を選択します。

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.    [Review policy] (ポリシーの確認) をクリックします。

5.    [Name] (名前) で、ポリシーの名前を入力します。例: prodbucketaccess

6.    [ポリシーの作成] を選択します。

7.    ナビゲーションペインで、[ロール] を選択します。

8.    ロールのリストから、[AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy] を選択します。これが CodePipeline のサービスロールです。
注: ユースケースで必要な場合は、独自のサービスロールを使用できます。

9.    [ポリシーをアタッチ] を選択します。

10.    作成したポリシー (prodbucketaccess) を選択します。その後、[Attach policy] (ポリシーをアタッチ) を選択して、CodePipeline に本番稼働用の出力 S3 バケットへのアクセス権を付与します。

開発アカウントからのアクセスを許可するように本番稼働用アカウントで出力バケットを設定する

1.    本番稼働用アカウントで Amazon S3 コンソールを開きます。

2.    [Bucket name] (バケット名) リストで、本番稼働用の出力 S3 バケットを選択します。例: codepipeline-output-bucket

3.    [Permissions] (許可) を選択します。その後、[Bucket Policy] (バケットポリシー) を選択します。

4.    テキストエディタで、次のポリシーを入力し、[Save] (保存) を選択します。

重要: 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.    [Bucket name] (バケット名) リストで、開発用の入力 S3 バケットを選択します。例: codepipeline-input-bucket

3.    [Upload] (アップロード) を選択します。その後、[Add files] (ファイルを追加) を選択します。

4.    ダウンロードした sample-website.zip ファイルを選択します。

5.    [Upload] (アップロード) を選択して、パイプラインを実行します。パイプラインが実行されると、次のことが起こります。

  • ソースアクションは、開発入力 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) で抽出されたオブジェクトの所有者です。本番稼働用アカウントのバケット所有者も、デプロイされたアーティファクトに完全にアクセスできます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?