ヤマムギ

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

  関連記事

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 …