模板格式错误:每个映射属性都必须是字符串或列表

Mic*_*xon 6 amazon-web-services aws-cloudformation

我希望在我的 CloudFormation 模板顶部有一些快速参考,这样我就不必在整个模板中每次需要时都写出复杂的参考。

所以我写了这个:

Mappings:
  StandardResourcesMap:
    AWSExecuteApi:
      string: !Join [ ':' , ['arn', !Sub '${AWS::Partition}', 'execute-api', !Sub '${AWS::Region}', !Sub '${AWS::AccountId}'] ]
    AWSLambdaFunctions:
      string: !Join [ ':' , ['arn', !Sub '${AWS::Partition}', 'apigateway', !Sub '${AWS::Region}', 'lambda:path/2015-03-31/functions/'] ]
Run Code Online (Sandbox Code Playgroud)

CloudFormation 模板的其余部分遵循这一点,并且在没有上面几行的情况下,模板将部署(一个 S3 存储桶、DynamoDB 表和一个基于 Python 3.7 的 Lambda)。

希望我可以使用:

!FindInMap [StandardResourcesMap,AWSExecuteApi,string]
Run Code Online (Sandbox Code Playgroud)

每当我需要冗长的值时,模板都无法通过以下方式验证:

An error occurred (ValidationError) when calling the CreateChangeSet operation: Template format error: Every Mappings attribute must be a String or a List.
Run Code Online (Sandbox Code Playgroud)

正如标题所说。

我已经尝试了许多变体,Mappings例如使用!Ref变体:

Mappings:
  StandardResourcesMap:
    AWSExecuteApi:
      string: !Join [ ':' , ['arn', !Ref 'AWS::Partition', 'execute-api', !Ref 'AWS::Region', !Ref 'AWS::AccountId'] ]
    AWSLambdaFunctions:
      string: !Join [ ':' , ['arn', !Ref 'AWS::Partition', 'apigateway', !Ref 'AWS::Region', 'lambda:path/2015-03-31/functions/'] ]
Run Code Online (Sandbox Code Playgroud)

我只是被拉到各种验证错误上,以上面介绍的错误为中心。

任何帮助将不胜感激。

Jas*_*rth 11

问题是这样的:You cannot include parameters, pseudo parameters, or intrinsic functions in the Mappings section. 映射

  • 啊哈!- 就是这样!非常感谢。有两件事:(1)可怕的错误消息 - 它肯定没有表明问题是什么。(2) 我真的希望我可以存储引用链,这样我就不必到处重复这样的块。知道有什么方法可以做到这一点吗? (5认同)