CloudFormation findInMap returns 空
CloudFormation findInMap returns 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 部署它时 returns 出现错误 Event with id [foo] is invalid. Api Event must have a String specified for 'Path'
。看起来 findInMap returns 是空值。你知道我做错了什么吗?
我不认为 !FindInMap
有问题。我使用以下添加到我的模板中的方法快速验证了它。
Outputs:
MaverickOutput:
Value: !FindInMap [ paths, example, foo1 ]
值 (/{stage}/foo1/
) 反映在 CloudFormation 堆栈输出中 post sam deploy
。
谈到它不能与 Api 事件一起工作的原因。如果你关注这个link to official docs,你可以看到这个
The object describing an Api event source type. If an AWS::Serverless::Api resource is defined, the path and method values must correspond to an operation in the OpenAPI definition of the API.
结合您收到的错误 (Api Event must have a String specified for 'Path'."
),我认为可以公平地假设此资源不接受将在部署期间解决的引用。
PS:
我找不到任何文档来支持我的理论,但支持这一点的另一个事实是地图也可以存储数字,并且在实际部署发生之前无法知道最终值是多少。因此,如果允许引用部署时间,您实际上可能会引用一个数字作为 Path
值。
您需要将路径指定为字符串
Mappings:
envs:
"np":
vpcId: "vpc-1412343432"
"prod":
vpcId: "vpc-4123121323"
paths:
"example":
foo1: "/{stage}/foo1/"
foo2: "/{stage}/foo2/"
foo3: "/{stage}/foo3/"
我正在创建一个 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 部署它时 returns 出现错误 Event with id [foo] is invalid. Api Event must have a String specified for 'Path'
。看起来 findInMap returns 是空值。你知道我做错了什么吗?
我不认为 !FindInMap
有问题。我使用以下添加到我的模板中的方法快速验证了它。
Outputs:
MaverickOutput:
Value: !FindInMap [ paths, example, foo1 ]
值 (/{stage}/foo1/
) 反映在 CloudFormation 堆栈输出中 post sam deploy
。
谈到它不能与 Api 事件一起工作的原因。如果你关注这个link to official docs,你可以看到这个
The object describing an Api event source type. If an AWS::Serverless::Api resource is defined, the path and method values must correspond to an operation in the OpenAPI definition of the API.
结合您收到的错误 (Api Event must have a String specified for 'Path'."
),我认为可以公平地假设此资源不接受将在部署期间解决的引用。
PS:
我找不到任何文档来支持我的理论,但支持这一点的另一个事实是地图也可以存储数字,并且在实际部署发生之前无法知道最终值是多少。因此,如果允许引用部署时间,您实际上可能会引用一个数字作为 Path
值。
您需要将路径指定为字符串
Mappings:
envs:
"np":
vpcId: "vpc-1412343432"
"prod":
vpcId: "vpc-4123121323"
paths:
"example":
foo1: "/{stage}/foo1/"
foo2: "/{stage}/foo2/"
foo3: "/{stage}/foo3/"