🐕‍🦺

[AWS]CloudFormationで使用できるFn::ToJsonStringが便利

に公開

用途

CloudFormation内でJSONの記述が必要な時に使用。
例えば下記のような記述をテンプレート内で行う必要がある場合にFn::ToJsonString関数を使用することで可読性が上がる。

"{ \"InstanceIds\": [ \"${InstanceID}\"] }"

使用方法

Transform: AWS::LanguageExtensions をテンプレートに追記するだけで使用可能となる。
テンプレートのバージョン指定後に書くようにしている。

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions

AWS公式ドキュメントから抜粋

Transform: 'AWS::LanguageExtensions'
#...
  Fn::ToJsonString: 
    key1: value1
    key2: !Ref ParameterName
#...

結果はこうなる。

"{\"key1\":\"value1\",\"key2\":\"resolvedValue\"}"

https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ToJsonString.html#intrinsic-function-reference-tojsonstring-examples

具体的な使用例

用途としては夜間にEC2を停止するEventBridge Schedulerの作成時に使用している。

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::LanguageExtensions
Description: Create EventBridge Scheduler

Parameters:
  InstanceID01:
    Type: AWS::EC2::Instance::Id
  Cron:
    Description: Enter the JST cron to stop EC2.
    Type: String
    Default: cron(00 21 ? * * *)

Resources:
  EC2StopSchedule:
    Type: AWS::Scheduler::Schedule
    Properties:
      Description: Stop EC2 Instance
      FlexibleTimeWindow:
        Mode: "OFF"
      Name: stop-ec2-schedule
      ScheduleExpression: !Sub ${Cron}
      ScheduleExpressionTimezone: Asia/Tokyo
      State: ENABLED
      Target:
        Arn: "arn:aws:scheduler:::aws-sdk:ec2:stopInstances"
        Input:
          Fn::ToJsonString:
            InstanceIds:
              - !Ref InstanceID01
        RoleArn: Role.Arn
        RetryPolicy:
          MaximumEventAgeInSeconds: 300
          MaximumRetryAttempts: 5

導入前は下記のように記載していた

Input: !Sub "{ \"InstanceIds\": [ \"${InstanceID01}\" ] }"

スケジューラーのターゲットが作成される

{"InstanceIds":["i-0b0123456778"]}

参考

https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/intrinsic-function-reference-ToJsonString.html
https://dev.classmethod.jp/articles/cfn-templates-support-language-extensions-transformation/

Discussion