【AWS CDK】ブートストラップ で IAM ロールを自動生成したくない。自作の IAM ロール でデプロイしてみた。

記事タイトルとURLをコピーする

こんにちは。 ディベロップメントサービス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

手順はこちら。

  1. cdk bootstrap の デフォルトテンプレートを出力
  2. 上記テンプレートを修正(IAM ロールの削除)
  3. cdk bootstrap を修正後テンプレートで実施
  4. 自作 IAM ロールの構築
  5. CDK アプリケーションファイルの修正
  6. 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 が削除されました。

CDKToolkit

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 を指定する。

さいごに

手間が結構かかるので、他のデプロイツールを検討するのも一つの方法です。

本ブログがどなかたのお役に立てれば幸いです。

山本 真大(執筆記事の一覧)

アプリケーションサービス部 ディベロップメントサービス1課

2023年8月入社。カピバラさんが好き。