CodePipeline を使用して、アーティファクトを別の AWS アカウントの Simple Storage Service (Amazon S3) にデプロイするにはどうすればよいですか?

最終更新日: 2022 年 02 月 14 日

別のアカウントの Amazon Simple Storage Service (Amazon S3) バケットにアーティファクトをデプロイしたいと考えています。また、宛先アカウントをオブジェクト所有者として設定したいと考えています。Simple Storage Service (Amazon S3) デプロイアクションプロバイダーで AWS CodePipeline を使用してこれを実行する方法はありますか?

解決方法

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

  • 開発アカウントと本番稼働用アカウントの 2 つのアカウントがあります。
  • 開発アカウントの入力バケットは、codepipeline-input-bucket (バージョニングがアクティブ化されています) です。
  • 開発アカウントのデフォルトのアーティファクトバケットは、codepipeline-us-east-1-0123456789 です。
  • 本番稼働用アカウントの出力バケットは、codepipeline-output-bucket です。
  • 開発アカウントから本番稼働用アカウントの S3 バケットにアーティファクトをデプロイしようとしています。
  • アーティファクトをデプロイするために、本番稼働用アカウントにクロスアカウントロールが作成されていると想定しています。このロールにより、本番稼働用アカウントは開発アカウントではなくオブジェクト所有者になります。本番稼働用アカウントのバケット所有者に、開発アカウントが所有するオブジェクトへのアクセスを付与するには、次の記事を参照してください。CodePipeline と既定 ACL を使用して、別の AWS アカウントの Simple Storage Service (Amazon S3) にアーティファクトをデプロイするにはどうすればよいですか?

開発アカウントで CodePipeline と共に使用する AWS KMS キーを作成する

重要: クロスアカウントのデプロイには、AWS Key Management Service (AWS KMS) のカスタマーマネージドキーを使用する必要があります。キーが設定されていない場合、CodePipeline はデフォルトの暗号化を使用してオブジェクトを暗号化します。この暗号化は、宛先アカウントのロールでは復号できません。

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

2.    ナビゲーションペインから [Customer managed keys] をクリックします。

3.    [キーの作成] を選択します。

4.    [キータイプ] で、[対称キー] を選択します。

5.    [詳細オプション] を展開します。

6.    [キーマテリアルのオリジン] で [KMS] を選択します。その後、[次へ] を選択します。

7.    [Alias] に、キーのエイリアスを入力します。例えば、s3deploykey などです。

8.    [次へ] を選択します。[キー管理権限の定義] ページが開きます。

9.    [キー管理者] セクションで、AWS Identity and Access Management (IAM) ユーザーまたはロールをキー管理者として選択します。

10.[次へ] を選択します。[Define key usage permissions] (キー使用権限の定義) ページが開きます。

11.    [別の AWS アカウント] セクションで、[別の AWS アカウントを追加する] を選択します。

12.    表示されるテキストボックスに、本番稼働用アカウントのアカウント ID を追加します。その後、[次へ] を選択します。

注: [このアカウント] セクションで既存のサービスロールを選択することもできます。既存のサービスロールを選択した場合は、[開発アカウントの KMS 使用ポリシーの更新] セクションのステップをスキップしてください。

13.    キーポリシーを確認します。[完了] をクリックします。

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

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

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

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

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

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

5.    [暗号化キー] で、[カスタマーマネージドキー] を選択します。

6.    [KMS カスタマーマネージドキー] の場合は、リストからキーのエイリアス (この例では s3deploykey) を選択し、[次へ] を選択します。[ソースステージの追加] ページが開きます。

7.[ソースプロバイダー] で [Amazon S3] を選択します。

8.    [Bucket] (バケット) で、開発入力 S3 バケットの名前を入力します。例: codepipeline-input-bucket

重要: CodePipeline を使用するには、入力バケットでバージョニングがアクティブ化されている必要があります。

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

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

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

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

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

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

