ヤマムギ

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

  関連記事

S3オブジェクトロックを試しました

S3オブジェクトロックが必要になる要件に今のところ、出会ってないのでまだ設定した …

GoogleフォームからAPI Gatewayで作成したREST APIにPOSTリクエストする

「API GatewayからLambdaを介さずにSNSトピックへ送信」の続きで …

AtomエディタでEC2のファイルを直接編集する

Webページを編集していてEC2のファイルをvimエディタでさわったりしています …

Amazon SNSサブスクリプションフィルターで優先度別のSQSキューにサブスクライブする

EC2のコンシューマーアプリケーションは優先度の高いキューのメッセージを先に処理 …

Amazon Augmented AI (Amazon A2I) のチュートリアル

Amazon Augmented AI (Amazon A2I)を使ったことがあ …

ブログのアーキテクチャをコストベースで見直しました

当ブログはAWSで構築しています。 アーキテクチャをコストを最重視して見直しまし …

EC2 Amazon Linux 2 にAmazon LinuxからWordPressを移行

このブログを新しいインスタンスに移行することにしました。 2015年5月にAma …

特定AWSアカウント特定リージョンのSQSキューを削除するLambda(Python)

やりたいこと 特定アカウント内特定リージョン内のSQSキューを全部削除したいです …

EC2 Ubuntu DesktopにRDP

Ubuntu Desktopが必要になりましたので、こちらのAWS EC2でデス …

Organizations組織でAWS SSOを有効にする

先日AWS Control Towerで環境を作ったら、自動でAWS SSOがで …