【问题标题】:How use Fn::Include and Fn::Sub together?如何一起使用 Fn::Include 和 Fn::Sub?
【发布时间】:2019-12-30 01:14:08
【问题描述】:

考虑这段代码:

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

【问题讨论】:

  • 你能告诉我们s3://my-bucket/my.json的内容吗?

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


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 2018-12-25
    • 2020-06-13
    • 2020-02-24
    • 2021-11-11
    • 2020-07-20
    • 1970-01-01
    • 2010-11-29
    相关资源
    最近更新 更多