背景

众所周知 AWS 的产品都非常的复杂与抽象, 如果没有系统性的认知, 自行摸索 S3 的权限管理是非常消耗精力与时间的. 所以这里记录一下 S3 的权限管理模式与开启公开访问权限的基本路径.

正文

0x1 创建 Bucket

所有的权限配置从这里开始, 第一步不能错.

当我们新建一个Bucket时, 将Bucket的名称添加为之后可能的域名映射可以避免复杂的配置, 如 s3.example.com:

AWS S3 Bucket 权限管理

0x2 配置 ACL 所有权

ACL 控制指其他的AWS账户是否能够写入此 Bucket, 一般来说我们的 Bucket 都是私有的, 所以不应该开启这个选项:

AWS S3 Bucket 权限管理

0x3 配置公共访问设置

开启公开访问的权限是必须的, 它是所有Bucket资源可通过链接外部访问的必要条件, 所以我们需要关闭 阻止所有公开访问 的限制并开启公开访问权限. 最后还须要勾选风险提示才能成功创建 Bucket, 如图:

AWS S3 Bucket 权限管理

这一步完成之后直接点击创建存储桶即可.

0x4 配置已创建的Bucket的权限策略

创建好的Bucket可以在 Amazon S3 > 存储桶 中访问, 我们点击创建好的 Bucket 进入详情页然后点击 权限 进入配置页:

AWS S3 Bucket 权限管理

然后点击存储桶策略的编辑按钮进入编辑策略的状态:

AWS S3 Bucket 权限管理

将以下内容粘贴至编辑器中, 这段策略的意思为 允许所有人访问 s3.example.com / 路径下的所有资源*:

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

Resource 字段可以直接复制上方的存储桶 ARN:

AWS S3 Bucket 权限管理

保存策略后即可通过资源链接直接访问, 可以进入 对象 页上传图片/文件进行测试.

0x5 获取 Bucket 资源 URL 配置 Cloudflare

上传一个文件后即可通过该文件的链接获取 URL:

一般来说, s3.example.com 这种域名(或者说非法 URI Path) Bucket 的资源 URL 都是由该 AWS S3 Bucket 的区域资源名称 s3.example.com 资源名称即 https://s3.{AWS Region ID}.amazonaws.com/{domain}/{object name}, 如下图的 s3.ap-southeast-1.amazonaws.com/s3.example.… 就符合这个条件.

如果不符合该url 那么后续的步骤可能会失败, 需要使用 CloudFront 服务实现

AWS S3 Bucket 权限管理

拿到URL后在用这个 hostname 配置 CNAME(s3.ap-southeast-1.amazonaws.com) 至 Cloudflare 的 DNS 配置即可, 如图:

AWS S3 Bucket 权限管理

这样就可以通过 https://s3.example.com/{object name} 来访问资源了.

0x6 使用 AWS CloudFront CDN 配置 Cloudflare

如果你的 Bucket 已经创建或者最终获得的 URL 不符合 https://s3.{AWS Region ID}.amazonaws.com/{domain}/{object name} 的模式就需要通过 CloudFront 来实现自定义域名的访问了 (这里特指非 AWS 的外部 DNS 域名服务商).

在创建 CloudFront 配置之前, 我们需要先导入 SSL 证书以支持后续 https 的访问.

导入证书需要先有 SSL 证书, 这里推荐使用 Let’s Encrypt 创建免费证书, 具体的步骤可以参考 -> 入门指南.

获取到证书后, 一定记得把区域换成 美国东部 (弗吉尼亚北部) us-east-1, 因为在 CloudFront 中, 只能使用这个区域的证书!!!

导入证书在 AWS Certificate Manager 的导入证书页, 具体填写规则如下:

AWS S3 Bucket 权限管理

成功导入后在 CloudFront 中创建分配:

AWS S3 Bucket 权限管理

关闭 WAF, 此项为必选, 我们通过 Cloudflare 管理后续的 DNS 流量自然不需要此项, 毕竟 Cloudflare 免费:

AWS S3 Bucket 权限管理

然后还需要添加备用的域名与此域名的 SSL 证书, 否则无法通过此域名访问 CloudFront:

AWS S3 Bucket 权限管理

创建后就可以拿到 CloudFront 的访问域名了, 然后同上一步一样, 在 Cloudflare 中配置 CNAME 为此域名即可:

AWS S3 Bucket 权限管理

相关链接与推荐

Policies and Permissions (S3 Bucket权限策略)

Intermediate Certificates (证书链)

将阿拉伯数字的价格转换为中文价格的实现