【问题标题】:Create IAM role from template in SAM从 SAM 中的模板创建 IAM 角色
【发布时间】:2021-09-05 04:36:03
【问题描述】:

我正在尝试将 IAM 角色添加到已经存在的模板中,该模板允许从外部源(雪花)对存储桶进行特定访问

RoleNameForAccess:
    Type: AWS::IAM::Role
    Properties: 
      RoleName: RoleNameForAccess
      Description: A role that allows snowflake to access the bucket
      Policies: 
        - PolicyName: 'SnowflakePolicyRole'
        - PolicyDocument:
          - Version: '2012-10-17'
            Statement:
            - Effect: Allow
              Action: 
                - s3:PutObject
                - s3:GetObject
                - s3:GetObjectVersion
                - s3:DeleteObject
                - s3:DeleteObjectVersion
              Resource: arn:aws:s3:::bucket-name/*
            - Effect: Allow
              Action: s3:ListBucket
              Resource: arn:aws:s3:::bucket-name
              Condition:
                StringLike:
                  s3:prefix:
                  - "*"

但它不断抛出错误:

Property PolicyDocument cannot be empty.

如果我在政策文档中使用破折号,我会收到以下错误:

Value of property PolicyDocument must be an object

也许我遗漏了一些语法,但找不到它是什么。

谢谢

【问题讨论】:

    标签: amazon-s3 amazon-cloudformation amazon-iam aws-sam-cli


    【解决方案1】:

    PolicyNameAssumeRolePolicyDocument 丢失。根据用户指南here 更新。您可以根据您的要求更改以下更新中AssumeRolePolicyDocument 部分中的Principal

      RoleNameForAccess:
        Type: AWS::IAM::Role
        Properties:
          AssumeRolePolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Principal:
                  AWS:
                    - arn:aws:iam::111111111111:user/testuser
                Action:
                  - 'sts:AssumeRole'
          RoleName: RoleNameForAccess
          Description: A role that allows snowflake to access the bucket
          Policies: 
            - PolicyName: SnowflakePolicyRole
              PolicyDocument:
                Version: '2012-10-17'
                Statement:
                  - Effect: Allow
                    Action: 
                      - s3:PutObject
                      - s3:GetObject
                      - s3:GetObjectVersion
                      - s3:DeleteObject
                      - s3:DeleteObjectVersion
                    Resource: arn:aws:s3:::bucket-name/*
                  - Effect: Allow
                    Action: s3:ListBucket
                    Resource: arn:aws:s3:::bucket-name
                    Condition:
                      StringLike:
                        s3:prefix:
                        - "*"
    

    【讨论】:

    • 哦,所以策略文档是策略的属性,而不是实际资源的属性。好的,我很欣赏它。
    【解决方案2】:

    你有一个非常小的错误。您可以拥有多个策略,因此 Policies 是一个数组。

    RoleNameForAccess:
        Type: AWS::IAM::Role
        Properties: 
          RoleName: RoleNameForAccess
          Description: A role that allows snowflake to access the bucket
          Policies: 
            - PolicyDocument:
                Version: '2012-10-17'
                Statement:
                  - Effect: Allow
                    Action: 
                      - s3:PutObject
                      - s3:GetObject
                      - s3:GetObjectVersion
                      - s3:DeleteObject
                      - s3:DeleteObjectVersion
                    Resource: arn:aws:s3:::bucket-name/*
                  - Effect: Allow
                    Action: s3:ListBucket
                    Resource: arn:aws:s3:::bucket-name
                    Condition:
                      StringLike:
                        s3:prefix:
                        - "*"
    

    【讨论】:

    • 现在询问我的策略名称,我应该在哪里添加它?
    • 我的错。我没有注意到 PolicyDocument 中的数组。我修复了我的答案以删除它。
    • 我不断收到缺少 PolicyName 的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2019-12-29
    • 1970-01-01
    • 2019-05-21
    • 2020-02-14
    • 2018-01-20
    • 2018-04-15
    相关资源
    最近更新 更多