ヤマムギ

growing hard days.

*

AWS CodePipeline クロスアカウントアクセスパイプライン

   

AWS CodePipelineでクロスアカウントアクセスのパイプライン作成手順を記録します。

こちら公式手順です。
別の AWS アカウントのリソースを使用するパイプラインを CodePipeline で作成する

リソース側で受け入れるIAMロールでKMSへのアクション許可要らなかったっけ?と記憶が曖昧になっていたので、ちゃんと記録しておくことにしました。
結果、リソース側でCodeDeployを実行するIAMロールにはKMSへのアクション許可は不要でした。

構成

IAMポリシーでは、パイプラインアカウントを111111111111、デプロイアカウントを222222222222にしています。

ソースリポジトリはunicorn-web-projectを使用しています。
GitHubへは、AWS CodeConnection(接続)で接続を作成済みです。

パイプラインアカウントのKMSキー

カスタマー管理キーをパイプラインアカウントで作成しました。
キーポリシーでデプロイアカウントへ許可を与えます。

パイプラインを新規作成

ひとまずソースとビルドだけのパイプラインをパイプラインアカウントに作成しました。

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も追加しておきました。

[変更をリリースする]ボタンから再実行しました。
次はビルドステージでのエラーです。

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バケット

バケットポリシーでデプロイアカウントへ許可を与えます。

ターゲットアカウントに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カスタマー管理キーへの権限です。

EC2インスタンスにIAMロールを設定して、引き受けさせておきます。

ターゲットアカウントにCodeDeployを作成

CodeDeployアプリケーションはEC2向けに作成しました。
デプロイグループを作成します。

IAMロールはAWS管理ポリシーのAWSCodeDeployRoleを設定しておきます。

環境設定はタグで指定したEC2インスタンスに対してインプレース更新にしました。
CodeDeployのエージェントは「1回のみ」を選択しました。

ターゲットアカウントにIAMロール作成

パイプラインアカウントのパイプラインから、ターゲットアカウントでCodeDeployを実行するためのIAMロールを作成します。
「信頼されたエンティティタイプ」は別のAWSアカウントで、パイプラインアカウントを指定します。
ひとまず許可ポリシーなしで作成して、後で次のインラインポリシーを追加しました。
ここでS3だけでKMSにはアクセス権限を与えてないのですが、権限チェックだけをしてるのかアーティファクトそのものにはアクセスしてないのか、S3の権限だけでいいようです。
S3の権限を外すと権限エラーになるので、そのように思えます。

パイプラインアカウントのCodePipelineサービスロールにAssumeRole追加

パイプラインアカウントのCodePipelineサービスロール(AWSCodePipelineServiceRole-ap-northeast-1-CrossAccountUnicorn)に次のインラインポリシーを追加しました。

CodePipelineの更新

ここからはAWS CLIコマンドで実行します。
CloudShellでもできますが、ファイルの編集があるので、ローカルで実行したほうがやりやすいです。

現在のパイプライン設定をダウンロードします。

取得したJSONを使用して、update-pipelineコマンドを実行するので、残しておくとエラーになるmetadata行を削除しました。

次のデプロイステージをJSONに追記しました。

ステージにロールを追加するというのが、マネジメントコンソールではできないんですよね。

次のコマンドを実行しました。

更新後のパイプライン情報がレスポンスされれば成功です。

デプロイステージが追加されました。

[変更をリリースする]から実行します。

無事完了しました。

EC2インスタンスにアクセスしたら無事、デプロイされていてアクセスできました。


最後までお読みいただきましてありがとうございました!

「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。

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

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

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

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

 - AWS ,

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 …