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