AWS CodePipeline クロスアカウントアクセスパイプライン
AWS CodePipelineでクロスアカウントアクセスのパイプライン作成手順を記録します。
こちら公式手順です。
別の AWS アカウントのリソースを使用するパイプラインを CodePipeline で作成する
リソース側で受け入れるIAMロールでKMSへのアクション許可要らなかったっけ?と記憶が曖昧になっていたので、ちゃんと記録しておくことにしました。
結果、リソース側でCodeDeployを実行するIAMロールにはKMSへのアクション許可は不要でした。
目次
構成
IAMポリシーでは、パイプラインアカウントを111111111111、デプロイアカウントを222222222222にしています。
ソースリポジトリはunicorn-web-projectを使用しています。
GitHubへは、AWS CodeConnection(接続)で接続を作成済みです。
パイプラインアカウントのKMSキー
カスタマー管理キーをパイプラインアカウントで作成しました。
キーポリシーでデプロイアカウントへ許可を与えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
{ "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::222222222222: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::222222222222:root" ] }, "Action": [ "kms:CreateGrant", "kms:ListGrants", "kms:RevokeGrant" ], "Resource": "*", "Condition": { "Bool": { "kms:GrantIsForAWSResource": "true" } } } |
パイプラインを新規作成
ひとまずソースとビルドだけのパイプラインをパイプラインアカウントに作成しました。
IAMロールは新規で作成しました。
KMSキーは作成しておいたカスタマー管理キーを選択しました。
ソースは接続でGitHubを選択して設定しました。
ビルドはビルドプロジェクトを新規作成しました。
環境はデフォルトの設定ですが、記録時点での最新イメージ。
buildspec.ymlはソースに含まれるものを使用します。
テストステージとデプロイステージはスキップして作成しました。
作成時に自動でパイプラインが実行されますが、新規で作成したパイプライン用のIAMロールにKMSカスタマー管理キーへの権限がないのでエラーになります。
次のようなメッセージです。
[GitHub] Upload to S3 failed with the following error: User: arn:aws:sts::111111111111:assumed-role/AWSCodePipelineServiceRole-ap-northeast-1-CrossAccountUnicorn/1756615577818 is not authorized to perform: kms:GenerateDataKey on resource: arn:aws:kms:ap-northeast-1:111111111111:key/922b7c4b-52db-4862-b21a-cd01f5275ec7 because no identity-based policy allows the kms:GenerateDataKey action (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied;
S3へのアップロードが失敗したというメッセージですが、IAMロールにkms:GenerateDataKeyアクションが許可されていないことが原因と書いてあります。(because no identity-based policy allows the kms:GenerateDataKey action)
先にこのエラーだけ解消しておきます。
パイプライン用に新規作成されたIAMロール(AWSCodePipelineServiceRole-ap-northeast-1-CrossAccountUnicorn)に次のようなIAMポリシーを追加しました。
ついでに復号のためのkms:Decryptも追加しておきました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": "arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxx-xxxx-xxxx-xxxx-xxxxxx" } ] } |
[変更をリリースする]ボタンから再実行しました。
次はビルドステージでのエラーです。
Build terminated with state: FAILED. Phase: DOWNLOAD_SOURCE, Code: CLIENT_ERROR, Message: error while downloading key CrossAccountUnicornP/SourceArti/XIu6f2U, error: AccessDenied: User: arn:aws:sts::111111111111:assumed-role/codebuild-CrossAccountUnicornProject-service-role/AWSCodeBuild-347458d6-6f31-412e-87eb-1042ef3c2d82 is not authorized to perform: kms:Decrypt on resource: arn:aws:kms:ap-northeast-1:111111111111:key/922b7c4b-52db-4862-b21a-cd01f5275ec7 because no identity-based policy allows the kms:Decrypt action status code: 403,
新規に作成したビルドプロジェクトのIAMロール(codebuild-CrossAccountUnicornProject-service-role)にも、KMSへのアクション許可が必要です。
パイプラインのIAMロールと同じく、kms:Decryptとkms:GenerateDataKeyのアクションを許可して、[変更をリリースする]ボタンから再実行しました。
ビルドまで成功しました。
パイプラインのアーティファクトストアS3バケット
バケットポリシーでデプロイアカウントへ許可を与えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
{ "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111/*", "Condition": { "Bool": { "aws:SecureTransport": "false" } } }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111/*" }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::222222222222:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111" } ] } |
ターゲットアカウントにEC2インスタンス作成
ターゲットアカウントのパブリックサブネットにEC2インスタンスを起動しておきます。
AMIはAmazon Linux 2023、インスタンスタイプはt3.microにしました。
タグはCodeDeployでデプロイターゲットにできるように、キー: Name 値: UnicornWeb にしておきました。
セキュリティグループインバウンドはHTTP 80を0.0.0.0/0許可しました。
IAMロールは後で作ります。
EC2インスタンスのIAMロール作成
EC2 Role for AWS Systems Managerを選択して、IAMロールを作成しました。
次のポリシーをインラインポリシーで追加しました。
パイプラインアカウントのアーティファクトストアのS3バケットと、KMSカスタマー管理キーへの権限です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111" ] }, { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:ap-northeast-1:111111111111:key/xxxxxx-xxxx-xxxx-xxxx-xxxxxx" ] } ] } |
EC2インスタンスにIAMロールを設定して、引き受けさせておきます。
ターゲットアカウントにCodeDeployを作成
CodeDeployアプリケーションはEC2向けに作成しました。
デプロイグループを作成します。
IAMロールはAWS管理ポリシーのAWSCodeDeployRoleを設定しておきます。
環境設定はタグで指定したEC2インスタンスに対してインプレース更新にしました。
CodeDeployのエージェントは「1回のみ」を選択しました。
ターゲットアカウントにIAMロール作成
パイプラインアカウントのパイプラインから、ターゲットアカウントでCodeDeployを実行するためのIAMロールを作成します。
「信頼されたエンティティタイプ」は別のAWSアカウントで、パイプラインアカウントを指定します。
ひとまず許可ポリシーなしで作成して、後で次のインラインポリシーを追加しました。
ここでS3だけでKMSにはアクセス権限を与えてないのですが、権限チェックだけをしてるのかアーティファクトそのものにはアクセスしてないのか、S3の権限だけでいいようです。
S3の権限を外すと権限エラーになるので、そのように思えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::codepipeline-ap-northeast-1-111111111111/*" ] } ] } |
パイプラインアカウントのCodePipelineサービスロールにAssumeRole追加
パイプラインアカウントのCodePipelineサービスロール(AWSCodePipelineServiceRole-ap-northeast-1-CrossAccountUnicorn)に次のインラインポリシーを追加しました。
1 2 3 4 5 6 7 8 9 10 11 |
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::222222222222:role/*" ] } } |
CodePipelineの更新
ここからはAWS CLIコマンドで実行します。
CloudShellでもできますが、ファイルの編集があるので、ローカルで実行したほうがやりやすいです。
現在のパイプライン設定をダウンロードします。
1 2 |
aws codepipeline get-pipeline --name CrossAccountUnicornProject >pipeline.json |
取得したJSONを使用して、update-pipelineコマンドを実行するので、残しておくとエラーになるmetadata行を削除しました。
1 2 3 4 5 6 |
"metadata": { "pipelineArn": "arn:aws:codepipeline:ap-northeast-1:111111111111:CrossAccountUnicornProject", "created": "2025-08-31T13:46:11.259000+09:00", "updated": "2025-08-31T13:46:11.259000+09:00" } |
次のデプロイステージをJSONに追記しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
, { "name": "Deploy", "actions": [ { "inputArtifacts": [ { "name": "BuildArtifact" } ], "name": "ExternalDeploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "UnicornWeb", "DeploymentGroupName": "UnicornProd" }, "runOrder": 1, "roleArn": "arn:aws:iam::222222222222:role/UnicornCodeDeploy" } ] } |
ステージにロールを追加するというのが、マネジメントコンソールではできないんですよね。
次のコマンドを実行しました。
1 2 |
aws codepipeline update-pipeline --cli-input-json file://pipeline.json |
更新後のパイプライン情報がレスポンスされれば成功です。
デプロイステージが追加されました。
[変更をリリースする]から実行します。
無事完了しました。
EC2インスタンスにアクセスしたら無事、デプロイされていてアクセスできました。
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。

「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。

「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。

「AWSではじめるLinux入門ガイド」という本を書きました。


開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
-
AWS Lambda(Python)でDynamoDB テーブルを日次で削除/作成(オートスケーリング付き)
この記事はAWS #2 Advent Calendar 2018に参加した記事で …
-
-
AWS Transfer Family S3向けのSFTP対応サーバーをVPCで作成してEIPをアタッチ
EIPの作成 同じリージョンでEIPを作成しておきます。 SFTP対応サーバーの …
-
-
EC2 Ubuntu DesktopにRDP
Ubuntu Desktopが必要になりましたので、こちらのAWS EC2でデス …
-
-
API GatewayをトリガーにしたときのLambdaリソースベースポリシー
先日、SwaggerからAPI Gatewayを作ったときに、API Gatew …
-
-
EC2 Windows インスタンス PowerShellでメタデータを見る
Linuxインスタンスならcurlコマンドで確認すればいいのですが、Window …
-
-
ヤマムギ vol.24 API GatewayでREST API作成と直接DynamoDB登録のデモをしました
2週間ぶりのヤマムギ勉強会デモなのでなんだか久しぶりな気がしました。 今日はポケ …
-
-
S3イベントのAWS Lambdaのテスト設定
S3イベントのLambda関数でよく使うのはこんなテスト設定です。 なので覚書で …
-
-
S3 Intelligent-Tieringで高頻度階層(FREQUENT)に戻る「アクセス」にS3 SelectとGlueクローラーが該当するのか確認してみました
ユーザーガイドのS3 Intelligent-Tiering のしくみには、「低 …
-
-
S3バケットのデフォルト暗号化はデフォルトだったことを確認しました
S3バケットのデフォルト暗号化は名前のとおりだとデフォルトなので、暗号化を指定し …
-
-
AWS IAMのMFA「エンティティは既に存在しています」に対応しました
エンティティは既に存在しています MFA Device entity at th …