0

我编写了一个 Lambda 函数来创建数据集导入作业(链接到 API)。该请求的Datasource属性需要一个S3 Config 项,该项又包含一个IAM 角色,“Amazon Forecast 可以假定该角色访问 Amazon S3 存储桶或文件”。

在尝试遵循最少访问的原则时,我想给予该角色(下面的 Cloud Formation 定义)尽可能少的权限。我可以将其操作限制为仅列出和获取;但是,除非我授予它访问权限,否则它不起作用Resource: *。我更愿意让它访问Resource: arn:aws:s3:::my-bucket/*(或更好Resource: arn:aws:s3:::my-bucket/path/to/my_file.csv。我得到的错误消息(使用时Resource: *)是

调用 HeadObject 操作时发生错误 (404):未找到

或者

调用 HeadObject 操作时发生错误 (403): Forbidden

取决于我是在本地运行(通过 SAM CLI)还是在 LAMBDA 控制台中运行。

¿ 有没有人遇到过一个原因,为什么 Forecast 在创建数据集导入作业时会出错而没有对所有s3 的只写访问权限,而不是只有一个存储桶,或者更好的是一个文件?

  CreateDatasetImportJobS3Role:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - forecast.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        -
          PolicyName: ReadFromBucketPolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              -
                Effect: Allow
                Action:
                  - s3:ListBucket
                  - s3:GetObject
                # I'd like to be able to do this without a STAR resource;
                # however, it doesn't seem to work without
                Resource: "*"
4

1 回答 1

1

s3://my-bucket/*不是正确的格式。正确的格式必须是有效的 ARN,例如arn:aws:s3:::my-bucket/*. 此外,当您有 ListBucket 之类的 API 操作时,您需要列出存储桶 ARN而不是该存储桶中的标签。所以你真的应该将 Resource 指定为arn:aws:s3:::my-bucket.

为了安全起见,我通常会将两者都放在一起,制定您的最终政策:

Resource: 
   - "arn:aws:s3:::my-bucket"
   - "arn:aws:s3:::my-bucket/*"

第一个资源 ,arn:aws:s3:::my-bucket涵盖诸如 ListBucket 之类的操作。第二个资源 ,arn:aws:s3:::my-bucket/*涵盖诸如 GetObject 之类的操作(因为对象本身将位于通配符所涵盖的路径下)。

于 2020-03-09T16:32:09.930 回答