

# 排查分配问题
<a name="troubleshooting-distributions"></a>

使用此处的信息，诊断和修复您使用 Amazon CloudFront 分配设置网站或应用程序时可能遇到的证书错误、拒绝访问或其他常见问题。

**Topics**
+ [CloudFront 会返回 Access Denied 错误](#access-denied)
+ [当我尝试添加备用域名时，CloudFront 返回 InvalidViewerCertificate 错误](#troubleshooting-distributions-certificates)
+ [当我尝试添加新的 CNAME 时，CloudFront 返回了 DNS 记录配置不正确的错误](#troubleshoot-incorrectly-configured-DNS-record-error)
+ [我无法查看我的分配中的文件](#troubleshooting-web-distribution)
+ [错误消息：CloudFront 正在使用证书：<certificate-id>](#troubleshooting-certificate-error)

## CloudFront 会返回 Access Denied 错误
<a name="access-denied"></a>

如果您使用 Amazon S3 存储桶作为 CloudFront 分配源，您可能会在以下示例中看到“访问被拒绝”（403）错误消息。

**Contents**
+ [您指定了 Amazon S3 源中缺少的对象](#missing-object-in-s3-bucket)
+ [您的 Amazon S3 源缺少 IAM 权限](#access-denied-origin-missing-iam-permissions)
+ [您使用的凭证无效或您的权限不足](#access-denied-missing-iam-permissions)

### 您指定了 Amazon S3 源中缺少的对象
<a name="missing-object-in-s3-bucket"></a>

验证您的存储桶中是否存在请求的对象。对象名称区分大小写。输入无效对象名称可能会返回“访问被拒绝”错误代码。

例如，如果您按照 [CloudFront 教程](GettingStarted.SimpleDistribution.md)创建基本分配，则可以创建一个 Amazon S3 存储桶作为源并上传 `index.html` 文件示例。

在 Web 浏览器中，如果输入 `https://d111111abcdef8.cloudfront.net/INDEX.HTML`，而不是输入 `https://d111111abcdef8.cloudfront.net/index.html`，您可能会看到类似的消息，因为 URL 路径中的 `index.html` 文件区分大小写。

```
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>22Q367AHT7Y1ABCD</RequestId>
<HostId>
ABCDE/Vg+7PSNa/d/IfFQ8Fb92TGQ0KH0ZwG5iEKbc6+e06DdMS1ZW+ryB9GFRIVtS66rSSy6So=
</HostId>
</Error>
```

### 您的 Amazon S3 源缺少 IAM 权限
<a name="access-denied-origin-missing-iam-permissions"></a>

请确认您选择了正确的 Amazon S3 存储桶作为源域和名称。源（Amazon S3）必须拥有正确的权限。

如果您未指定正确的权限，则可能会向查看者显示 `AccessDenied` 消息。

当您分发来自 Amazon S3 的内容并且还使用 AWS Key Management Service（AWS KMS）服务端加密（SSE-KMS）功能时，您需要为 KMS 密钥和 Amazon S3 存储桶指定额外的 IAM 权限。您的 CloudFront 分配需要这些权限才能使用 KMS 密钥，该密钥用于加密原始 Amazon S3 存储桶。

Amazon S3 存储桶策略配置允许 CloudFront 分配检索加密对象以进行内容传输。

**验证您的 Amazon S3 存储桶和 KMS 密钥权限**

1. 确认您使用的 KMS 密钥与您的 Amazon S3 存储桶用于默认加密的密钥相同。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[借助 AWS KMS（SSE-KMS）指定服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-kms-encryption.html)。

1. 验证存储桶中的对象是否使用相同的 KMS 密钥进行了加密。您可以从 Amazon S3 存储桶中选择任何对象并检查服务器端加密设置以验证 KMS 密钥 ARN。

1. 编辑 Amazon S3 存储桶策略，授予 CloudFront 从 Amazon S3 存储桶调用 `GetObject` API 操作的权限。有关使用源访问控制的 Amazon S3 存储桶策略示例，请参阅[向 CloudFront 授予访问 S3 存储桶的权限](private-content-restricting-access-to-s3.md#oac-permission-to-access-s3)。

1. 编辑 KMS 密钥策略，授予 CloudFront 对 `Encrypt`、`Decrypt` 和 `GenerateDataKey*` 执行操作的权限。要与“最低权限”权限保持一致，请指定一个 `Condition` 元素，以便只有指定的 CloudFront 分配才能执行列出的操作。您可以针对现有策略自定义 AWS KMS 策略。有关 KMS 密钥策略示例，请参阅 [SSE-KMS](private-content-restricting-access-to-s3.md#oac-permissions-sse-kms)。

如果您使用的是源访问身份（OAI）而不是 OAC，则对 Amazon S3 存储桶的权限会略有不同，因为您向身份，而不是 AWS 服务 授予权限。有关更多信息，请参阅 [授予源访问身份读取 Amazon S3 存储桶中文件的权限](private-content-restricting-access-to-s3.md#private-content-granting-permissions-to-oai)。

如果您仍然无法查看分配中的文件，请参阅[我无法查看我的分配中的文件](#troubleshooting-web-distribution)。

### 您使用的凭证无效或您的权限不足
<a name="access-denied-missing-iam-permissions"></a>

如果您使用的 AWS SCT 凭证（访问密钥和私有密钥）不正确或已过期，或者您的 IAM 角色或用户缺少对 CloudFront 资源执行操作所需的权限，则可能会出现“访问被拒绝”错误消息。有关“访问被拒绝”错误消息的更多信息，请参阅《IAM 用户指南》**中的[排查访问被拒绝错误消息](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_access-denied.html)。

有关如何将 IAM 与 CloudFront 结合使用的更多信息，请参阅 [适用于 Amazon CloudFront 的 Identity and Access Management](security-iam.md)。

## 当我尝试添加备用域名时，CloudFront 返回 InvalidViewerCertificate 错误
<a name="troubleshooting-distributions-certificates"></a>

如果在您尝试向分配中添加备用域名（CNAME）时，CloudFront 返回 `InvalidViewerCertificate` 错误，请查看以下信息来帮助排查问题。此错误可能指示必须先解决以下问题之一，然后才能成功添加备用域名。

以下错误按照 CloudFront 检查添加备用域名的授权的顺序列出。这可以帮助您诊断问题，因为基于 CloudFront 返回的错误，您可以辨别哪些验证检查已成功完成。

**没有证书附加到您的分配。**  
要添加备用域名 (CNAME)，您必须在分配中附加可信且有效的证书。请检查要求，获得符合要求的有效证书，将其附加到您的分配中，然后重试。有关更多信息，请参阅 [使用备用域名的要求](CNAMEs.md#alternate-domain-names-requirements)。

**在您附加的证书的证书链中有过多的证书。**  
一个证书链中最多只能有五个证书。减少链中的证书数，然后重试。

**证书链包含的一个或多个证书对于当前日期无效。**  
已添加的证书的证书链中有一个或多个证书无效，可能是证书迄今尚未生效，或者证书已过期。检查证书链中证书的**生效日期**和**到期日期**字段，确保基于您所列日期所有证书都有效。

**附加的证书未获得信任的证书颁发机构 (CA) 的签字。**  
您附加到 CloudFront 以证明备用域名的证书不能是自签名证书。必须获得信任的 CA 的签名。有关更多信息，请参阅 [使用备用域名的要求](CNAMEs.md#alternate-domain-names-requirements)。

**您附加的证书的格式不正确**  
证书中包括的域名和 IP 地址的格式以及证书本身的格式都必须遵循证书标准。

**存在 CloudFront 内部错误。**  
CloudFront 受到内部问题阻止，无法对证书进行验证。在这种情况下，CloudFront 将返回 HTTP 500 状态代码，并且指出附加证书时 CloudFront 发生内部问题。等待几分钟，然后重试以在证书中添加备用域名。

**附加的证书不涵盖您尝试添加的备用域名。**  
对于每个您要添加的备用域名，CloudFront 要求您附加来自信任的证书颁发机构 (CA) 且覆盖该域名的有效的 SSL/TLS 证书，以验证您有权使用它。请更新您的证书，以包含涵盖您尝试添加的 CNAME 的域名。有关在域名中使用通配符的更多信息和示例，请参阅[使用备用域名的要求](CNAMEs.md#alternate-domain-names-requirements)。

## 当我尝试添加新的 CNAME 时，CloudFront 返回了 DNS 记录配置不正确的错误
<a name="troubleshoot-incorrectly-configured-DNS-record-error"></a>

当您的一个现有通配符 DNS 条目指向 CloudFront 分配时，如果您尝试添加具有更具体名称的新 CNAME，则可能会遇到以下错误：

```
One or more aliases specified for the distribution includes an incorrectly configured DNS record that points to another CloudFront distribution. You must update the DNS record to correct the problem. 
```

之所以出现此错误，是因为 CloudFront 根据 CNAME 查询 DNS，而通配符 DNS 条目会解析到另一个分配。

要解决此问题，请再创建一个分配，然后创建一个指向新分配的 DNS 条目。最后，添加更具体的 CNAME。有关如何添加 CNAME 的更多信息，请参阅[添加备用域名](CreatingCNAME.md)。

## 我无法查看我的分配中的文件
<a name="troubleshooting-web-distribution"></a>

如果您无法查看 CloudFront 分配中的文件，请参阅下列主题了解一些常见的解决方案。

### 您是否同时注册了 CloudFront 和 Amazon S3？
<a name="Troubleshooting.SigningUp"></a>

要将 Amazon CloudFront 与 Amazon S3 源配合使用，您必须单独注册 CloudFront 和Amazon S3。有关注册 CloudFront 和 Amazon S3 的更多信息，请参阅[设置您的 AWS 账户](setting-up-cloudfront.md)。

### 您的 Amazon S3 存储桶和对象权限的设置是否正确？
<a name="Troubleshooting.Permissions"></a>

如果您将 CloudFront 和 Amazon S3 源结合使用，则内容的原始版本存储在 S3 存储桶中。为了向查看器提供内容，我们建议您使用 CloudFront 来源访问控制（OAC）来保护 Amazon S3 存储桶访问权限。这意味着只能通过 CloudFront 访问 S3 存储桶。OAC 通过 CloudFront 控制查看器访问权限和安全传输。有关 OAC 的更多信息，请参阅[限制对 Amazon S3 源的访问](private-content-restricting-access-to-s3.md)。

有关管理存储桶访问权限的更多信息，请参阅《Amazon S3 用户指南》**中的[阻止对您的 Amazon S3 存储的公有访问](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html)。

对象属性和存储桶属性是独立的。您必须明确授予对 Amazon S3 存储桶中每个对象的特权。对象不会从存储桶继承属性，对象属性必须独立于存储桶进行设置。

### 您的备用域名 (CNAME) 配置正确吗？
<a name="Troubleshooting.CNAME"></a>

如果您的域名已经具有现有的 CNAME 记录，请更新此记录或用指向分配的域名的新记录替换它。

此外，确保您的 CNAME 记录指向您分配的域名，而不是 Amazon S3 存储桶。您可确认您的 DNS 系统中的 CNAME 记录指向您分配的域名。要做到这一点，请使用 DNS 工具，如 **dig**。

以下示例显示对名为 `images.example.com` 的域名的 dig 请求和响应的相关部分。在 `ANSWER SECTION` 下，请参阅包含 `CNAME` 的行。如果别名记录 (CNAME) 右侧上的值是您的 CloudFront 分配域名，则您域名的 CNAME 记录设置正确。如果是您的 Amazon S3 源服务器或一些其他域名，则别名记录 (CNAME) 设置不正确。

```
 1. [prompt]> dig images.example.com
 2. 
 3. ; <<> DiG 9.3.3rc2 <<> images.example.com
 4. ;; global options:	printcmd
 5. ;; Got answer:
 6. ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15917
 7. ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 2, ADDITIONAL: 0
 8. ;; QUESTION SECTION:
 9. ;images.example.com.		 IN		A
10. ;; ANSWER SECTION:
11. images.example.com. 10800 IN	CNAME	d111111abcdef8.cloudfront.net.
12. ...
13. ...
```

有关别名记录 (CNAME) 的更多信息，请参阅 [通过添加备用域名（CNAME）使用自定义 URL](CNAMEs.md)。

### 您为 CloudFront 分配引用了正确的 URL 吗？
<a name="Troubleshooting.URL"></a>

请确保您引用的 URL 使用 CloudFront 分配的域名（或 CNAME），而不是 Amazon S3 存储桶或自定义源。

### 您需要帮助来解决自定义源的问题吗？
<a name="Troubleshooting.CustomOrigin"></a>

如果您需要 AWS 帮助您解决自定义源的问题，我们可能需要检查您请求中的 `X-Amz-Cf-Id` 标头条目。如果您没有记录这些条目，您将来可能需要它。有关更多信息，请参阅 [使用 Amazon EC2（或其他自定义源）](DownloadDistS3AndCustomOrigins.md#concept_CustomOrigin)。如需进一步帮助，请访问 [AWS 支持中心](https://console.aws.amazon.com/support/home?#/)。

## 错误消息：CloudFront 正在使用证书：<certificate-id>
<a name="troubleshooting-certificate-error"></a>

**问题：**当您尝试从 IAM 证书存储区中删除 SSL/TLS 证书时收到消息“CloudFront 正在使用证书: <certificate-id>”。

**解决方案：**每个 CloudFront 分配必须与默认 CloudFront 证书或自定义 SSL/TLS 证书相关联。在删除 SSL/TLS 证书前，必须轮换证书（将当前的自定义 SSL/TLS 证书替换为其他自定义 SSL/TLS 证书），或从使用自定义 SSL/TLS 证书恢复为使用默认 CloudFront 证书。要修复这一问题，请完成以下过程之一中的步骤：
+ [轮换 SSL/TLS 证书](cnames-and-https-rotate-certificates.md)
+ [从自定义 SSL/TLS 证书恢复为默认 CloudFront 证书](cnames-and-https-revert-to-cf-certificate.md)