スキップしてコンテンツを表示

クロスアカウントの CodeCommit リポジトリで CodePipeline のソースステージをどのように構成すればよいですか?

所要時間4分
0

AWS CodePipeline のソースステージを、クロスアカウントの AWS CodeCommit リポジトリで構成したいと考えています。

解決策

**注:**CodeCommit は新規顧客には提供されていません。既存の CodeCommit ユーザーは引き続きサービスを利用できます。詳細については、「AWS CodeCommit リポジトリを他の Git プロバイダーに移行する方法」を参照してください。

以下の解決策では、CodeCommit リポジトリにアカウント A を使用し、CodePipelineにアカウントB を使用します。

アカウント A に CodeCommit リポジトリを作成します。

アカウント A に CodeCommit リポジトリを作成するには、「AWS CodeCommit リポジトリを作成する」を参照してください。

アカウント A でクロスアカウントロールを設定します

次の手順を実行します。

  1. アカウント A で AWS Identity and Access Management (IAM) コンソールを開きます。
  2. ナビゲーションペインで、[ロール] を選択します。
  3. [新しいロールを作成] を選択し、次の手順を実行します。
    [AWSアカウント] を **[信頼されたエンティティタイプ]**として選択します。
    [別の AWS アカウント] を選択し、アカウント B の ID を入力します。
    IAM ロールの名前を入力します (例: cross-account-access-role)。
  4. 次の信頼ポリシーを使用して IAM ロールを作成します
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::example-account-b:root"
                },
                "Action": "sts:AssumeRole",
                "Condition": {}
            }
        ]
    }
    **注:**example-account-b をアカウント B の ID に置き換えます。

アカウント B のコードパイプラインで使用する AWS KMS キーを作成する

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

次の手順を実行します。

  1. アカウント B で AWS KMS コンソールを開きます。
  2. ナビゲーションペインで **[カスタマーマネージドキー]**を選択し、以下の手順を完了します。
    [キータイプ][対称] を選択します。
    [キーの使用][暗号化と復号化] を選択します。
  3. [詳細オプション] を展開し、次の手順を実行します。
    [キーマテリアルオリジン][KMS] を選択します。
    [エイリアス] には、キーのエイリアスを入力します (例: cmk-key)。
    [キー管理者] には、キー管理者権限を付与する IAM エンティティを選択します。
  4. [他の AWS アカウント] セクションで、[別の AWS アカウントを追加] を選択します。
  5. アカウント A の ID を入力します。
  6. [完了] を選択します。

アカウント B でコードパイプラインを作成する

次の手順を実行します。

  1. CodePipeline コンソールを開きます。
  2. [パイプラインの作成] を選択し、パイプラインに名前を付けます (例: account\_B\_pipeline)。
    注:****[ロール名] のテキストボックスには、AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline というサービスロール名が自動的に入力されます。既存の AWS KMS キーにアクセスできるサービスロールを選択することも可能です。
  3. [詳細設定] を展開し、以下の手順を完了します。
    [アーティファクトストア] には、[デフォルトの場所] を選択します。必要に応じて、[カスタムロケーション] を選択することもできます。
    [暗号化キー] には、[カスタマーマネージドキー] を選択し、ドロップダウンリストから cmk-key を選択します。
    [ソースプロバイダー] には、[CodeCommit] を選択します。
    [リポジトリ名] には、リポジトリ名を入力します (例: account-a-repository)。ブランチ名には main を指定します。
  4. [ビルドステージを追加する] ページで、[ビルドステージをスキップ] を選択し、[スキップ] を選択します。
  5. [デプロイステージを追加する] ページで、**[デプロイプロバイダー]**にはサービスを選択します。
  6. [次へ] を選択してパイプラインを作成します。

**注:**パイプライン作成後に次のエラーメッセージが表示された場合は、この解決策の「クロスアカウントロールを使用するようにパイプラインを更新する」セクションを参照してください。

エラーメッセージ:

「The action failed because no AWS CodeCommit repository named account-a-repository was found.Make sure you are using the correct repository name, and then try again.Error: account-a-repository」

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

次の手順を実行します。

  1. アカウント B で AWS KMS コンソールを開きます。
  2. ナビゲーションペインで、[カスタマー管理キー] を選択します。
  3. テーブルで、キーのエイリアス (cmk-key など) を選択します。
  4. [キーユーザー] セクションで、[追加] を選択します。
  5. パイプラインサービスロールを入力します (例: AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline)。
  6. パイプラインサービスロールを AWS KMS キーのポリシーに追加します。以下はキーポリシーの例です。
    {
        "Id": "key-consolepolicy-3",
        "Version": "2012-10-17",
        "Statement": [{
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::example-account-b:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        }, {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::example-account-b:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-account_B_pipeline", "arn:aws:iam::<Account_A>:root"]
            },
            "Action": ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"],
            "Resource": "*"
        }, {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": ["arn:aws:iam::example-account-b>:role/example-service-role/AWSCodePipelineServiceRole-ap-southeast-2-Account_B_pipeline", "arn:aws:iam::example-account-a:root"]
            },
            "Action": ["kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant"],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }]
    }

アカウント B でロール引受ポリシーを設定します。

次の手順を実行します。

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

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

  3. アカウント A のロールを引き受けるパイプラインロールに、次のポリシーを追加します。

    {
        "Version": "2012-10-17",
        "Statement": {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": [
                "arn:aws:iam::example-account-a:example-pipeline-role/*"
            ]
        }
    }

    注: example-account-A をアカウントAに、example-pipeline-role をパイプラインロールに置き換えてください。

