如何使用 CloudFront 为 Amazon S3 上托管的静态网站提供服务?

3 分钟阅读
0

我想在 Amazon Simple Storage Service (Amazon S3)桶上托管一个静态网站。然后,我想通过 Amazon CloudFront 分配为我的网站提供服务。

简短描述

要为托管在 Amazon S3 上的静态网站提供服务,请使用以下配置之一部署 CloudFront 分配:

  • 使用 REST API 端点作为源,并使用来源访问控制(OAC)或来源访问身份(OAI)限制访问
    **注意:**最佳实践是使用来源访问控制(OAC)来限制访问。来源访问身份(OAI)是此过程的传统方法。
  • 使用网站端点作为来源,并允许匿名(公共)访问
  • 使用网站端点作为来源,并使用 Referer 标头限制访问
  • 使用 AWS CloudFormation 部署静态网站端点作为来源,并部署指向 CloudFront 的自定义域名

有关这两种端点类型的更多信息,请参阅网站端点和 REST API 端点之间的主要区别

解决方法

要使用要用作来源的 S3 端点类型配置 CloudFront 分配,请完成以下步骤:

使用 REST API 端点作为来源,并使用 OAC 或 OAI(旧版)限制访问权限

  1. 使用 Amazon S3 控制台创建桶上传您的网站文件

**注意:**对于此配置,您无需在桶上开启静态网站托管。此配置使用桶的 REST API 端点,而不是静态网站托管功能中的网站端点。

  1. 创建 CloudFront Web 分配。除了用例分配设置外,还要完成以下任一部分中的步骤以限制对 Amazon S3 来源的访问。使用 OAI 是一种最佳实践,因为 OAI 是一种传统设置。

OAC

创建分配时,请在来源域字段中输入您的 Amazon S3 桶名称。

来源访问部分中,选择来源访问控制设置(推荐)

来源访问控制下拉列表中,选择 OAC 名称并选择创建控制设置

在对话框中,将您的控制设置命名为**。**最佳实践是保留默认设置 Sign requests(推荐)。然后,选择创建。

CloudFront 为您提供策略语句,允许您在创建分配后授予 OAC 访问您的 Amazon S3 桶的权限。选择复制策略并将策略粘贴到您的 S3 桶策略配置中。

OAI

创建分配时,请在来源域字段中输入您的 Amazon S3 桶名称。

来源访问权限下,选择旧版访问身份

来源访问身份下拉列表中,选择来源访问身份名称。然后,选择创建新的 OAI

在对话框中,命名新的来源访问身份并选择创建

桶策略处,选择是,更新桶策略

  1. 在创建分配时,最佳实践是为网站使用 SSL(HTTPS)。 要将自定义域名与 HTTPS 配合使用,请选择自定义 SSL 证书。选择申请证书以申请新证书。如果您不使用自定义域名,您仍然可以使用 HTTPS 和 cloudfront.net 域名进行分配。
    **重要事项:**如果您为分配输入备用域名(CNAME),则 CNAME 必须与您选择的 SSL 证书相匹配。要解决您的 SSL 证书问题,请参阅如何解决在我的 CloudFront 分配中使用自定义 SSL 证书时遇到的问题?

  2. 更新域的 DNS 记录,将网站域指向 CloudFront 。您可以在 CloudFront 控制台中查找分配的域名。该域名类似于以下示例:d1234abcd.cloudfront.net

  3. 等待 DNS 更改传播并等待先前的 DNS 条目过期。
    注意: 先前的 DNS 值过期所需时长取决于托管区域中设置的 TTL 值。这还取决于您的本地解析器是否使用这些 TTL 值。

使用网站端点作为来源,并允许匿名(公共)访问

此配置允许公众访问您网站的桶。有关更多信息,请参阅设置网站访问权限
**注意:**当您使用 Amazon S3 静态网站端点时,CloudFront 和 Amazon S3 之间的连接只能通过 HTTP 进行。要使用 HTTPS 建立 CloudFront 和 Amazon S3 之间的连接,请为来源配置 S3 REST API 端点。

  1. 使用 Amazon S3 控制台创建桶并在该桶上开启静态网站托管
  2. 静态网站托管对话框中,复制桶的端点,但不要复制先导符 http://。格式类似于 DOC-EXAMPLE-BUCKET.s3-website-region.amazonaws.com。您将后面的步骤中用到此格式的端点。
  3. 添加允许公众对您创建的桶进行读取访问的桶策略。
    **注意:**对于此配置,必须关闭 S3 桶的阻止公共访问设置。如果您的用例要求开启封锁公共访问设置,请使用 REST API 端点作为来源。然后,通过来源访问控制(OAC)或来源访问身份(OAI)限制访问。
  4. 创建 CloudFront Web 分配。除了您的用例设置外,还要完成以下步骤:
    来源域处,输入您在上一步中复制的端点。
    **注意:**不要从下拉列表中选择桶。下拉列表仅包含此配置中未使用的 S3 Bucket REST API 端点。
  5. 在创建分配时,最佳实践是为网站使用 SSL(HTTPS)。要将自定义域名与 HTTPS 配合使用,请选择自定义 SSL 证书。选择申请证书以申请新证书。如果您不使用自定义域,则仍然可以使用 HTTPS 和 cloudfront.net 域名进行分配。
    **重要事项:**如果您为分配输入备用域名(CNAME),则 CNAME 必须与您选择的 SSL 证书相匹配。要解决您的 SSL 证书问题,请参阅如何解决在我的 CloudFront 分配中使用自定义 SSL 证书时遇到的问题?
  6. 更新域的 DNS 记录,将网站域指向 CloudFront。您可以在 CloudFront 控制台中查找分配的域名。域名格式类似于以下示例:d1234abcd.cloudfront.net
  7. 等待 DNS 更改传播并等待先前的 DNS 条目过期。
    注意: 先前的 DNS 值过期所需时长取决于托管区域中设置的 TTL 值。这还取决于您的本地解析器是否使用这些 TTL 值。

