AWS CDK で AWS CloudFormation テンプレートを生成してみた

AWS CDK で開発しながら、最終的には AWS CloudFormation テンプレートでデプロイしたいケースに対応するため、CDK 特有の余計なメタデータ情報を含まない CloudFormation テンプレートを生成する方法を紹介します。

AWS CloudFormation テンプレート生成時の設定方法

1. AWS CDK コード作成

例として Amazon EC2 を作成するコードで説明します。
bin/app.tsにて、CDKからCloudFormationテンプレートを作成する際の設定をcdk.DefaultStackSynthesizerで定義します。

bin/app.ts synthesizer設定:

const app = new cdk.App();

new Ec2Stack(app, 'EC2Stack', {
 synthesizer: new cdk.DefaultStackSynthesizer({
  generateBootstrapVersionRule: false                  // CDK BootstrapVersionチェックを無効化
 })
});

オプション:

  • generateBootstrapVersionRule: false: BootstrapVersionパラメータとルールを除外する
 

lib/EC2Stack.ts

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
 
export class Ec2Stack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
 
    const subnetId = "subnet-123456789abc";    
 
    // EC2インスタンス作成
    const ec2Instance = new cdk.aws_ec2.CfnInstance(this, 'Ec2Instance01a', {
      imageId: 'ami-0bdebfdf585253328',             
      instanceType: 't3.micro',                    
      subnetId: subnetId,                           
      securityGroupIds: ['sg-abcdefg1234'],   
      iamInstanceProfile: 'instance_profile',   
      keyName: 'keypair-name',                   
      disableApiTermination: false,                 
      // EBSボリューム設定
      blockDeviceMappings: [
        {
          deviceName: '/dev/xvda',
          ebs: {
            volumeSize: 30,
            volumeType: 'gp3',
            encrypted: true,                        
            deleteOnTermination: true               
          }
        }
      ],
      ebsOptimized: true,                           
      monitoring: false,                           
      metadataOptions: {                           
        httpTokens: 'required',
      },
      // タグ設定
      tags: [
        {
          key: 'Name',
          value: 'CDK-Generation-Ec2Instance'
        },
      ]
    });
  }
}

2. synthコマンドで AWS CloudFormation テンプレート生成

以下のコマンドを実行し、CloudFormationテンプレートを生成します。
テンプレートはcdk.out配下に出力されます。

cdk synth <スタック名> --no-path-metadata --no-version-reporting

オプション:

  • --no-path-metadata: リソースのMetadata内のaws:cdk:path情報を除外する
  • --no-version-reporting: CDKバージョン情報を除外する
 

cdk.out/Ec2Stack.template.json

Resources:
  Ec2Instance01a:
    Type: AWS::EC2::Instance
    Properties:
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: true
            Encrypted: true
            VolumeSize: 30
            VolumeType: gp3
      DisableApiTermination: false
      EbsOptimized: true
      IamInstanceProfile: instance_profile
      ImageId: ami-0bdebfdf585253328
      InstanceType: t3.micro
      KeyName: keypair-name
      MetadataOptions:
        HttpTokens: required
      Monitoring: false
      SecurityGroupIds:
        - sg-abcdefg1234
      SubnetId: subnet-123456789abc
      Tags:
        - Key: Name
          Value: CDK-Generation-Ec2Instance

参考

オプションをつけずにコマンドを実行すると、27行目以降にメタデータ情報が記載されたテンプレートが作成されます。

Resources:
  Ec2Instance01a:
    Type: AWS::EC2::Instance
    Properties:
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: true
            Encrypted: true
            VolumeSize: 30
            VolumeType: gp3
      DisableApiTermination: false
      EbsOptimized: true
      IamInstanceProfile: instance_profile
      ImageId: ami-0bdebfdf585253328
      InstanceType: t3.micro
      KeyName: keypair-name
      MetadataOptions:
        HttpTokens: required
      Monitoring: false
      SecurityGroupIds:
        - sg-abcdefg1234
      SubnetId: subnet-123456789abc
      Tags:
        - Key: Name
          Value: CDK-Generation-Ec2Instance
    Metadata:
      aws:cdk:path: Ec2Stack/Ec2Instance01a
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Analytics: v2:deflate64:H4sIAAAAAAAA/zPSMzI01jNQTCwv1k1OydbNyUzSqw4uSUzO1kksL45PTTbSc07L88wrLknMS06t1cnLT0nVyyrWLzMy0jM01jNUzCrOzNQtKs0rycxN1QuC0ACVaq8YVQAAAA==
    Metadata:
      aws:cdk:path: Ec2Stack/CDKMetadata/Default
    Condition: CDKMetadataAvailable
Conditions:
  CDKMetadataAvailable:
    Fn::Or:
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - af-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-northeast-3
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-south-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-2
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-3
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - ap-southeast-4
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - ca-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - cn-northwest-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-central-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-north-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-south-2
      - Fn::Or:
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-1
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-2
          - Fn::Equals:
              - Ref: AWS::Region
              - eu-west-3
          - Fn::Equals:
              - Ref: AWS::Region
              - il-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - me-central-1
          - Fn::Equals:
              - Ref: AWS::Region
              - me-south-1
          - Fn::Equals:
              - Ref: AWS::Region
              - sa-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-1
          - Fn::Equals:
              - Ref: AWS::Region
              - us-east-2
          - Fn::Equals:
              - Ref: AWS::Region
              - us-west-1
      - Fn::Equals:
          - Ref: AWS::Region
          - us-west-2

まとめ

今回は AWS CDK を使ってメタデータ情報がない AWS CloudFormation テンプレートを生成してみました。
皆さんのお役に立てば幸いです。

著者について

AWSの基盤構築を担当しています。
小物集めにはまっています。

ameiをフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSクラウド
シェアする
タイトルとURLをコピーしました