AWS CDK(TypeScript)でCloudFormationテンプレートを出力する

AWS CDKをJavaやTypeScriptなどの型付言語で利用すると、IDEの型情報を活かしてAWSリソースの定義や構成の理解などがかなり捗ります。 Construct Libraryなどを使えば1発で込み入った構成 […]

広告ここから
広告ここまで

目次

    AWS CDKをJavaやTypeScriptなどの型付言語で利用すると、IDEの型情報を活かしてAWSリソースの定義や構成の理解などがかなり捗ります。

    Construct Libraryなどを使えば1発で込み入った構成を手に入れることもできます。

    が、状況によってはCloudFormationテンプレートが必要になるケースもあります。

    CloudFormationテンプレートにエクスポートするケース

    基本的にはAWS CDKでデプロイまでできるのですが、以下の例のようにテンプレートJSON / YAMLが必要になるケースもあります。

    • AWS MarketPlaceやServerless Application Repositoryなどで公開する場合
    • Service Catalogに登録したい場合
    • ASK CLI(v2)など、CloudFormationを内部で利用しているツールを利用する場合
    • etc…

    AWS CDKからCloudFormationテンプレートを作る方法

    SynthUtils.toCloudFormation というメソッドを使えば簡単にJSONへ変換できます。

    import { Stack, Construct, StackProps, Fn, CfnMapping, App } from "@aws-cdk/core";
    import { SynthUtils } from '@aws-cdk/assert'
    import { CfnInstance } from "@aws-cdk/aws-ec2";
    
    // Example stack
    class DevStack extends Stack {
        constructor(scope: Construct, id: string, props?: StackProps) {
            super(scope, id, props)
            new CfnMapping(
                this,
                'OwnAMIID',
                {
                    mapping: {
                        "us-east-2": {
                          "ID": "ami-xxxxxxxx"
                        },
                        "us-east-1": {
                          "ID": "ami-yyyyyyyy"
                        }
                      }
                }
            )
            const ec2 = new CfnInstance(this, 'EC2', {
                imageId: Fn.findInMap(
                    'OwnAMIID',
                    this.region,
                    'ID'
                )
            })
        }
    }
    
    // Initialize Stack by AWS CDK
    const stack = new DevStack(new App(), 'test')
    
    // Convert to CloudFormation template
    const cfn = SynthUtils.toCloudFormation(stack)
    
    // STDOUT
    console.log(JSON.stringify(cfn))  

    あとはts-nodeなどで上記のコードを実行してやればOKです。

    % npx ts-node bin/dev.ts | jq .
    {
      "Mappings": {
        "OwnAMIID": {
          "us-east-2": {
            "ID": "ami-xxxxxxxx"
          },
          "us-east-1": {
            "ID": "ami-yyyyyyyy"
          }
        }
      },
      "Resources": {
        "EC2": {
          "Type": "AWS::EC2::Instance",
          "Properties": {
            "ImageId": {
              "Fn::FindInMap": [
                "OwnAMIID",
                {
                  "Ref": "AWS::Region"
                },
                "ID"
              ]
            }
          }
        }
      }
    }

    やり方さえわかれば簡単ですね。テストコードを1日読んでやっと見つけたマイナー機能ですが、個人的にかなりお世話になりそうです。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark