如何使用 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 来源的访问。最佳实践是使用 OAC,因为 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

5.    等待 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 桶 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 桶 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 桶的阻止公共访问设置。对于 Referer 限制的匿名访问授权的桶策略,Amazon S3 会将其视为公开。如果您的用例要求您开启阻止公共访问设置,请使用 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 官方已更新 10 个月前