アカウント B の CodePipeline アーティファクトバケットのバケットポリシーを更新します。

次の手順を実行します。

  1. アカウント B で Amazon Simple Storage Service (Amazon S3) コンソールを開きます。

  2. ナビゲーションペインでバケットを選択し、パイプラインバケットを選択します。

  3. [権限] を選択し、次に [バケットポリシー] を選択します。

  4. テキストエディタで、次のポリシーステートメントを含むようにポリシーを更新します。

    {
        "Version": "2012-10-17",
        "Id": "example-policy-id",
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"]
                },
                "Action": [
                    "s3:Get*",
                    "s3:Put*"
                ],
                "Resource": "arn:aws:s3:::example-pipeline-bucket/*"
            },
            {
                "Sid": "",
                "Effect": "Allow",
                "Principal": {
                    "AWS": ["arn:aws:iam::example-account-a-id:root", "arn:aws:iam::example-account-b-id:root"]
                },
                "Action": "s3:ListBucket",
                "Resource": "arn:aws:s3:::example-pipeline-bucket"
            }
        ]
    }

    **注:**JSON 形式に正しく合わせるため、既存のステートメントの後にカンマを追加してください。example-policy-id をポリシー ID に、example-account-a-id をアカウント A の ID に、example-account-b-id をアカウント B の ID に、example-pipeline-bucket をパイプラインバケット名に置き換えてください。

アカウント A に対して、アカウント B の AWS KMS キーを使用する権限を付与するインライン IAM ポリシーを作成します。

次の手順を実行します。

  1. アカウント A で IAM コンソールを開きます。
  2. ナビゲーションペインで [ロール] を選択し、[cross-account-access-role] を選択します。
  3. [インラインポリシーを作成] を選択します。
  4. JSON タブで、次のポリシーを入力します。
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "kms:DescribeKey",
            "kms:GenerateDataKey*",
            "kms:Encrypt",
            "kms:ReEncrypt*",
            "kms:Decrypt"
          ],
          "Resource": [
            "arn:aws:kms:ap-southeast-2:example-account-b-id:key/example-key-id"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:Put*"
          ],
          "Resource": [
            "arn:aws:s3:::example-pipeline-artifact-bucket-arn/*"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket"
          ],
          "Resource": [
            "arn:aws:s3:::example-pipeline-artifact-bucket-arn"
          ]
        }
      ]
    }
    **注:**example-account-b-id をアカウント B の ID に、example-key-id を AWS KMS キーの ARN に、example-pipeline-artifact-bucket-arn をパイプラインアーティファクトバケットの ARN に置き換えてください。
  5. [ポリシーを確認] を選択し、ポリシーを作成します。

パイプラインを更新してクロスアカウントロールを使用するように設定します

**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。

次の手順を実行します。

  1. codepipeline.json という名前のファイルからパイプライン定義を取得するには、get-pipeline コマンドを実行します。

    aws codepipeline get-pipeline --name example-account-b-pipeline > codepipeline.json

    **注:**example-account-b-pipeline をアカウント B のパイプライン名に置き換えてください。

  2. Source ステージにクロスアカウント IAM ロールの ARN を、codepipeline.json ファイルに追加します。

    {
      "name": "Source",
      "actions": [
        {
          "name": "Source",
          "actionTypeId": {
            "category": "Source",
            "owner": "AWS",
            "provider": "CodeCommit",
            "version": "1"
         },
          "runOrder": 1,
          "roleArn": "arn:aws:iam::example-account-a-id:role/example-cross-account-access-role",
          "configuration": {
            "BranchName": "main",
            "OutputArtifactFormat": "CODE_ZIP",
            "PollForSourceChanges": "false",
            "RepositoryName": "example-account-a-repository"
          },
          "outputArtifacts": [
            {
              "name": "SourceArtifact"
            }
          ],
          "inputArtifacts": [],
          "region": "example-region",
          "namespace": "SourceVariables"
        }
      ]
    }

    **注:**example-account-a-id をアカウント A の ID に、example-cross-account-access-role をクロスアカウントロールに、example-account-a-repository をアカウント A のリポジトリに、example-region を使用する AWS リージョンに置き換えてください。

  3. codepipeline.json ファイルの末尾にあるメタデータセクションを削除してください。また、メタデータセクションの前にあるカンマも削除してください。
    例:

    "metadata": {
        "pipelineArn": "arn:aws:codepipeline:ap-southeast-2:12345678912:Account_B_pipeline",
        "created": "2023-01-11T05:09:20.235000+00:00",
        "updated": "2023-01-11T17:34:37.294000+00:00"
    }
  4. パイプラインを更新するには、update-pipeline コマンドを実行します。

    aws codepipeline update-pipeline --cli-input-json example-codepipeline.json

    **注:**example-codepipeline.json をパイプラインの JSON ファイルに置き換えてください。

注: 上記の解決策を使用して、他の AWS サービスで異なる AWS アカウントの CodeCommit や Amazon S3 を利用することもできます。これを行うには、パイプラインの各ステージで、異なるアカウントのソースステージと AWS サービスを統合します。詳細については、「別の AWS アカウントのリソースを使用する CodePipeline パイプラインの作成」を参照してください。

AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