amazon-cloudformation - CloudFormation findInMap 返回 null
问题描述
我正在创建一个 AWS SAM 模板,并希望使用映射来存储一些常用路径。我的映射定义如下所示:
Mappings:
envs:
np:
vpcId: vpc-1412343432
prod:
vpcId: vpc-4123121323
paths:
example:
foo1: /{stage}/foo1/
foo2: /{stage}/foo2/
foo3: /{stage}/foo3/
稍后在模板中,我有一个函数定义!findInMap
myFunc:
Type: AWS::Serverless::Function
Properties:
Handler: index.myFunc
Role: !GetAtt myFunc.Arn
Events:
foo:
Type: HttpApi
Properties:
Path: !FindInMap [ paths, example, foo1 ]
Method: get
ApiId: !Ref fooApi
当我运行 sam deploy 时,它返回一个错误Event with id [foo] is invalid. Api Event must have a String specified for 'Path'
。看起来 findInMap 返回空值。你知道我做错了什么吗?
解决方案
我不认为问题出在!FindInMap
. 我使用模板中的以下内容快速验证了它。
Outputs:
MaverickOutput:
Value: !FindInMap [ paths, example, foo1 ]
值 ( /{stage}/foo1/
) 反映在 CloudFormation 堆栈输出帖子sam deploy
中。
谈到它不适用于 Api 事件的原因。如果你点击这个链接到官方文档,你可以看到这个。
描述 Api 事件源类型的对象。如果定义了 AWS::Serverless::Api 资源,则路径和方法值必须与 API 的 OpenAPI 定义中的操作相对应。
这与Api Event must have a String specified for 'Path'."
您收到的错误 () 相结合,我认为可以公平地假设此资源不接受将在部署期间解决的引用。
PS:我找不到任何文档来支持我的理论,但另一个支持这一点的事实是地图也可以存储数字,并且在实际部署之前无法知道最终值是多少. 因此,如果允许引用部署时间,您实际上可能会引用一个数字来表示该Path
值。
推荐阅读
- git - 仅使用 git diff 或 git format-patch 来获取补丁后修改的行范围
- python - 错误:valueError:输入数组应具有与目标数组相同数量的样本。查找 1 个输入样本和 0 个目标样本
- spring-batch - 如何使用分区和 ItemReader 来获取文件对象?
- python - 带双引号的 Python urlencode
- python - For循环更新字典值但不影响输出
- android - Espresso 片段交易测试
- html - 根据该文本长度对齐 td 内的文本和按钮
- android - 安装 react-native-sqlite-storage
- python-3.x - Python:如何找到其中元素最多的列表
- c# - 如何防止网站在使用 FTP 更新同一网站的服务器上的更改时停止工作