こんにちは。 ディベロップメントサービス1課の山本です。
今回は AWS Cloud Development Kit (以降、CDK) を利用する際に、自作の IAM ロールを使ってデプロイする方法を紹介します。
セキュリティの観点等から決まった IAM ロールしか利用できない場合でも、CDK を使えるようになります。
この記事の対象者は?
- 決まった IAM ロールの使用のみを許可されている環境で構築されている方
ブートストラップについて
CDK を利用する際、はじめに以下コマンドで環境のブートストラップが必要となります。
cdk bootstrap
こちらのコマンドで構築したリソースを用いて、CDK がデプロイを実施します。
ブートストラップ時に自動生成される IAM ロールは全部で 5 つあります。
今回はこの中の一つを自作 IAM ロールに切り替えます。
- CloudFormationExecutionRole
- スタックデプロイ実行時のロール
- DeploymentActionRole
- クロスアカウントデプロイ実行時のロール
- FilePublishingRole
- S3 へのアクション実行時のロール
- ImagePublishingRole
- ECR へのアクション実行時のロール
- LookupRole
- AWS 環境からコンテキスト値の検索実行時のロール
AWS CDK ブートストラップ - AWS Cloud Development Kit (AWS CDK) v2
IAM ロールのカスタマイズ方法について
こちらの AWS ドキュメントに従って、カスタマイズしていきます。
AWS CDK ブートストラップをカスタマイズする - AWS Cloud Development Kit (AWS CDK) v2
手順はこちら。
- cdk bootstrap の デフォルトテンプレートを出力
- 上記テンプレートを修正(IAM ロールの削除)
- cdk bootstrap を修正後テンプレートで実施
- 自作 IAM ロールの構築
- CDK アプリケーションファイルの修正
- CDK デプロイ
1.cdk bootstrap の デフォルトテンプレートを出力
まず、引数無しでcdk bootstrap
を実行した際に使われるデフォルトテンプレートを出力します。
cdk bootstrap --show-template > my-bootstrap-template.yaml
このコマンドにて、デフォルトテンプレートが my-bootstrap-template.yaml
に出力されます。
デフォルトテンプレートの内容に関しては、公式の git 内で参照できます。
aws-cdk/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml at main · aws/aws-cdk · GitHub
2. 上記テンプレートを修正(IAM ロールの削除)
出力したテンプレートを修正して、IAMロールが自動生成されないようにします。
今回は、CloudFormationExecutionRole
の宣言・参照箇所を削除します。
my-bootstrap-template.yaml
# CloudFormationExecutionRole: # Type: AWS::IAM::Role # Properties: # AssumeRolePolicyDocument: # Statement: # - Action: sts:AssumeRole # Effect: Allow # Principal: # Service: cloudformation.amazonaws.com # Version: "2012-10-17" # ManagedPolicyArns: # Fn::If: # - HasCloudFormationExecutionPolicies # - Ref: CloudFormationExecutionPolicies # - Fn::If: # - HasTrustedAccounts # - Ref: AWS::NoValue # - - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess # RoleName: # Fn::Sub: cdk-${Qualifier}-cfn-exec-role-${AWS::AccountId}-${AWS::Region} # PermissionsBoundary: # Fn::If: # - PermissionsBoundarySet # - Fn::Sub: arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/${InputPermissionsBoundary} # - Ref: AWS::NoValue
- Action: iam:PassRole Resource: # Fn::Sub: ${CloudFormationExecutionRole.Arn} Fn::Sub: "arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cdk-test-cfn-exec-role" # 自作する IAM ロールの ARN に差し替え Effect: Allow
3. cdk bootstrap を修正後テンプレートで実施
修正したテンプレートで cdk bootstrap
を実行します。
cdk bootstrap --template my-bootstrap-template.yaml
無事、生成された CDLToolkit のリソースから CloudFormationExecutionRole
が削除されました。
4. 自作 IAM ロールの構築
代わりとなる デプロイ用のロール(cdk-test-cfn-exec-role)を自作します。
仮として Admin 権限で作成します。
AWSTemplateFormatVersion: "2010-09-09" #---------------------------------------- # Resources #---------------------------------------- Resources: CloudFormationExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: cloudformation.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Sub: arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess RoleName: cdk-test-cfn-exec-role
5. CDK アプリケーションファイルの修正
このまま CDK によるデプロイを実施すると、修正前のロールを利用して CDK がデプロイを試みるのでエラーが発生します。
エラーメッセージ
User: arn:aws:sts::xxx:assumed-role/cdk-hnb659fds-deploy-role-xxx-ap-northeast-1/aws-cdk is not authorized to perform: iam:PassRole on resource: arn:aws:iam::xxx:role/cdk-hnb659fds-cfn-exec-role-xxx-ap-northeast-1 because no identity-based policy allows the iam:PassRole action
そのため今回自作したcdk-test-cfn-exec-role
をデプロイロールとして使うように、アプリケーションファイルを修正します。
DefaultStackSynthesizer
オブジェクトを追加して使用する IAM ロール を ARN で指定することで、自作のロールでデプロイが可能となります。
CDK スタック合成の設定とカスタマイズ - AWS Cloud Development Kit (AWS CDK) v2
import * as cdk from 'aws-cdk-lib'; import { MyLambdaProjectStack } from '../lib/cdk-stack'; import { DefaultStackSynthesizer } from 'aws-cdk-lib'; const app = new cdk.App(); new MyLambdaProjectStack(app, 'MyLambdaProjectStack', { synthesizer: new DefaultStackSynthesizer({ cloudFormationExecutionRole: 'arn:aws:iam::xxx:role/cdk-test-cfn-exec-role', }), } );
6. CDK デプロイ
デプロイコマンドでデプロイします。
cdk deploy
無事、自作 IAM ロールでデプロイできました。
まとめ
- IAM ロールを自動生成しないためには、修正したテンプレートでブートストラップを実行する。
- CDK アプリケーションファイル にて、代用する 自作 IAM ロールの ARN を指定する。
さいごに
手間が結構かかるので、他のデプロイツールを検討するのも一つの方法です。
本ブログがどなかたのお役に立てれば幸いです。