首页 > 解决方案 > 如何一起使用 Fn::Include 和 Fn::Sub?

问题描述

考虑这段代码:

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 的占位符怎么办?如何更换它们?任何解决方法?

标签: amazon-web-servicesyamlamazon-cloudformation

解决方案


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

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

一种解决方案是直接在 CloudFormation 模板中包含状态机定义,而不使用Fn::Transformand Fn::Include,这样您就可以使用它Fn::Sub来替换占位符。

根据您将状态机定义放在 S3 中的原因,从架构的角度来看,这甚至可能是有意义的,因为您不再需要单独的 S3 存储桶来存储状态机定义,并且该定义将与CloudFormation 堆栈(可能)创建了无论如何都在状态机中使用的 AWS Lambda 函数。

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


推荐阅读