使用 Amazon S3 托管静态网站 一文里演示了把网站发布到 S3 bucket。尽管为 bucket 设置了 public read 权限,但访问者默认仍不能读取 bucket 里的内容,需要我手工选中 bucket 里所有文件,并执行 make public。而每次有新的内容,我就需要把这个步骤重复一遍。

AWS 的文档不太好读,权限设置有不同的方法,也分不同的级别。目前我的认知,bucket 里的文件的权限,是属于 object 级别(不同于 bucket 级别),可以通过添加 Bucket Policy 来设置。

如何添加 Bucket Policy 可以参考文档的 How Do I Add an S3 Bucket Policy? 一节,Bucket Policy 是 JSON 格式,不熟悉 JSON 的可以跟着文档中的指示,打开 Policy generator 来生成。

参照下表填入对应的值(注意只给予所需的最小权限),点击 Add Statement,然后再点击 Generate Policy,生成 Policy 文件。

Field Value Description
Type of Policy S3 Bucket Policy
Effect Allow 允许
Principal * 所有人
AWS Service Amazon S3
Actions GetObject 获取 bucket 中的文件(object)
Amazon Resource Name arn:aws:s3:::bucket_name/* 填入你的 bucket name

生成的 Policy 文件内容如下

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

复制文件内容,填入 Bucket policy editor,保存即可。这个 policy 赋予了所有人访问该 bucket 中文件的权限,我以后更新网站也不用再每次设置权限了。