首页 > 解决方案 > 如何将 Fn::FindInMap 中的列表与其他项目结合起来?

问题描述

我有下一个 CloudFormation 文件:

Mappings:
  MyMap:
    us-east-1:
      Roles:
        - "roleA"
        - "roleB"
    ...

Resources:
  MyPolicy:
    Type: "AWS::IAM::Policy"
    PolicyDocument:
      Statement:
        - Effect: "Allow"
          Action:
            - "sts:AssumeRole"
          Resource:
            Fn::FindInMap: ["MyMap", !Ref AWS::Region, "Roles"]

一切正常,但是现在我需要添加一个将为所有区域定义的额外角色,但是简单地向Resource:部分添加额外角色是行不通的,因为它因模板语法错误而失败。

有没有办法将结果列表FindInMap和另一个项目结合起来?就像是:

Resource:
  Fn::FindInMap: ["MyMap", !Ref AWS::Region, "Roles"]
  - "roleC"

标签: amazon-cloudformation

解决方案


是的,你可以,但它不会很漂亮:

Resource: 
  Fn::Split:
    - ','
    - Fn::Join:
      - ','
      - - !Join [',', !FindInMap ["MyMap", !Ref "AWS::Region", "Roles"]]
        - 'roleC'     

基本上,首先将MyMap列表加入字符串,然后添加roleC到字符串,然后将其拆分为List of Strings.


推荐阅读