使用网站端点作为来源,并使用 Referer 标头限制访问

**重要事项:**查看此设置允许的访问权限是否符合您的用例要求。

此配置通过在分配上设置自定义 Referer 标头来限制访问权限。然后,其使用桶策略仅允许使用自定义 Referer 标头的请求进行访问。

**注意:**当您使用 Amazon S3 静态网站端点时,CloudFront 和 Amazon S3 之间的连接只能通过 HTTP 进行。要使用 HTTPS 建立 CloudFront 和 Amazon S3 之间的连接,请为来源配置 S3 REST API 端点。

  1. 使用 Amazon S3 控制台创建桶并在该桶上开启静态网站托管
  2. 静态网站托管对话框中,复制桶的端点,但不要复制先导符 http://。格式类似于 DOC-EXAMPLE-BUCKET.s3-website-region.amazonaws.com。您将后面的步骤中用到此格式的端点。
  3. 创建 CloudFront Web 分配。除了您的用例设置外,还要完成以下步骤:
    来源域处,输入您在上一步中复制的端点。
    注意:不要从下拉列表中选择桶。下拉列表仅包含此配置未使用的 S3 Bucket REST API 端点。
    添加自定义标题
    下,选择添加标题
    标题名称处,输入 Referer
    处,输入要转发到来源(S3 桶)的自定义标题值。要限制对来源的访问,请输入只有您知道的随机值或机密值。
  4. 在创建分配时,最佳实践是为网站使用 SSL(HTTPS)。要将自定义域名与 HTTPS 配合使用,请选择自定义 SSL 证书。选择申请证书以申请新证书。如果您不使用自定义域名,您仍然可以使用 HTTPS 和 cloudfront.net 域名进行分配。
    **重要事项:**如果您为分配输入备用域名(CNAME),则 CNAME 必须与您选择的 SSL 证书相匹配。要解决您的 SSL 证书问题,请参阅如何解决在我的 CloudFront 分配中使用自定义 SSL 证书时遇到的问题?
  5. Amazon S3 控制台打开您网站的桶。然后,添加桶策略在请求包含自定义 Referer 标头的情况下允许 s3:GetObject,该标头即您在第 3 步中指定的标头。对于此配置,必须关闭 S3 桶的阻止公共访问设置。Amazon S3 将会考虑授予 Referer 限制的匿名访问权限为公开的桶策略。如果您的用例要求您开启阻止公共访问设置,请使用 REST API 端点作为来源。然后,通过来源访问控制(OAC)或来源站访问身份(OAI)限制访问。
    **注意:**要阻止任何不包含自定义 Referer 标头的请求的访问权限,请在桶策略中使用显式拒绝声明。
  6. 更新域的 DNS 记录,将网站域指向 CloudFront。您可以在 CloudFront 控制台中查找分配的域名。域名类似于以下示例:d1234abcd.cloudfront.net
  7. 等待 DNS 更改传播并等待先前的 DNS 条目过期。
    注意: 先前的 DNS 值过期所需时长取决于托管区域中设置的 TTL 值。这还取决于您的本地解析器是否使用这些 TTL 值。

使用 CloudFormation 将静态网站端点部署为来源,并自定义指向 CloudFront 的域

此解决方法为您的网站使用以下配置:

  • 使用 CloudFormation 部署您的网站
  • 在 Amazon S3 上托管您的网站
  • 使用 CloudFront 分配您的网站
  • 使用 AWS Certificate Manager (ACM)颁发的 SSL/TLS 证书
  • 使用 CloudFront 响应标头策略向每个服务器响应添加安全标头

有关如何部署此解决方案的说明,请参阅 GitHub 网站上的 Amazon CloudFront 安全静态网站

相关信息

安全静态网站入门

电子邮件验证

DNS 验证

使用备用域名和 HTTPS

AWS 官方
AWS 官方已更新 6 个月前