【问题标题】:CloudFormation findInMap returns nullCloudFormation findInMap 返回 null
【发布时间】:2021-02-01 14:21:49
【问题描述】:

我正在创建一个 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 返回空值。你知道我做错了什么吗?

【问题讨论】:

  • 作为快速检查,如果您在path 中硬编码/{stage}/foo1/,而不是使用FindInMap,它是否有效?

标签: amazon-cloudformation aws-sam


【解决方案1】:

我认为问题不在于!FindInMap。我使用模板中的以下内容快速验证了它。

Outputs:
  MaverickOutput:
    Value: !FindInMap [ paths, example, foo1 ]

值 (/{stage}/foo1/) 反映在 CloudFormation 堆栈输出帖子 sam deploy 中。

了解它不适用于 Api 事件的原因。如果你关注这个link to official docs,你可以看到这个。

描述 Api 事件源类型的对象。如果定义了 AWS::Serverless::Api 资源,则路径和方法值必须与 API 的 OpenAPI 定义中的操作相对应。

结合您收到的错误 (Api Event must have a String specified for 'Path'."),我认为可以公平地假设此资源不接受将在部署期间解决的引用。

PS: 我找不到任何文档来支持我的理论,但另一个支持这一点的事实是地图也可以存储数字,并且在实际部署发生之前无法知道最终值是多少。因此,如果允许引用部署时间,您实际上可能会引用一个数字来表示 Path 值。

【讨论】:

  • 确实,我已经尝试将 !findInMap 移动到模板的其他部分,然后它就可以正常工作了。
【解决方案2】:

您需要将路径指定为字符串

Mappings:
  envs:
    "np":
      vpcId: "vpc-1412343432"
    "prod":
      vpcId: "vpc-4123121323"
  paths:
    "example":
      foo1: "/{stage}/foo1/"
      foo2: "/{stage}/foo2/"
      foo3: "/{stage}/foo3/"

【讨论】:

  • 我已经尝试过使用字符串,但仍然遇到同样的错误。
  • @Pawel 当我在那里使用路径时,错误改变了我。围绕为 ApiId 引用正确资源的事情,但我想这没关系,因为这不是完整的模板。
猜你喜欢
  • 2021-01-02
  • 2019-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多