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
関連記事
-
-
LINE BOT AWARDS 2017に応募しました
LINEの友達追加QRです。 動作のご確認にどうぞ LINE BOT AWARD …
-
-
AWS Protonの管理者ガイドとユーザーガイドのチュートリアル
AWS Proton管理者ガイドのAWS Management Console …
-
-
Aurora Serverless Data APIを有効にしてLambdaからクエリを実行
Aurora Serverless作成 MySQLを作成しました。 作成時にDa …
-
-
WordPress(EC2)の画像のS3へのオフロードをMedia Cloudで
タイトル通りですが、画像をwebサーバー(EC2)からではなく、S3バケットから …
-
-
ALBのヘルスチェックでPHPとMySQL接続をチェック
当ブログで504エラーが発生して、オートスケーリングにより自動でインスタンスが置 …
-
-
AWS Lambdaで「Process exited before completing request」
AWS lambdaで「Process exited before comple …
-
-
JAWS-UG 大阪 関西女子合同 Amazon Personalizeハンズオンやってみました
久しぶりに大阪でJAWS-UGに参加です。 Amazon Personalize …
-
-
ブログの画像を別アカウントのS3に移動するためにIAMロールでクロスアカウントアクセス
ずっと先延ばしにしていたのですが、このブログの画像はEC2から直接配信しています …
-
-
S3オブジェクトへのリクエストをCloudTrail, Athenaで識別する(パーティショニング)
Amazon S3オブエジェクトへのリクエストをCloudTrail, Athe …
-
-
Amazon InspectorによるLambda関数の脆弱性検出結果を確認しました
AWS re:Invent 2022期間内に発表されましたAmazon Insp …