重要: 本番稼働用の出力バケットのリージョンがパイプラインのリージョンと異なる場合は、以下のことも確認する必要があります。

  • 複数のレプリカを持つ AWS KMS マルチリージョンキーを使用している。
  • パイプラインには両方のリージョンにアーティファクトストアがある。

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

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

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

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

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

開発アカウントの KMS 使用ポリシーを更新する

重要: 既存の CodePipeline サービスロールを使用している場合は、このセクションをスキップしてください。

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

2.    キーのエイリアス (この例では s3deploykey) を選択します。

3.    [キーユーザー] セクションで、[追加] を選択します。

4.    検索ボックスに、サービスロール [AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy] を入力します。

5.    [追加] を選択します。

本番稼働用アカウントでクロスアカウントロールを設定する

本番稼働用の出力 S3 バケットに Simple Storage Service (Amazon S3) アクセス許可を付与するロールの IAM ポリシーを作成します。

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

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

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

5.    [Name] (名前) で、ポリシーの名前を入力します。例えば、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.    [Review policy] (ポリシーの確認) を選択します。

4.    [Name] (名前) で、ポリシーの名前を入力します。例えば、devkmss3access などです。

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

アーティファクトをデプロイするために開発アカウントが引き受けることができるクロスアカウントロールを作成する

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

2.    ナビゲーションペインで、[ロール] を選択します。その後、[ロールを作成] を選択します。

3.    [別の AWS アカウント] を選択します。

4.    [Account ID] に、開発アカウントの AWS アカウント ID を入力します。

5.    [次のステップ: アクセス許可] を選択します。

6.    ポリシー一覧から、[outputbucketdeployaccess] および [devkmss3access] を選択します。

7.    [Next: Tags] を選択します。

8.    (オプション) タグを追加し、続いて [次: レビュー] を選択します。

9.    [ロール名] に [prods3role] と入力します。

10.    [ロールの作成] を選択します。

11.    ロール一覧から、prods3role を選択します。

12.    [Trust Relationships] (信頼関係) を選択します。その後、[Edit Trust relationship] (信頼関係の編集) を選択します。

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.    [Update Trust Policy] (信頼ポリシーの更新) を選択します。

開発アカウントの CodePipeline アーティファクトバケットのバケットポリシーを更新する

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

2.    [Bucket name] (バケット名) リストで、開発アカウントのアーティファクトバケットの名前 (この例では codepipeline-us-east-1-0123456789) を選択します。

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

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.    [Save] (保存) を選択します。

開発アカウントの CodePipeline サービスロールに、作成したクロスアカウントロールを引き受けることができるポリシーを添付します。

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

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

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

5.    [名前] に、[assumeprods3role] と入力します。

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

7.    ナビゲーションペインで、[ロール] を選択します。次に、パイプラインのサービスロールの名前を選択します (この例では、AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy)。

8.    [Attach Policies] (ポリシーをアタッチ) を選択します。次に、[assumeprods3role] を選択します。

9.    [Attach Policy] (ポリシーのアタッチ) を選択します。

開発アカウントでクロスアカウントロールを使用するようにパイプラインを更新する

注: AWS Command Line Interface (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

1.    次の AWS CLI コマンドを実行して、パイプライン定義を codepipeline.json という名前のファイルとして取得します。

重要: crossaccountdeploy はパイプライン名に置き換えてください。

aws codepipeline get-pipeline --name crossaccountdeploy > codepipeline.json

2.    クロスアカウント IAM ロール ARN (roleArn) を codepipeline.json ファイルの [デプロイアクション] セクションに追加します。詳細については、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.    [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) は本番稼働用アカウントのクロスアカウントロール (prods3role) を引き受けます。
  • CodePipeline はクロスアカウントロール (prods3role) を使用して、開発アカウントの KMS キーとアーティファクトバケットにアクセスします。その後、CodePipeline は抽出されたファイルを本番稼働用アカウントの本番稼働用の出力 S3 バケット (codepipeline-output-bucket) にデプロイします。

注: 本番稼働用アカウントは、本番稼働用の出力 S3 バケット (codepipeline-output-bucket) で抽出されたオブジェクトの所有者です。


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


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