如何在 IAM 主体 cloudformation 模板映射中同时允许显式角色 ARN 和通配符角色(甚至帐户中的所有角色)?

How to allow both explicit role ARNs and wildcard roles (or even all roles in account) in IAM principal cloudformation template mapping?

我有一个角色,我想根据部署到哪个阶段授予 AssumeRole 权限。这 90% 有效,但我正在尝试通配一个部分,但它没有按我需要的那样工作。

在我的映射中,我有这样的东西:

  Mappings:
    TestRoleMapping:
      us-east-1:
        beta: ['arn:aws:iam::11111111111:role/somePrefix-blah-TestInvocationRole', 'arn:aws:iam::2222222222:role/TestInvocationRole']
        prod: ..... etc

那我就用这里的映射:

  Resources:
    SomeReadRole:
      Type: AWS::IAM::Role
      Properties:
        RoleName: { Fn::Sub: "${ApplicationName}-read-role" }
        AssumeRolePolicyDocument:
          Statement:
            - Action: [ 'sts:AssumeRole' ]
              Effect: Allow
              Principal:
                AWS: !FindInMap
                  - TestRoleMapping
                  - !Ref 'AWS::Region'
                  - !Ref Stage
          Version: '2012-10-17'
        Policies:
          - PolicyDocument:
              Statement:
                - Action: [ 's3:Get*' ]
                  Effect: Allow
                  Resource: '*'
              Version: '2012-10-17'
            PolicyName: "lambdaPolicy"

当我部署它时,它工作正常,因为我使用的是所有硬编码角色。但是,我想允许帐户 11111111111 中的任何角色拥有权限或(甚至更好)任何以“TestInvocationRole”结尾的角色。我尝试用 'arn:aws:iam::11111111111:role/*-TestInvocationRole' 或只是 'arn:aws:iam::11111111111:role/*' 替换映射中的字符串,但它说主体无效。我读过我们可以在 ARN 的任何部分中放置通配符,但我猜我在这种情况下滥用了它。

我怎样才能让角色同时授予硬编码角色和通配符角色权限?

来自AWS JSON policy elements: Principal

You cannot use a wildcard to match part of a principal name or ARN.

显然,由于 Principal 本身不能包含任何通配符,所以我最终尝试了这样的操作:

        AssumeRolePolicyDocument:
          Statement:
            - Action: [ 'sts:AssumeRole' ]
              Effect: Allow
              Principal:
                AWS: '*'
              Condition:
                StringLike: { "aws:PrincipalArn" : !FindInMap [ TestRoleMapping, !Ref 'AWS::Region', !Ref Stage ] }

并按照我最初的意图在角色映射中包含了通配符:

  Mappings:
    TestRoleMapping:
      us-east-1:
        beta: ['arn:aws:iam::11111111111:role/somePrefix-*-TestInvocationRole', 'arn:aws:iam::2222222222:role/TestInvocationRole']
        prod: ....

这似乎有效。但是,我在 IAM 控制台中收到有关主体为“*”的警告,我不确定这是否是最佳做法。仍然对更好的想法持开放态度。