amazon-web-services - 仅当 FindInMap 值存在时才创建角色?/如果映射没有某些键的值该怎么办?

标签 amazon-web-services aws-cloudformation amazon-iam

我有一个角色,仅当映射中存在给定键的条目时我才想创建该角色。当我没有为某些键/值输入任何值时,就会出现困惑(在这种情况下,某些区域没有“XClientPrincipals”的值,因此我收到错误。

示例: map :

  alpha: ...
  beta:
    Region1:
      YClientPrincipals:
        - 'arn:aws:iam::#########:root'
    Region3:
      XClientPrincipals:
        - 'arn:aws:iam::#########:root'
      YClientPrincipals:
        - 'arn:aws:iam::#########:root'
  prod:
    Region1:
      YClientPrincipals:
        - 'arn:aws:iam::#########:root'
    Region2:
      XClientPrincipals:
        - 'arn:aws:iam::#########:root'
        - 'arn:aws:iam::#########:root'
      YClientPrincipals:
        - 'arn:aws:iam::#########:root'
    Region3:
      XClientPrincipals:
        - 'arn:aws:iam::#########:root'
        - 'arn:aws:iam::#########:root'
      YClientPrincipals:
        - 'arn:aws:iam::#########:root'

角色:

  # Role definition for LMSortPlanningWorkflow - https://issues.amazon.com/LMCP-3533
  XClientRole:
    Type: AWS::IAM::Role
    Condition: IsBetaOrProd # Don't create external client roles in Alpha
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Action: 'sts:AssumeRole'
            Effect: Allow
            Principal:
              AWS:
                'Fn::FindInMap': [ { Ref: 'Domain' }, { Ref: 'Region' }, 'XClientPrincipals' ]
      RoleName: { 'Fn::Sub': 'XClientRole' }
      ManagedPolicyArns:
        - Ref: SomeApiCallPolicy

问题是 XClientPrincipals 仅适用于某些区域,我们只需要在这些区域中创建角色(测试版和产品版之间的角色不同)。如果我没有在 map 中为我们拥有的域和区域的每种可能组合提供某些内容,则在为该域+区域部署时会出错,因为它在 map 中找不到任何内容。但是,如果我为该域+区域指定一个空数组,这也是一个错误,因为主体需要一个值。有没有办法创建一个条件,仅在可以先找到映射中的值的情况下才创建角色?

我很确定我可以创建一个条件来仅创建角色并拼出可接受的域和区域值(第一个和第二个键),这些值应该评估为 true,但实际的映射比这更复杂一点,所以如果能够满足如下条件就太好了:

  RunLambdaInVPC:
    Fn::Not: [ {Ref: FindInMap .... }, null]

但我认为我没有见过任何这样的例子,也没有找到一种方法来让这样的事情发挥作用。

最佳答案

是的,您可以根据特定映射的值有条件地创建资源。
下面的示例展示了如何在 Condition 中使用区域映射的值,然后使用该值来确定是否应创建资源:

AWSTemplateFormatVersion: "2010-09-09"
Mappings: 
  RegionMap: 
    us-east-1: 
      "HVM64": "ami-0ff8a91507f77f867"
    us-west-1: 
      "HVM64": "ami-0bdb828fd58c52235"
  IsProdMapping: 
    us-east-1: 
      "prod": "True"
    us-west-1: 
      "prod": "False"

Resources:
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !FindInMap [RegionMap, !Ref "AWS::Region", HVM64]
      InstanceType: t3.nano
      SubnetId: !Ref Subnet
  RootRole:
    Type: 'AWS::IAM::Role'
    Condition: CreateIAMRole
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - 'sts:AssumeRole'
      Path: /
      Policies:
        - PolicyName: root
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action: '*'
                Resource: '*'
Conditions:
  CreateIAMRole: !Equals 
    - !FindInMap [IsProdMapping, !Ref "AWS::Region", "prod"]
    - "True"
Parameters:
  VPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC where you want to deploy
  Subnet:
    Type: AWS::EC2::Subnet::Id
    Description: The subnet where you want to deploy

如果我在 us-east-1 中部署此模板,则会创建 RootRole
如果我在 us-west-1 中部署此模板,则不会创建RootRole

关于amazon-web-services - 仅当 FindInMap 值存在时才创建角色?/如果映射没有某些键的值该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71960859/

相关文章:

android - 亚马逊SNS支持窗口桌面通知吗?

java - 如何访问 "The full stack trace of the root cause is available in the Apache Tomcat/8.0.39 logs"

amazon-web-services - 如何在 AWS 上创建真正具有最低权限的部署用户?

amazon-web-services - 使用cloudformation条件创建副本实例失败

amazon-web-services - "eksctl create iamserviceaccount"在 EKS 集群上做了什么?

amazon-web-services - 如何在 cloudformartion 脚本中添加 IAM 角色的下拉列表?

AWS EC2 上的 Node.js RESTful API 服务器与 AWS API 网关

amazon-web-services - 如何通过 CloudFormation 为 lambda 函数配置 Alexa Skills Kit 触发器?

amazon-web-services - 即使在指定自定义 VPC 后,用于自动扩展组的 Cloudformation YAML 仍会在默认 VPC 中创建 EC2 实例

amazon-web-services - 是否可以将 List<S3Target> 作为输入传递给 Cloud Formation?