Amazon cloudformation CloudFormation findInMap返回null
我正在创建一个AWS SAM模板,并希望使用映射来存储一些常用的路径。 我的映射定义如下所示:Amazon cloudformation CloudFormation findInMap返回null,amazon-cloudformation,aws-sam,Amazon Cloudformation,Aws Sam,我正在创建一个AWS SAM模板,并希望使用映射来存储一些常用的路径。 我的映射定义如下所示: Mappings: envs: np: vpcId: vpc-1412343432 prod: vpcId: vpc-4123121323 paths: example: foo1: /{stage}/foo1/ foo2: /{stage}/foo2/ foo3: /{stage}/foo3/ 稍后在模板中
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时,它返回一个错误
,id为[foo]的事件无效。Api事件必须为“路径”指定字符串。
。看起来findInMap返回空值。你知道我做错了什么吗?我不认为问题出在上!FindInMap
。我很快验证了它使用以下添加到我的模板
Outputs:
MaverickOutput:
Value: !FindInMap [ paths, example, foo1 ]
值(/{stage}/foo1/
)反映在CloudFormation堆栈输出postsam deploy
中
来看看为什么它不能与Api事件一起工作。如果你遵循这个,你可以看到这个
描述Api事件源类型的对象。如果定义了AWS::Serverless::Api资源,则路径和方法值必须与Api的OpenAPI定义中的操作相对应
这与您收到的错误(Api事件必须为“Path.”指定一个字符串“
)相结合,我认为可以公平地假设此资源不接受将在部署期间解决的引用
附言:
我找不到任何文档来支持我的理论,但支持这一点的另一个事实是,地图也可以存储数字,在实际部署发生之前,无法知道最终的值是什么。因此,如果允许部署时间引用,您实际上可能会为
P引用一个数字ath
值。您需要将路径指定为字符串
Mappings:
envs:
"np":
vpcId: "vpc-1412343432"
"prod":
vpcId: "vpc-4123121323"
paths:
"example":
foo1: "/{stage}/foo1/"
foo2: "/{stage}/foo2/"
foo3: "/{stage}/foo3/"
作为快速检查,如果您硬编码
/{stage}/foo1/
在path
中,没有使用FindInMap
,它能工作吗?我试过使用字符串,但仍然得到相同的错误。@Pawel当我在那里使用路径时,错误为我改变了。关于引用APID的正确资源,我想这是可以的,因为这不是完整的模板。事实上,我已经修改了ed要移动!findInMap到模板的其他部分,然后它就可以正常工作了。