amazon-web-services - 如何一起使用 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 的占位符怎么办?如何更换它们?任何解决方法?
解决方案
Fn::Sub
不支持Fn::Transform
作为输入的一部分。如文档中所述:
对于 String 参数,您不能使用任何函数。您必须指定一个字符串值。
一种解决方案是直接在 CloudFormation 模板中包含状态机定义,而不使用Fn::Transform
and Fn::Include
,这样您就可以使用它Fn::Sub
来替换占位符。
根据您将状态机定义放在 S3 中的原因,从架构的角度来看,这甚至可能是有意义的,因为您不再需要单独的 S3 存储桶来存储状态机定义,并且该定义将与CloudFormation 堆栈(可能)创建了无论如何都在状态机中使用的 AWS Lambda 函数。
恐怕这是迄今为止唯一可能的解决方案,因为Fn::Sub
在这方面相当有限。即使您将状态机定义作为可以在模板中引用(例如作为参数)的字符串,您也只能将引用替换为状态机定义字符串,而不是该字符串中的任何内容。
推荐阅读
- c++ - 创建具有假大小的统一特征表达式(以节省内存)
- android - NotifyDataSetChanged 在带有 Viewpager2 的 FragmentStateAdapter 中不起作用
- python - 两个不同字典之间的乘法
- python - 学习 asyncio:异步运行一个有延迟的函数
- angular - 使用 @Storybook/addon-docs 显示模板的代码
- django - Django:如何将两个序列化器相互嵌套?
- javascript - 搜索栏返回所有列的结果
- python - 如何在 django/boostrap 中按类别过滤任务?
- python - 使用 openCV 从 numpy 数组生成视频
- laravel - Salesforce JWT 登录返回无效的客户凭证