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 テンプレートを生成してみました。
皆さんのお役に立てば幸いです。