如何一起使用Fn :: Include和Fn :: Sub?

时间:2019-08-25 16:39:07

标签: amazon-web-services yaml amazon-cloudformation

考虑以下代码:

MyStateMachine:
    Type: "AWS::StepFunctions::StateMachine"
    Properties:
        StateMachineName: MyStateMachine
        DefinitionString:
            Fn::Sub:
                - Fn::Transform:
                     Name: 'AWS::Include'
                     Parameters:
                         Location: s3://my-bucket/my.json
                - { Param1: MyLambda1.Arn, Param2: MyLambda2.Arn }

我遇到一个错误:

  

模板错误:一个或多个Fn :: Sub内部函数未指定期望的参数。       指定一个字符串作为第一个参数,并指定一个可选的第二个参数以指定映射       字符串中要替换的值

要求第一个参数必须是字符串,但是如果状态机具有arn的占位符怎么办?如何更换它们?有任何解决方法吗?

1 个答案:

答案 0 :(得分:0)

Fn::Sub不支持Fn::Transform作为输入的一部分。如documentation中所述:

  

对于String参数,不能使用任何函数。你必须   指定一个字符串值。

一种解决方案是将状态机定义直接包括在CloudFormation模板中,而无需诉诸Fn::TransformFn::Include,这将允许您使用Fn::Sub来替换占位符。

根据您将状态机定义放入S3的背后原因(从体系结构的角度来看,这甚至可能是有意义的),因为您不再需要单独的S3存储桶来存储状态机定义,并且该定义将紧密相关耦合到CloudFormation堆栈,该堆栈大概可以创建在状态机中使用的AWS Lambda函数。

恐怕到目前为止,这是唯一可能的解决方案,因为Fn::Sub在这方面受到很大限制。即使您可以将状态机定义作为可在模板中引用(例如作为参数)的字符串使用,也只能将引用替换为状态机定义字符串,而不能替换该字符串内的任何内容。