Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
クロスアカウントの 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
- 言語
- 日本語
