背景
众所周知 AWS 的产品都非常的复杂与抽象, 如果没有系统性的认知, 自行摸索 S3 的权限管理是非常消耗精力与时间的. 所以这里记录一下 S3 的权限管理模式与开启公开访问权限的基本路径.
正文
0x1 创建 Bucket
所有的权限配置从这里开始, 第一步不能错.
当我们新建一个Bucket时, 将Bucket的名称添加为之后可能的域名映射可以避免复杂的配置, 如 s3.example.com
:
0x2 配置 ACL 所有权
ACL 控制指其他的AWS账户是否能够写入此 Bucket, 一般来说我们的 Bucket 都是私有的, 所以不应该开启这个选项:
0x3 配置公共访问设置
开启公开访问的权限是必须的, 它是所有Bucket资源可通过链接外部访问的必要条件, 所以我们需要关闭 阻止所有公开访问 的限制并开启公开访问权限. 最后还须要勾选风险提示才能成功创建 Bucket, 如图:
这一步完成之后直接点击创建存储桶即可.
0x4 配置已创建的Bucket的权限策略
创建好的Bucket可以在 Amazon 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:
保存策略后即可通过资源链接直接访问, 可以进入 对象 页上传图片/文件进行测试.
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 服务实现
拿到URL后在用这个 hostname 配置 CNAME(s3.ap-southeast-1.amazonaws.com) 至 Cloudflare 的 DNS 配置即可, 如图:
这样就可以通过 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 的导入证书页, 具体填写规则如下:
成功导入后在 CloudFront 中创建分配:
关闭 WAF, 此项为必选, 我们通过 Cloudflare 管理后续的 DNS 流量自然不需要此项, 毕竟 Cloudflare 免费:
然后还需要添加备用的域名与此域名的 SSL 证书, 否则无法通过此域名访问 CloudFront:
创建后就可以拿到 CloudFront 的访问域名了, 然后同上一步一样, 在 Cloudflare 中配置 CNAME 为此域名即可:
相关链接与推荐
Policies and Permissions (S3 Bucket权限策略)