【问题标题】:AWS - Assign an IAM profile based on a Mapping lookup in CF templateAWS - 根据 CF 模板中的映射查找分配 IAM 配置文件
【发布时间】:2018-07-19 09:10:07
【问题描述】:

在我的 Cloud Formation 模板中,我有不同环境的 IAM 映射:

Mappings:
  EnvironmentToIAMInstanceProfileARN:
    dev:
      Profile: [ "arn:aws:iam::0000000000:role/AnInstanceProfile" ]
    test:
      Profile: [ "arn:aws:iam::0000000001:role/AppServerInstanceProfile", 
                  "arn:aws:iam::0000000001:role/AppProvisioningRole"]

我正在创建一个 S3 存储桶,需要向委托人提供 IAM 配置文件:

 AppS3BucketPolicy:
    Type: 'AWS::S3::BucketPolicy'
    Properties:
      Bucket: !Ref S3NameParam
      PolicyDocument:
        Statement:
          - Sid: 'Restrict access to the IAM Instance ARN'
            Effect: Allow
            Principal: '*' # !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]
            Action: 
              - 's3:GetBucketAcl'
              - 's3:GetBucketLocation'
              - 's3:GetObject'
              - 's3:ListBucket'
              - 's3:PutObject'
            Resource:
              - !Join 
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref S3NameParam
                  - ''
              - !Join 
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref S3NameParam
                  - /*

如果我将 '*' 分配给 Prinicpal,它可以工作,但是我正在尝试查找映射:

Principal: !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]

这不起作用并导致错误:

存储桶策略语法无效。 (服务:Amazon S3;状态代码:400; 错误代码:MalformedPolicy;

有谁知道我该怎么做,或者为什么会失败?

ps EnvType 参数确实存在:

Parameters:
  EnvType:
    Description: Environment Name
    Default: test
    Type: String
    AllowedValues:  [dev, test, prod]

【问题讨论】:

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


    【解决方案1】:

    根据这篇文章语法需要有Service。 https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html

    JSON:

     "Principal": {
            "Service": [
              "elasticmapreduce.amazonaws.com",
              "datapipeline.amazonaws.com"
            ]
    

    但是,根据其他一些文档,我制定了它的 AWS 不是服务:

    JSON:

      "Principal": {
            "AWS": [
              "elasticmapreduce.amazonaws.com",
              "datapipeline.amazonaws.com"
            ]
    

    YAML 中的解决方案:

      Principal:
         AWS: 
           !FindInMap [EnvironmentToIAMInstanceProfileARN, !Ref 'EnvType', Profile]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多