AWS CloudFormationでyaml, !GetAtt, Export, !ImportValue, !Subが使えるようになったので使ってみる

AWS CloudFormation Update – YAML, Cross-Stack References, Simplified Substitution | AWS Blog

yaml

jsonを以下を使ってyamlにするだけ
Convert JSON to YAML

!GetAttや!Ref

!を使うことでAWSの擬似関数であることが明示的になります。
※!はyamlのタグ用のシンタックスです。
* before

      Parameters:
        LambdaRoleArn:
          Fn::GetAtt:
            - IAMStack.Outputs
            - LambdaRoleArn
        LambdaBucket:
          Ref: LambdaBucket
  • after
      Parameters:
        LambdaRoleArn:
          !GetAtt IAMStack.Outputs.LambdaRoleArn
        LambdaBucket:
          !Ref LambdaBucket

!Sub

!Joinが不要になりました。
ApiGatewayのModelのSchema等はは!Joinの方がよいかもしれません。
* before

    Properties:
      TemplateURL:
        Fn::Join:
        - ''
        - - !Ref CfnTemplateDir
          - "/"
          - IAM.template
  • after
    Properties:
      TemplateURL: !Sub
        - ${CfnTemplateDir}/IAM.template
        - { CfnTemplateDir: !Ref CfnTemplateDir }

stackを分ける場合

今までは親スタックでパラメーターとして渡す必要がありましたが、Export, !ImportValueが使えるようになったので、
親子スタックの依存がなくなりました。
* diff(リソースのあるStack)

--- a/cfn/IAM.template
+++ b/cfn/IAM.template
@@ -118,22 +118,32 @@ Resources:
 Outputs:
   LambdaRoleArn:
     Value:
       !GetAtt LambdaRole.Arn
+    Export:
+      Name: IAMStackLambdaRoleArn
  • diff(親テンプレート)
--- a/cfn/AWS.template
+++ b/cfn/AWS.template
@@ -51,32 +51,26 @@ Resources:
   LambdaStack:
     Type: AWS::CloudFormation::Stack
     Properties:
       TemplateURL: !Sub
         - ${CfnTemplateDir}/Lambda.template
         - { CfnTemplateDir: !Ref CfnTemplateDir }
       Parameters:
-        LambdaRoleArn:
-          !GetAtt IAMStack.Outputs.LambdaRoleArn
  • diff(リソースを参照するStack)
--- a/cfn/Lambda.template
+++ b/cfn/Lambda.template
@@ -1,34 +1,34 @@
 ---
 AWSTemplateFormatVersion: '2010-09-09'
 Description: Reserve Lambda Stack
 Parameters:
-  LambdaRoleArn:
-    Type: String
   LambdaBucket:
     Type: String
 Resources:
   LambdaFunction:
     Type: AWS::Lambda::Function
     Properties:
       Code:
         S3Bucket:
           !Ref LambdaBucket
         S3Key: hello/index.js.zip
       Description: hello
       Handler: index.handler
       MemorySize: '128'
       Role:
-        !Ref LambdaRoleArn
+        !ImportValue IAMStackLambdaRoleArn
       Runtime: nodejs4.3
       Timeout: '25'