

# CloudFront 入门
<a name="GettingStarted"></a>

此部分中的主题向您展示如何开始通过 Amazon CloudFront 交付内容。

[设置您的 AWS 账户](setting-up-cloudfront.md)主题介绍了以下教程的先决条件，例如创建AWS 账户和创建具有管理权限的用户。

基础分配教程将向您演示如何设置源访问控制（OAC，Origin Access Control），以便将经过身份验证的请求发送到 Amazon S3 源。

安全静态网站教程向您演示如使用 OAC 和 Amazon S3 源，为您的域名创建安全静态网站。本教程使用 Amazon CloudFront（CloudFront）模板进行配置和部署。

**Topics**
+ [

# 设置您的 AWS 账户
](setting-up-cloudfront.md)
+ [

# 开始使用 CloudFront 标准分配
](GettingStarted.SimpleDistribution.md)
+ [

# 开始使用标准分配（AWS CLI）
](get-started-cli-tutorial.md)
+ [

# 安全静态网站入门
](getting-started-secure-static-website-cloudformation-template.md)

# 设置您的 AWS 账户
<a name="setting-up-cloudfront"></a>

本主题介绍了准备使用 Amazon CloudFront 的预备步骤（如创建 AWS 账户）。

**Topics**
+ [

## 注册 AWS 账户
](#sign-up-for-aws)
+ [

## 创建具有管理访问权限的用户
](#create-an-admin)
+ [

## 选择如何访问 CloudFront
](#introduction-accessing-cloudfront)

## 注册 AWS 账户
<a name="sign-up-for-aws"></a>

如果您还没有，AWS 账户请完成以下步骤来创建一个。

**注册 AWS 账户**

1. 打开 [https://portal.aws.amazon.com/billing/signup](https://portal.aws.amazon.com/billing/signup)。

1. 按照屏幕上的说明操作。

   在注册时，将接到电话或收到短信，要求使用电话键盘输入一个验证码。

   当您注册 AWS 账户 时，系统将会创建一个。*AWS 账户根用户*根用户有权访问该账户中的所有 AWS 服务 和资源。作为最佳安全实践，请为用户分配管理访问权限，并且只使用根用户来执行[需要根用户访问权限的任务](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

注册过程完成后，AWS 会向您发送一封确认电子邮件。在任何时候，您都可以通过转至 [https://aws.amazon.com/](https://aws.amazon.com/) 并选择**我的账户**来查看当前的账户活动并管理您的账户。

## 创建具有管理访问权限的用户
<a name="create-an-admin"></a>

注册 AWS 账户 后，请保护好您的，AWS 账户根用户启用，AWS IAM Identity Center并创建一个管理用户，以避免使用根用户执行日常任务。

**保护您的 AWS 账户根用户**

1.  选择**根用户**并输入您的 AWS 账户 电子邮件地址，以账户拥有者身份登录。[AWS 管理控制台](https://console.aws.amazon.com/)在下一页上，输入您的密码。

   要获取使用根用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in as the root user](https://docs.aws.amazon.com/signin/latest/userguide/console-sign-in-tutorials.html#introduction-to-root-user-sign-in-tutorial)。

1. 为您的根用户启用多重身份验证（MFA）。

   有关说明，请参阅《IAM 用户指南》**中的[为 AWS 账户 根用户启用虚拟 MFA 设备（控制台）](https://docs.aws.amazon.com/IAM/latest/UserGuide/enable-virt-mfa-for-root.html)。

**创建具有管理访问权限的用户**

1. 启用 IAM Identity Center。

   有关说明，请参阅**《AWS IAM Identity Center 用户指南》中的[启用 AWS IAM Identity Center](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-set-up-for-idc.html)。

1. 在 IAM Identity Center 中，为用户授予管理访问权限。

   有关如何使用 IAM Identity Center 目录 作为身份源的教程，请参阅**《AWS IAM Identity Center 用户指南》中的 [Configure user access with the default。IAM Identity Center 目录](https://docs.aws.amazon.com//singlesignon/latest/userguide/quick-start-default-idc.html)

**以具有管理访问权限的用户身份登录**
+ 要使用您的 IAM Identity Center 用户身份登录，请使用您在创建 IAM Identity Center 用户时发送到您的电子邮件地址的登录 URL。

  要获取使用 IAM Identity Center 用户登录方面的帮助，请参阅《AWS 登录 用户指南》**中的 [Signing in to the AWS access portal](https://docs.aws.amazon.com/signin/latest/userguide/iam-id-center-sign-in-tutorial.html)。

**将访问权限分配给其他用户**

1. 在 IAM Identity Center 中，创建一个权限集，该权限集遵循应用最低权限的最佳做法。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Create a permission set](https://docs.aws.amazon.com//singlesignon/latest/userguide/get-started-create-a-permission-set.html)。

1. 将用户分配到一个组，然后为该组分配单点登录访问权限。

   有关说明，请参阅《AWS IAM Identity Center 用户指南》**中的 [Add groups](https://docs.aws.amazon.com//singlesignon/latest/userguide/addgroups.html)。

## 选择如何访问 CloudFront
<a name="introduction-accessing-cloudfront"></a>

您可以通过以下方式访问 Amazon CloudFront：
+ **AWS 管理控制台** – 该指南中的过程介绍了如何使用 AWS 管理控制台 执行任务。
+ **AWS 开发工具包** – 如果您使用 AWS 为其提供开发工具包的编程语言，您可以使用开发工具包访问 CloudFront。开发工具包可简化身份验证、与您的开发环境轻松集成，并有助于访问 CloudFront 命令。有关更多信息，请参阅 [将 CloudFront 与 AWS SDK 配合使用](sdk-general-information-section.md)。
+ **CloudFront API** – 如果要使用开发工具包不可用的编程语言，请参阅[《Amazon CloudFront API 参考》](https://docs.aws.amazon.com/cloudfront/latest/APIReference/Welcome.html)，以了解有关 API 操作及如何发出 API 请求的信息。
+ **AWS CLI** – AWS Command Line Interface（AWS CLI）是一个用于管理AWS 服务的统一工具。有关如何安装和配置 AWS CLI 的信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ **适用于 Windows PowerShell 的工具** – 如果您有使用 Windows PowerShell 的经验，则可能更愿意使用 AWS Tools for Windows PowerShell。有关更多信息，请参阅《AWS Tools for PowerShell 用户指南》**中的[安装 AWS Tools for Windows PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

# 开始使用 CloudFront 标准分配
<a name="GettingStarted.SimpleDistribution"></a>

本节中的过程将介绍如何使用 CloudFront 来设置执行以下操作的标准分配：
+ 创建要用作分配源的 S3 存储桶。
+ 将对象的原始版本存储在一个 Amazon Simple Storage Service (Amazon S3) 存储桶中
+ 使用源访问控制（OAC）将经过身份验证的请求发送到您的 Amazon S3 源。OAC 通过 CloudFront 发送请求，以防止查看器直接访问您的 S3 存储桶。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。
+ 将 URL 中的 CloudFront 域名用于您的对象（例如，`https://d111111abcdef8.cloudfront.net/index.html`）
+ 在 CloudFront 边缘站点上将您的对象保留默认的 24 小时持续时间（最短持续时间为 0 秒）

其中大部分是在创建 CloudFront 分配时自动为您配置的。

**Topics**
+ [

## 先决条件
](#GettingStartedSignup)
+ [

## 创建 Amazon S3 存储桶
](#GettingStartedCreateBucket)
+ [

## 将内容上传到存储桶
](#GettingStartedUploadContent)
+ [

## 创建将 Amazon S3 源与 OAC 结合使用的 CloudFront 分配
](#GettingStartedCreateDistribution)
+ [

## 通过 CloudFront 访问您的内容
](#GettingStartedAccessingDistributions)
+ [

## 清理
](#GettingStartedDistributionCleanup)
+ [

## 增强基本分配
](#GettingStartedDistributionNotes)

## 先决条件
<a name="GettingStartedSignup"></a>

开始之前，请确保您已完成[设置您的 AWS 账户](setting-up-cloudfront.md)中的步骤。

## 创建 Amazon S3 存储桶
<a name="GettingStartedCreateBucket"></a>

Amazon S3 存储桶是文件（对象）或文件夹的容器。当 Amazon S3 存储桶作为源时，CloudFront 可以为您分发几乎任何类型的文件。例如，CloudFront 可以分配文本、图像和视频。您可以在 Amazon S3 上存储的数据量没有上限。

在本教程中，您将使用提供的 `hello world` 文件示例创建一个 S3 存储桶，您将使用这些文件创建基本网页。

**创建存储桶**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 建议您使用我们的 Hello World 示例作为入门指导。下载 *hello world* 网页：[hello-world-html.zip](samples/hello-world-html.zip)。将其解压缩，然后将 `css` 文件夹和 `index` 文件保存到方便的位置，例如运行浏览器的桌面。

1. 选择**创建存储桶**。

1. 输入符合**《Amazon Simple Storage Service 用户指南》中[通用存储桶命名规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html#general-purpose-bucket-names)的唯一**存储桶名称**。

1. 对于**区域**，建议选择地理位置靠近您的 AWS 区域。（这可以降低延迟和成本。）
   + 也可以选择其他区域。例如，您可以这样做来满足监管要求。

1. 将所有其他设置保留默认值，然后选择**创建存储桶**。

## 将内容上传到存储桶
<a name="GettingStartedUploadContent"></a>

创建 Amazon S3 存储桶后，将解压缩的 `hello world` 文件内容上传到该存储桶。（您已在 [创建 Amazon S3 存储桶](#GettingStartedCreateBucket) 中下载并解压缩此文件。）

**将内容上传到 Amazon S3**

1. 在**通用存储桶**部分，选择新存储桶的名称。

1. 选择**上传**。

1. 在**上传**页面，将 `css` 文件夹和 `index` 文件拖到拖放区域。

1. 将所有其他设置保留为原定设置值，然后选择**上传**。

## 创建将 Amazon S3 源与 OAC 结合使用的 CloudFront 分配
<a name="GettingStartedCreateDistribution"></a>

在本教程中，您将创建一个使用 Amazon S3 源和源访问控制（OAC）的 CloudFront 分配。OAC 可帮助您安全地将经过身份验证的请求发送到 Amazon S3 源。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。<a name="GettingStartedCreateDistributionProcedure"></a>

**创建具有使用 OAC 的 Amazon S3 源的 CloudFront 分配**

1. 通过 打开 CloudFront 控制台[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. 选择 **Create distribution**（创建分配）。

1. 输入标准分配的**分配名称**。该名称将显示为 `Name` 键的值（作为标签）。您以后可以更改此值。最多可以为标准分配添加 50 个标签。有关更多信息，请参阅 [标记分配](tagging.md)。

1. 选择**单个网站或应用程序**，然后选择**下一步**。

1. 选择**下一步**。

1. 对于**源类型**页面，选择 **Amazon S3**。

1. 对于 **S3 源**，选择**浏览 S3**，然后选择您为本教程创建的 S3 存储桶。

1. 对于**设置**，选择**使用建议的源设置**。CloudFront 将为您的 Amazon S3 源使用建议的默认缓存和源设置，包括设置来源访问控制（OAC）。有关建议设置的更多信息，请参阅 [预配置的分配设置参考](template-preconfigured-origin-settings.md)。

1. 选择**下一步**。

1. 在**启用安全保护**页面上，选择是否启用 AWS WAF 安全保护。

1. 选择**下一步**。

1. 选择**创建分配**。CloudFront 为您更新 S3 存储桶策略。

1. 查看新分配的**详细信息**部分。部署分配后，**上次修改时间**字段将从**正在部署**更改为部署日期和时间。

1. 记录 CloudFront 指派给分配的域名。其内容类似于以下所示：`d111111abcdef8.cloudfront.net`。

在生产环境中使用本教程中的分配和 S3 存储桶之前，请务必对其进行配置以满足您的特定需求。有关在生产环境中配置访问权限的信息，请参阅[配置安全访问和限制对内容的访问](SecurityAndPrivateContent.md)。

## 通过 CloudFront 访问您的内容
<a name="GettingStartedAccessingDistributions"></a>

要通过 CloudFront 访问您的内容，请将 CloudFront 分配的域名与内容的主页组合在一起。（您在 [创建将 Amazon S3 源与 OAC 结合使用的 CloudFront 分配](#GettingStartedCreateDistribution) 中记录了您的分配域名。）
+ 您的分配域名可能如下所示：`d111111abcdef8.cloudfront.net`。
+  网站主页的路径通常为 `/index.html`。

因此，通过 CloudFront 访问您的内容的 URL 可能如下所示：

`https://d111111abcdef8.cloudfront.net/index.html`.

如果您按照上述步骤操作并使用了 *hello world* 网页，您应该看到显示 **Hello world\$1** 的网页。

将更多内容上传到此 S3 桶时，您可以将 CloudFront 分配域名与 S3 桶中的对象路径组合在一起，从而通过 CloudFront 访问内容。例如，如果您将一个名为 `new-page.html` 的新文件上传到 S3 桶的根目录，URL 如下所示：

`https://d111111abcdef8.cloudfront.net/new-page.html`.

## 清理
<a name="GettingStartedDistributionCleanup"></a>

如果您仅出于练习目的创建分配和 S3 存储桶，请删除它们，这样就不会再产生费用。首先删除分配。有关更多信息，请参阅以下链接：
+ [删除分配](HowToDeleteDistribution.md)
+ [删除存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html)

## 增强基本分配
<a name="GettingStartedDistributionNotes"></a>

本入门教程提供创建分配所需的最小框架。建议您探索以下增强功能：
+ 您可以使用 CloudFront 私有内容功能来限制对 Amazon S3 存储桶中内容的访问权限。更多有关分配私有内容的信息，请参阅 [使用签名 URL 和签名 Cookie 提供私有内容](PrivateContent.md)。
+ 您可以将 CloudFront 分配配置为使用自定义域名（例如，使用 `www.example.com` 而不是 `d111111abcdef8.cloudfront.net`）。有关更多信息，请参阅 [使用自定义 URL](CNAMEs.md)。
+ 本教程使用具有源访问控制（OAC）的 Amazon S3 源。但是，如果您的源是配置为[网站端点](https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html)的 S3 存储桶，则无法使用 OAC。在这种情况下，必须通过 CloudFront 将存储桶设置为自定义源。有关更多信息，请参阅 [使用配置为网站端点的 Amazon S3 存储桶](DownloadDistS3AndCustomOrigins.md#concept_S3Origin_website)。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。

# 开始使用标准分配（AWS CLI）
<a name="get-started-cli-tutorial"></a>

本节中的过程将介绍如何将 AWS CLI 与 CloudFront 使用来设置涉及以下操作的基本配置：
+ 创建 Amazon S3 存储桶以用作分配源。
+ 将对象的原始版本存储在 S3 存储桶中。
+ 使用来源访问控制（OAC）将经过身份验证的请求发送到 Amazon S3 源。OAC 通过 CloudFront 发送请求，以防止查看器直接访问您的 S3 存储桶。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。
+ 将 URL 中的 CloudFront 域名用于您的对象（例如 `https://d111111abcdef8.cloudfront.net/index.html`）。
+ 在 CloudFront 边缘站点中将对象保留默认的 24 小时持续时间（最短持续时间为 0 秒）

其中的大多数选项是可自定义的。有关如何自定义 CloudFront 分配选项的信息，请参阅[创建分配](distribution-web-creating-console.md)。

## 先决条件
<a name="get-started-cli-prereqs"></a>

开始之前，请确保您已完成[设置您的 AWS 账户](setting-up-cloudfront.md)中的步骤。

安装 AWS CLI 并使用您的凭证对其进行配置。有关更多信息，请参阅《AWS CLI 用户指南》**中的 [AWS CLI 入门](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)。



## 创建 Amazon S3 存储桶
<a name="get-started-cli-create-bucket"></a>

Amazon S3 存储桶是文件（对象）或文件夹的容器。当 Amazon S3 存储桶作为源时，CloudFront 可以为您分发几乎任何类型的文件。例如，CloudFront 可以分配文本、图像和视频。您可以在 Amazon S3 上存储的数据量没有上限。

在本教程中，您将创建一个 S3 存储桶并上传一个 HTML 文件，该文件用于创建基本网页。

```
aws s3 mb s3://amzn-s3-demo-bucket/ --region us-east-1
```

将 *amzn-s3-demo-bucket* 替换为全局唯一的存储桶名称。对于 AWS 区域，建议选择地理位置靠近您的区域。这可以减少延迟和成本，但也可以选择其它区域。例如，您可以这样做来满足监管要求。

## 将内容上传到存储桶
<a name="get-started-cli-upload-content"></a>

在本教程中，下载并提取基本“Hello World”网页的示例内容文件。

```
# Create a temporary directory
mkdir -p ~/cloudfront-demo

# Download the sample Hello World files
curl -o ~/cloudfront-demo/hello-world-html.zip https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/hello-world-html.zip

# Extract the zip file
unzip ~/cloudfront-demo/hello-world-html.zip -d ~/cloudfront-demo/hello-world
```

这将创建一个包含 `index.html` 文件和 `css` 文件夹的目录。将这些文件上传到 S3 存储桶。

```
aws s3 cp ~/cloudfront-demo/hello-world/ s3://amzn-s3-demo-bucket/ --recursive
```

## 创建来源访问控制（OAC）
<a name="get-started-cli-create-oac"></a>

在本教程中，您将创建来源访问控制（OAC）。OAC 可帮助您安全地将经过身份验证的请求发送到 Amazon S3 源。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。

```
aws cloudfront create-origin-access-control \
    --origin-access-control-config Name="oac-for-s3",SigningProtocol=sigv4,SigningBehavior=always,OriginAccessControlOriginType=s3
```

将输出中的 OAC ID 保存为环境变量。将示例值替换为您自己的 OAC ID。您将在下一步中使用它。

```
OAC_ID="E1ABCD2EFGHIJ"
```

## 创建标准分配
<a name="get-started-cli-create-classic"></a>

创建一个名为 `distribution-config.json` 的分配配置文件。将示例存储桶名称替换为与 `Id`、`DomainName` 和 `TargetOriginId` 值对应的存储桶名称。

```
cat > distribution-config.json << EOF
{
    "CallerReference": "cli-example-$(date +%s)",
    "Origins": {
        "Quantity": 1,
        "Items": [
            {
                "Id": "S3-amzn-s3-demo-bucket",
                "DomainName": "amzn-s3-demo-bucket.s3.amazonaws.com",
                "S3OriginConfig": {
                    "OriginAccessIdentity": ""
                },
                "OriginAccessControlId": "$OAC_ID"
            }
        ]
    },
    "DefaultCacheBehavior": {
        "TargetOriginId": "S3-amzn-s3-demo-bucket",
        "ViewerProtocolPolicy": "redirect-to-https",
        "AllowedMethods": {
            "Quantity": 2,
            "Items": ["GET", "HEAD"],
            "CachedMethods": {
                "Quantity": 2,
                "Items": ["GET", "HEAD"]
            }
        },
        "DefaultTTL": 86400,
        "MinTTL": 0,
        "MaxTTL": 31536000,
        "Compress": true,
        "ForwardedValues": {
            "QueryString": false,
            "Cookies": {
                "Forward": "none"
            }
        }
    },
    "Comment": "CloudFront distribution for S3 bucket",
    "Enabled": true
}
EOF
```

创建标准分配。

```
aws cloudfront create-distribution --distribution-config file://distribution-config.json
```

将输出中的分配 ID 和域名保存为环境变量。将 example values 替换为您自己的值。本教程后面将会用到这些值。

```
DISTRIBUTION_ID="EABCD1234XMPL"
DOMAIN_NAME="d111111abcdef8.cloudfront.net"
```

在生产环境中使用本教程中的分配和 S3 存储桶之前，请务必对其进行配置以满足您的特定需求。有关在生产环境中配置访问权限的信息，请参阅[配置安全访问和限制对内容的访问](SecurityAndPrivateContent.md)。

## 更新 S3 存储桶策略
<a name="get-started-cli-update-bucket-policy"></a>

更新 S3 存储桶策略以支持 CloudFront 访问对象。将示例存储桶名称替换为您的存储桶名称。

```
# Get your AWS account ID
ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)

# Create the bucket policy
cat > bucket-policy.json << EOF
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::$ACCOUNT_ID:distribution/$DISTRIBUTION_ID"
                }
            }
        }
    ]
}
EOF

# Apply the bucket policy
aws s3api put-bucket-policy \
    --bucket amzn-s3-demo-bucket \
    --policy file://bucket-policy.json
```

## 确认分配部署
<a name="get-started-cli-confirm-deployment"></a>

创建分配后，需要一些时间才能完成部署。当分配状态从 `InProgress` 变为 `Deployed` 时，继续执行下一步。

```
aws cloudfront get-distribution --id $DISTRIBUTION_ID --query 'Distribution.Status'
```

或者，您可以使用 `wait` 命令等待分配部署。

```
aws cloudfront wait distribution-deployed --id $DISTRIBUTION_ID
```

## 通过 CloudFront 访问您的内容
<a name="get-started-cli-access-content"></a>

要通过 CloudFront 访问您的内容，请将 CloudFront 分配的域名与内容的主页组合在一起。将示例 CloudFront 域名替换为您自己的域名。

```
https://d111111abcdef8.cloudfront.net/index.html
```

如果您按照上述步骤操作并创建了 HTML 文件，您应该看到显示 **Hello world\$1** 的网页。

将更多内容上传到此 S3 桶时，您可以将 CloudFront 分配域名与 S3 桶中的对象路径组合在一起，从而通过 CloudFront 访问内容。例如，如果您将一个名为 `new-page.html` 的新文件上传到 S3 桶的根目录，URL 如下所示：

`https://d111111abcdef8.cloudfront.net/new-page.html`.

## 清理
<a name="get-started-cli-cleanup"></a>

如果您仅出于练习目的创建分配和 S3 存储桶，请删除它们，这样就不会再产生费用。首先禁用和删除分配。

**禁用和删除标准分配（AWS CLI）**

1. 首先，禁用分配。

   ```
   # Get the current configuration and ETag
   ETAG=$(aws cloudfront get-distribution-config --id $DISTRIBUTION_ID --query 'ETag' --output text)
   
   # Create a modified configuration with Enabled=false
   aws cloudfront get-distribution-config --id $DISTRIBUTION_ID | \
   jq '.DistributionConfig.Enabled = false' > temp_disabled_config.json
   
   # Update the distribution to disable it
   aws cloudfront update-distribution \
       --id $DISTRIBUTION_ID \
       --distribution-config file://<(jq '.DistributionConfig' temp_disabled_config.json) \
       --if-match $ETAG
   ```

1. 等待分配被禁用。

   ```
   aws cloudfront wait distribution-deployed --id $DISTRIBUTION_ID
   ```

1. 删除分配

   ```
   # Get the current ETag
   ETAG=$(aws cloudfront get-distribution-config --id $DISTRIBUTION_ID --query 'ETag' --output text)
   
   # Delete the distribution
   aws cloudfront delete-distribution --id $DISTRIBUTION_ID --if-match $ETAG
   ```

**删除 S3 存储桶（AWS CLI）**
+ 删除 S3 存储桶及其内容。将示例存储桶名称替换为您自己的存储桶名称。

  ```
  # Delete the bucket contents
  aws s3 rm s3://amzn-s3-demo-bucket --recursive
  
  # Delete the bucket
  aws s3 rb s3://amzn-s3-demo-bucket
  ```

要清理为本教程创建的本地文件，请运行以下命令：

```
# Clean up local files
rm -f distribution-config.json bucket-policy.json temp_disabled_config.json
rm -rf ~/cloudfront-demo
```

（可选）您可以删除为本教程创建的 OAC。

```
# Get the OAC ETag
OAC_ETAG=$(aws cloudfront get-origin-access-control --id $OAC_ID --query 'ETag' --output text)

# Delete the OAC
aws cloudfront delete-origin-access-control --id $OAC_ID --if-match $OAC_ETAG
```

# 安全静态网站入门
<a name="getting-started-secure-static-website-cloudformation-template"></a>

您可以通过使用本主题中介绍的解决方案为您的域名创建安全静态网站来开始使用 Amazon CloudFront。*静态网站* 仅使用静态文件（如 HTML、CSS、JavaScript、图像和视频），并且不需要服务器或服务器端处理。使用此解决方案，您的网站将获得以下好处：
+ **使用 [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) 的持久存储** – 此解决方案创建 Amazon S3 存储桶来托管静态网站的内容。要更新您的网站，只需将新文件上传到 S3 存储桶。
+ **通过 Amazon CloudFront 内容分发网络加快速度** – 此解决方案创建一个 CloudFront 分配，以便以低延迟将您的网站提供给查看器。此分配配置了[源访问控制](private-content-restricting-access-to-s3.md)（OAC）功能，以确保只能通过 CloudFront（而不是直接从 S3）访问网站。
+ **由 HTTPS 和安全标头提供保护** – 此解决方案在 [AWS Certificate Manager（ACM）](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html)中创建 SSL/TLS 证书，并将其附加到 CloudFront 分配。此证书使分配能够使用 HTTPS 安全地为您的域名网站提供服务。
+ **使用 [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) 进行配置和部署** – 此解决方案使用 CloudFormation 模板来设置所有组件，因此，您可以更多地关注网站的内容，而更少地关注配置组件。

这个解决方案在 GitHub 上是开源的。要查看代码、提交拉取请求或开设问题，请转到 [https://github.com/aws-samples/amazon-cloudfront-secure-static-site](https://github.com/aws-samples/amazon-cloudfront-secure-static-site)。

**Topics**
+ [

## 解决方案概述
](#cloudformation-website-overview)
+ [

## 部署解决方案
](#deploy-secure-static-website-cloudformation)

## 解决方案概述
<a name="cloudformation-website-overview"></a>

下图显示此静态网站解决方案的工作原理的概述：

![\[CloudFront 的安全静态网站的概述图表\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-secure-static-website-overview-github.png)


1. 查看器在 www.example.com 上请求访问网站。

1. 如果缓存请求的对象，则 CloudFront 将对象从其缓存返回给查看器。

1. 如果对象不在 CloudFront 缓存中，CloudFront 会从源（S3 存储桶）请求对象。

1. S3 将对象返回到 CloudFront。

1. CloudFront 会缓存该对象。

1. 该对象将返回到查看器。对去往同一 CloudFront 边缘站点的对象的后续请求将从 CloudFront 缓存中提供服务。

## 部署解决方案
<a name="deploy-secure-static-website-cloudformation"></a>

要部署此安全静态网站解决方案，您可以从以下任一选项中进行选择：
+ 使用 CloudFormation 控制台部署具有默认内容的解决方案，然后将您的网站内容上传到 Amazon S3。
+ 将解决方案克隆到您的计算机以添加您的网站内容。然后，使用 AWS Command Line Interface (AWS CLI) 部署解决方案。

**注意**  
您必须使用美国东部（弗吉尼亚州北部）区域来部署 CloudFormation 模板。

**Topics**
+ [

### 先决条件
](#deploy-website-cloudformation-prerequisites)
+ [

### 使用 CloudFormation 控制台
](#deploy-website-cloudformation-console)
+ [

### 本地克隆解决方案
](#deploy-website-cloudformation-clone)
+ [

### 查找访问日志
](#deploy-website-cloudformation-logs)

### 先决条件
<a name="deploy-website-cloudformation-prerequisites"></a>

要使用此解决方案，您必须具有以下先决条件：
+ 指向 Amazon Route 53 托管区域的注册域名（例如 example.com）。托管区域必须位于您部署此解决方案的同一 AWS 账户中。如果您没有已注册的域名，可以[向 Route 53 注册一个](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/registrar.html)。如果您有注册的域名，但它未指向 Route 53 托管区域，请[将 Route 53 配置为您的 DNS 服务](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-configuring.html)。
+ AWS Identity and Access Management (IAM) 启动创建 IAM 角色的 CloudFormation 模板的权限，以及在解决方案中创建所有 AWS 资源的权限。有关更多信息，请参阅《AWS CloudFormation 用户指南》**中的[使用 AWS Identity and Access Management 控制访问](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html)。

使用此解决方案时产生的费用由您负责。有关成本的更多信息，请参阅[每项 AWS 服务的定价页面](https://aws.amazon.com/pricing/)。

### 使用 CloudFormation 控制台
<a name="deploy-website-cloudformation-console"></a>

**使用 CloudFormation 控制台进行部署**

1. [在 CloudFormation 控制台中启动此解决方案](https://console.aws.amazon.com/cloudformation/home?region=us-east-1#/stacks/new?stackName=amazon-cloudfront-secure-static-site-templates-main&templateURL=https://s3.amazonaws.com/solution-builders-us-east-1/amazon-cloudfront-secure-static-site/latest/main.yaml)。如有必要，请登录您的 AWS 账户。

1. 将在 CloudFormation 控制台中打开**创建堆栈**向导，其中包含指定此解决方案的 CloudFormation 模板的预填充字段。

   在页面底部，选择 **Next**。

1. 在**指定堆栈详细信息**页面上，输入以下字段的值：
   + **子域名** – 输入要用于您的网站的子域名。例如，如果子域名为 *www*，则您的网站在 *www*.example.com 上可用。（将 example.com 替换为您的域名，如以下项目符号中所述。）
   + **域名** – 输入您的域名，如 *example.com*。此域必须指向 Route 53 托管区域。
   + **HostedZoneId** – 您的域名的 Route 53 托管区域 ID。
   + **CreateApex** –（可选）在您的 CloudFront 配置中为域 apex（example.com）创建别名。

1. 在完成后，选择**下一步**。

1. （可选）在**配置堆栈选项**页面上，[添加标签和其他堆栈选项](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-add-tags.html)。

1. 在完成后，选择**下一步**。

1. 在**审核**页面上，滚动到页面底部，然后选择**功能**部分中的两个框。这些功能允许 CloudFormation 创建允许访问堆栈资源并动态命名这些资源的 IAM 角色。

1. 选择**创建堆栈**。

1. 等待堆栈完成创建。堆栈会创建一些嵌套堆栈，并且可能需要几分钟才能完成。完成后，**状态**将更改为 **CREATE\$1COMPLETE**。

   当状态为 **CREATE\$1COMPLETE** 时，请转到 https://*www.example.com*，以查看您的网站（将 www.example.com 替换为您在步骤 3 中指定的子域名和域名）。您应该看到网站的默认内容：  
![\[此解决方案的静态网站默认内容。它说：“我是一个静态网站！”\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-secure-static-website-content.png)

**将网站的默认内容替换为您自己的内容**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择名称以 **amazon-cloudfront-secure-static-site-s3bucketroot-** 开头的存储桶。
**注意**  
请确保选择名称中包含 **s3bucketroot** 而不是 **s3bucketlogs** 的存储桶。名称中包含 **s3bucketroot** 的存储桶包含网站内容。具有 **s3bucketlogs** 的存储桶只包含日志文件。

1. 删除网站的默认内容，然后上传您自己的内容。
**注意**  
如果您查看了您的网站以及此解决方案的默认内容，那么某些默认内容可能会缓存在 CloudFront 边缘站点中。要确保查看器看到更新后的网站内容，请使文件*无效*，以便从 CloudFront 边缘站点删除缓存的副本。有关更多信息，请参阅 [使文件失效以删除内容](Invalidation.md)。

### 本地克隆解决方案
<a name="deploy-website-cloudformation-clone"></a>

**先决条件**

要在部署此解决方案之前添加网站内容，您必须在本地打包解决方案的构件，这需要 Node.js 和 npm。有关更多信息，请参阅 [https://www.npmjs.com/get-npm](https://www.npmjs.com/get-npm)。

**添加网站内容并部署解决方案**

1. 从 克隆或下载解决方案[https://github.com/aws-samples/amazon-cloudfront-secure-static-site](https://github.com/aws-samples/amazon-cloudfront-secure-static-site) 克隆或下载后，打开命令提示符或终端并导航到 `amazon-cloudfront-secure-static-site` 文件夹。

1. 运行以下命令来安装并打包解决方案的构件：

   ```
   make package-static
   ```

1. 将网站的内容复制到 `www` 文件夹中，覆盖默认网站内容。

1. 运行以下 AWS CLI 命令创建 Amazon S3 存储桶以存储解决方案的构件。将 *amzn-s3-demo-bucket-for-artifacts* 替换为您自己的存储桶名称。

   ```
   aws s3 mb s3://amzn-s3-demo-bucket-for-artifacts --region us-east-1
   ```

1. 运行以下 AWS CLI 命令，将解决方案构件打包为 CloudFormation 模板。将 *amzn-s3-demo-bucket-for-artifacts* 替换为您在上一步中创建的存储桶的名称。

   ```
   aws cloudformation package \
       --region us-east-1 \ 
       --template-file templates/main.yaml \
       --s3-bucket amzn-s3-demo-bucket-for-artifacts \
       --output-template-file packaged.template
   ```

1. 运行以下命令，使用 CloudFormation 部署解决方案，同时替换以下值：
   + *your-CloudFormation-stack-name* – 替换为 CloudFormation 堆栈的名称。
   + *example.com* – 替换为您的域名。此域必须指向同一 AWS 账户中的 Route 53 托管区。
   + *www* – 替换为要用于您的网站的子域名。例如，如果子域名为 *www*，则您的网站在 www.example.com 上可用。
   + *hosted-zone-ID* – 替换为您的域名的 Route 53 托管区 ID。

   ```
   aws cloudformation deploy \
       --region us-east-1 \
       --stack-name your-CloudFormation-stack-name \
       --template-file packaged.template \
       --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \
       --parameter-overrides DomainName=example.com SubDomain=www HostedZoneId=hosted-zone-ID
   ```

   1. （可选）要使用域 Apex 部署堆栈，请改为运行以下命令。

     ```
     aws --region us-east-1 cloudformation deploy \
         --stack-name your-CloudFormation-stack-name \
         --template-file packaged.template \
         --capabilities CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \
         --parameter-overrides  DomainName=example.com SubDomain=www HostedZoneId=hosted-zone-ID CreateApex=yes
     ```

1. 等待 CloudFormation 堆栈创建完成。堆栈会创建一些嵌套堆栈，并且可能需要几分钟才能完成。完成后，**状态**将更改为 **CREATE\$1COMPLETE**。

   当状态更改为 **CREATE\$1COMPLETE** 时，请转到 https://www.example.com 以查看您的网站（将 www.example.com 替换为您在前面步骤中指定的子域名和域名）。您应该看到您网站的内容。

### 查找访问日志
<a name="deploy-website-cloudformation-logs"></a>

此解决方案为 CloudFront 分配启用[访问日志](AccessLogs.md)。完成以下步骤以查找此分配的访问日志。

**查找分配的访问日志**

1. 通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 选择名称以 **amazon-cloudfront-secure-static-site-s3bucketlogs-** 开头的存储桶。
**注意**  
请确保选择名称中包含 **s3bucketlogs** 而不是 **s3bucketroot** 的存储桶。名称中具有 **s3bucketlogs** 的存储桶包含日志文件。带有 **s3bucketroot** 的存储桶包含网站内容。

1. 名为 **cdn** 的文件夹包含 CloudFront 访问日志。