考虑以下代码:
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的占位符怎么办?如何更换它们?有任何解决方法吗?
答案 0 :(得分:0)
Fn::Sub
不支持Fn::Transform
作为输入的一部分。如documentation中所述:
对于String参数,不能使用任何函数。你必须 指定一个字符串值。
一种解决方案是将状态机定义直接包括在CloudFormation模板中,而无需诉诸Fn::Transform
和Fn::Include
,这将允许您使用Fn::Sub
来替换占位符。
根据您将状态机定义放入S3的背后原因(从体系结构的角度来看,这甚至可能是有意义的),因为您不再需要单独的S3存储桶来存储状态机定义,并且该定义将紧密相关耦合到CloudFormation堆栈,该堆栈大概可以创建在状态机中使用的AWS Lambda函数。
恐怕到目前为止,这是唯一可能的解决方案,因为Fn::Sub
在这方面受到很大限制。即使您可以将状态机定义作为可在模板中引用(例如作为参数)的字符串使用,也只能将引用替换为状态机定义字符串,而不能替换该字符串内的任何内容。