如何创建具有 Public 读取权限的存储桶?

How to create a bucket with Public Read Access?

我想对 serverless.yml 文件的 "public" 文件夹中我存储桶中的所有项目启用 Public 读取访问权限。

目前这是我用来声明我的存储桶的定义代码。它是从无服务器堆栈示例之一复制和粘贴的。

Resources:
  AttachmentsBucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      # Set the CORS policy
      BucketName: range-picker-bucket-${self:custom.stage}
      CorsConfiguration:
        CorsRules:
          -
            AllowedOrigins:
              - '*'
            AllowedHeaders:
              - '*'
            AllowedMethods:
              - GET
              - PUT
              - POST
              - DELETE
              - HEAD
            MaxAge: 3000

# Print out the name of the bucket that is created
Outputs:
  AttachmentsBucketName:
    Value:
      Ref: AttachmentsBucket

现在,当我尝试对文件使用 url 时,它 returns 访问被拒绝。我必须在 aws-s3 网络界面中手动设置每个文件的 public 读取权限。

我做错了什么?

而不是在存储桶上使用 CorsConfiguration,您需要对它使用 attach a bucket policy。请尝试以下操作:

Resources:
  AttachmentsBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: range-picker-bucket-${self:custom.stage}

  AttachmentsBucketAllowPublicReadPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref AttachmentsBucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement: 
          - Effect: Allow
            Action: 
              - "s3:GetObject"
            Resource: 
              - !Join ['/', [!Ref AttachmentsBucket, 'public']]
            Principal: "*"

正如其他人所说,您需要实施 存储桶策略 ,例如:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{NAME_OF_YOUR_BUCKET_HERE}/*"
        }
    ]
} 

这可以在 AWS 控制台中完成,方法是选择 Bucket,然后选择 Permissions,然后选择 Bucket Policy。看起来@Milan C. 正在指示如何在 serverless.yml 文件中声明它。

已接受的答案对我不起作用。 CloudFormation 无法更新资源,出现错误:

Action does not apply to any resource(s) in statement (Service: Amazon S3; Status Code: 400; Error Code: MalformedPolicy; Request ID: <...>; S3 Extended Request ID: <...>; Proxy: null)

资源定义中似乎缺少通配符。对我有用的完整代码段:

PublicBucket:
  Type: AWS::S3::Bucket
  Properties:
    BucketName: 'public-bucket-name'

PublicBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    Bucket: !Ref PublicBucket
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Action:
            - 's3:GetObject'
          Resource:
            - !Join ['/', [!GetAtt [PublicBucket, Arn], '*']]
          Principal: '*'