Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon cloudformation CloudFormation findInMap返回null_Amazon Cloudformation_Aws Sam - Fatal编程技术网

Amazon cloudformation CloudFormation findInMap返回null

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/ 稍后在模板中

我正在创建一个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时,它返回一个错误
,id为[foo]的事件无效。Api事件必须为“路径”指定字符串。
。看起来findInMap返回空值。你知道我做错了什么吗?

我不认为问题出在
上!FindInMap
。我很快验证了它使用以下添加到我的模板

Outputs:
  MaverickOutput:
    Value: !FindInMap [ paths, example, foo1 ]
值(
/{stage}/foo1/
)反映在CloudFormation堆栈输出post
sam 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到模板的其他部分,然后它就可以正常工作了。