クロスアカウントの CodeCommit リポジトリで CodePipeline のソースステージをどのように構成すればよいですか?
AWS CodePipeline のソースステージを、クロスアカウントの AWS CodeCommit リポジトリで構成したいと考えています。
解決策
**注:**CodeCommit は新規顧客には提供されていません。既存の CodeCommit ユーザーは引き続きサービスを利用できます。詳細については、「AWS CodeCommit リポジトリを他の Git プロバイダーに移行する方法」を参照してください。
以下の解決策では、CodeCommit リポジトリにアカウント A を使用し、CodePipelineにアカウントB を使用します。
アカウント A に CodeCommit リポジトリを作成します。
アカウント A に CodeCommit リポジトリを作成するには、「AWS CodeCommit リポジトリを作成する」を参照してください。
アカウント A でクロスアカウントロールを設定します
次の手順を実行します。
- アカウント A で AWS Identity and Access Management (IAM) コンソールを開きます。
- ナビゲーションペインで、[ロール] を選択します。
- [新しいロールを作成] を選択し、次の手順を実行します。
[AWSアカウント] を **[信頼されたエンティティタイプ]**として選択します。
[別の AWS アカウント] を選択し、アカウント B の ID を入力します。
IAM ロールの名前を入力します (例: cross-account-access-role)。 - 次の信頼ポリシーを使用して IAM ロールを作成します。
**注:**example-account-b をアカウント B の ID に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::example-account-b:root" }, "Action": "sts:AssumeRole", "Condition": {} } ] }
アカウント B のコードパイプラインで使用する AWS KMS キーを作成する
**注:**クロスアカウントデプロイには、AWS Key Management Service (AWS KMS) のカスタマー管理キーを使用する必要があります。キーを設定しない場合、CodePipelineはデフォルトの暗号化を使用してオブジェクトを暗号化し、宛先アカウントのロールがそれらのオブジェクトを復号できなくなります。
次の手順を実行します。
- アカウント B で AWS KMS コンソールを開きます。
- ナビゲーションペインで **[カスタマーマネージドキー]**を選択し、以下の手順を完了します。
[キータイプ] で [対称] を選択します。
[キーの使用] で [暗号化と復号化] を選択します。 - [詳細オプション] を展開し、次の手順を実行します。
[キーマテリアルオリジン] で [KMS] を選択します。
[エイリアス] には、キーのエイリアスを入力します (例: cmk-key)。
[キー管理者] には、キー管理者権限を付与する IAM エンティティを選択します。 - [他の AWS アカウント] セクションで、[別の AWS アカウントを追加] を選択します。
- アカウント A の ID を入力します。
- [完了] を選択します。
アカウント B でコードパイプラインを作成する
次の手順を実行します。
- CodePipeline コンソールを開きます。
- [パイプラインの作成] を選択し、パイプラインに名前を付けます (例: account\_B\_pipeline)。
注:****[ロール名] のテキストボックスには、AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline というサービスロール名が自動的に入力されます。既存の AWS KMS キーにアクセスできるサービスロールを選択することも可能です。 - [詳細設定] を展開し、以下の手順を完了します。
[アーティファクトストア] には、[デフォルトの場所] を選択します。必要に応じて、[カスタムロケーション] を選択することもできます。
[暗号化キー] には、[カスタマーマネージドキー] を選択し、ドロップダウンリストから cmk-key を選択します。
[ソースプロバイダー] には、[CodeCommit] を選択します。
[リポジトリ名] には、リポジトリ名を入力します (例: account-a-repository)。ブランチ名には main を指定します。 - [ビルドステージを追加する] ページで、[ビルドステージをスキップ] を選択し、[スキップ] を選択します。
- [デプロイステージを追加する] ページで、**[デプロイプロバイダー]**にはサービスを選択します。
- [次へ] を選択してパイプラインを作成します。
**注:**パイプライン作成後に次のエラーメッセージが表示された場合は、この解決策の「クロスアカウントロールを使用するようにパイプラインを更新する」セクションを参照してください。
エラーメッセージ:
「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 使用ポリシーを更新する
次の手順を実行します。
- アカウント B で AWS KMS コンソールを開きます。
- ナビゲーションペインで、[カスタマー管理キー] を選択します。
- テーブルで、キーのエイリアス (cmk-key など) を選択します。
- [キーユーザー] セクションで、[追加] を選択します。
- パイプラインサービスロールを入力します (例: AWSCodePipelineServiceRole-ap-southeast-2-account\_B\_pipeline)。
- パイプラインサービスロールを 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 でロール引受ポリシーを設定します。
次の手順を実行します。
-
アカウント B で IAM コンソールを開きます。
-
ナビゲーションペインで [ロール] を選択し、パイプラインロールを選択します。
-
アカウント 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 アーティファクトバケットのバケットポリシーを更新します。
次の手順を実行します。
-
アカウント B で Amazon Simple Storage Service (Amazon S3) コンソールを開きます。
-
ナビゲーションペインでバケットを選択し、パイプラインバケットを選択します。
-
[権限] を選択し、次に [バケットポリシー] を選択します。
-
テキストエディタで、次のポリシーステートメントを含むようにポリシーを更新します。
{ "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 ポリシーを作成します。
次の手順を実行します。
- アカウント A で IAM コンソールを開きます。
- ナビゲーションペインで [ロール] を選択し、[cross-account-access-role] を選択します。
- [インラインポリシーを作成] を選択します。
- JSON タブで、次のポリシーを入力します。
**注:**example-account-b-id をアカウント B の ID に、example-key-id を AWS KMS キーの ARN に、example-pipeline-artifact-bucket-arn をパイプラインアーティファクトバケットの ARN に置き換えてください。{ "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" ] } ] } - [ポリシーを確認] を選択し、ポリシーを作成します。
パイプラインを更新してクロスアカウントロールを使用するように設定します
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、使用している AWS CLI が最新バージョンであることを確認してください。
次の手順を実行します。
-
codepipeline.json という名前のファイルからパイプライン定義を取得するには、get-pipeline コマンドを実行します。
aws codepipeline get-pipeline --name example-account-b-pipeline > codepipeline.json**注:**example-account-b-pipeline をアカウント B のパイプライン名に置き換えてください。
-
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 リージョンに置き換えてください。
-
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" } -
パイプラインを更新するには、update-pipeline コマンドを実行します。
aws codepipeline update-pipeline --cli-input-json example-codepipeline.json**注:**example-codepipeline.json をパイプラインの JSON ファイルに置き換えてください。
注: 上記の解決策を使用して、他の AWS サービスで異なる AWS アカウントの CodeCommit や Amazon S3 を利用することもできます。これを行うには、パイプラインの各ステージで、異なるアカウントのソースステージと AWS サービスを統合します。詳細については、「別の AWS アカウントのリソースを使用する CodePipeline パイプラインの作成」を参照してください。
- トピック
- Developer Tools
- 言語
- 日本語
