排查分配问题
使用此处的信息,诊断和修复您使用 Amazon CloudFront 分配设置网站或应用程序时可能遇到的证书错误、拒绝访问或其他常见问题。
主题
CloudFront 会返回 Access Denied 错误
如果您使用 Amazon S3 存储桶作为 CloudFront 分配源,您可能会在以下示例中看到“访问被拒绝”(403)错误消息。
您指定了 Amazon S3 源中缺少的对象
验证您的存储桶中是否存在请求的对象。对象名称区分大小写。输入无效对象名称可能会返回“访问被拒绝”错误代码。
例如,如果您按照 CloudFront 教程创建基本分配,则可以创建一个 Amazon S3 存储桶作为源并上传 index.html
文件示例。
在 Web 浏览器中,如果输入 https://d111111abcdef8.cloudfront.net/
,而不是输入 INDEX
.HTMLhttps://d111111abcdef8.cloudfront.net/
,您可能会看到类似的消息,因为 URL 路径中的 index
.htmlindex.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 权限
请确认您选择了正确的 Amazon S3 存储桶作为源域和名称。源(Amazon S3)必须拥有正确的权限。
如果您未指定正确的权限,则可能会向查看器显示以下访问被拒绝消息。
<Code>AccessDenied</Code> <Message>User: arn:aws:sts::856369053181:assumed-role/OriginAccessControlRole/EdgeCredentialsProxy+EdgeHostAuthenticationClient is not authorized to perform: kms:Decrypt on the resource associated with this ciphertext because the resource does not exist in this Region, no resource-based policies allow access, or a resource-based policy explicitly denies access</Message> <RequestId>22Q367AHT7Y1ABCD/RequestId> <HostId> ABCDE/Vg+7PSNa/d/IfFQ8Fb92TGQ0KH0ZwG5iEKbc6+e06DdMS1ZW+ryB9GFRIVtS66rSSy6So= </HostId> </Error>
注意
在此错误消息中,账户 ID 856369053181 是一个 Amazon 托管账户。
当您分发来自 Amazon S3 的内容并且还使用 Amazon Key Management Service(Amazon KMS)服务端加密(SSE-KMS)功能时,您需要为 KMS 密钥和 Amazon S3 存储桶指定额外的 IAM 权限。您的 CloudFront 分配需要这些权限才能使用 KMS 密钥,该密钥用于加密原始 Amazon S3 存储桶。
Amazon S3 存储桶策略配置允许 CloudFront 分配检索加密对象以进行内容传输。
验证您的 Amazon S3 存储桶和 KMS 密钥权限
-
确认您使用的 KMS 密钥与您的 Amazon S3 存储桶用于默认加密的密钥相同。有关更多信息,请参阅《Amazon Simple Storage Service 用户指南》中的借助 Amazon KMS(SSE-KMS)指定服务器端加密。
-
验证存储桶中的对象是否使用相同的 KMS 密钥进行了加密。您可以从 Amazon S3 存储桶中选择任何对象并检查服务器端加密设置以验证 KMS 密钥 ARN。
-
编辑 Amazon S3 存储桶策略,授予 CloudFront 从 Amazon S3 存储桶调用
GetObject
API 操作的权限。有关使用源访问控制的 Amazon S3 存储桶策略示例,请参阅向源访问控制授予访问 S3 存储桶的权限。 -
编辑 KMS 密钥策略,授予 CloudFront 对
Encrypt
、Decrypt
和GenerateDataKey*
执行操作的权限。要与“最低权限”权限保持一致,请指定一个Condition
元素,以便只有指定的 CloudFront 分配才能执行列出的操作。您可以针对现有策略自定义 Amazon KMS 策略。有关 KMS 密钥策略示例,请参阅 SSE-KMS。
如果您使用的是源访问身份(OAI)而不是 OAC,则对 Amazon S3 存储桶的权限会略有不同,因为您向身份,而不是 Amazon Web Services 服务 授予权限。有关更多信息,请参阅 授予源访问身份读取 Amazon S3 存储桶中文件的权限。
如果您仍然无法查看分配中的文件,请参阅我无法查看我的分配中的文件。
您使用的凭证无效或您的权限不足
如果您使用的 Amazon SCT 凭证(访问密钥和私有密钥)不正确或已过期,或者您的 IAM 角色或用户缺少对 CloudFront 资源执行操作所需的权限,则可能会出现“访问被拒绝”错误消息。有关“访问被拒绝”错误消息的更多信息,请参阅《IAM 用户指南》中的排查访问被拒绝错误消息。
有关如何将 IAM 与 CloudFront 结合使用的更多信息,请参阅 适用于 Amazon CloudFront 的 Identity and Access Management。
当我尝试添加备用域名时,CloudFront 返回 InvalidViewerCertificate 错误
如果在您尝试向分配中添加备用域名(CNAME)时,CloudFront 返回 InvalidViewerCertificate
错误,请查看以下信息来帮助排查问题。此错误可能指示必须先解决以下问题之一,然后才能成功添加备用域名。
以下错误按照 CloudFront 检查添加备用域名的授权的顺序列出。这可以帮助您诊断问题,因为基于 CloudFront 返回的错误,您可以辨别哪些验证检查已成功完成。
- 没有证书附加到您的分配。
-
要添加备用域名 (CNAME),您必须在分配中附加可信且有效的证书。请检查要求,获得符合要求的有效证书,将其附加到您的分配中,然后重试。有关更多信息,请参阅 使用备用域名的要求。
- 在您附加的证书的证书链中有过多的证书。
-
一个证书链中最多只能有五个证书。减少链中的证书数,然后重试。
- 证书链包含的一个或多个证书对于当前日期无效。
-
已添加的证书的证书链中有一个或多个证书无效,可能是证书迄今尚未生效,或者证书已过期。检查证书链中证书的生效日期和到期日期字段,确保基于您所列日期所有证书都有效。
- 附加的证书未获得信任的证书颁发机构 (CA) 的签字。
-
您附加到 CloudFront 以证明备用域名的证书不能是自签名证书。必须获得信任的 CA 的签名。有关更多信息,请参阅 使用备用域名的要求。
- 您附加的证书的格式不正确
-
证书中包括的域名和 IP 地址的格式以及证书本身的格式都必须遵循证书标准。
- 存在 CloudFront 内部错误。
-
CloudFront 受到内部问题阻止,无法对证书进行验证。在这种情况下,CloudFront 将返回 HTTP 500 状态代码,并且指出附加证书时 CloudFront 发生内部问题。等待几分钟,然后重试以在证书中添加备用域名。
- 附加的证书不涵盖您尝试添加的备用域名。
-
对于每个您要添加的备用域名,CloudFront 要求您附加来自信任的证书颁发机构 (CA) 且覆盖该域名的有效的 SSL/TLS 证书,以验证您有权使用它。请更新您的证书,以包含涵盖您尝试添加的 CNAME 的域名。有关在域名中使用通配符的更多信息和示例,请参阅使用备用域名的要求。
当我尝试添加新的 CNAME 时,CloudFront 返回了 DNS 记录配置不正确的错误
当您的一个现有通配符 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 的更多信息,请参阅添加备用域名。
我无法查看我的分配中的文件
如果您无法查看 CloudFront 分配中的文件,请参阅下列主题了解一些常见的解决方案。
您是否同时注册了 CloudFront 和 Amazon S3?
要将 Amazon CloudFront 与 Amazon S3 源配合使用,您必须单独注册 CloudFront 和Amazon S3。有关注册 CloudFront 和 Amazon S3 的更多信息,请参阅设置您的 Amazon Web Services 账户。
您的 Amazon S3 存储桶和对象权限的设置是否正确?
如果您将 CloudFront 和 Amazon S3 源结合使用,对象的原始版本存储在 S3 存储桶中。将 CloudFront 与 Amazon S3 结合使用的最简单方法是让您的所有对象在 Amazon S3 中都可以公开读取。为此,您必须为上传到 Amazon S3 中的每个对象明确启用公共读取权限。
如果您的内容不是公开可读,则必须创建 CloudFront 源访问控制(OAC),以供 CloudFront 访问。有关 CloudFront 源访问控制的更多信息,请参阅限制对 Amazon Simple Storage Service 源的访问。
对象属性和存储桶属性是独立的。您必须明确授予对 Amazon S3 存储桶中每个对象的特权。对象不会从存储桶继承属性,对象属性必须独立于存储桶进行设置。
您的备用域名 (CNAME) 配置正确吗?
如果您的域名已经具有现有的 CNAME 记录,请更新此记录或用指向分配的域名的新记录替换它。
此外,确保您的 CNAME 记录指向您分配的域名,而不是 Amazon S3 存储桶。您可确认您的 DNS 系统中的 CNAME 记录指向您分配的域名。要做到这一点,请使用 DNS 工具,如 dig。
以下示例显示对名为 images.example.com
的域名的 dig 请求和响应的相关部分。在 ANSWER SECTION
下,请参阅包含 CNAME
的行。如果别名记录 (CNAME) 右侧上的值是您的 CloudFront 分配域名,则您域名的 CNAME 记录设置正确。如果是您的 Amazon S3 源服务器或一些其他域名,则别名记录 (CNAME) 设置不正确。
[prompt]> dig images.example.com ; <<> DiG 9.3.3rc2 <<> images.example.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15917 ;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 2, ADDITIONAL: 0 ;; QUESTION SECTION: ;images.example.com. IN A ;; ANSWER SECTION: images.example.com. 10800 IN CNAME d111111abcdef8.cloudfront.net. ... ...
有关别名记录 (CNAME) 的更多信息,请参阅 通过添加备用域名(CNAME)使用自定义 URL。
您为 CloudFront 分配引用了正确的 URL 吗?
请确保您引用的 URL 使用 CloudFront 分配的域名(或 CNAME),而不是 Amazon S3 存储桶或自定义源。
您需要帮助来解决自定义源的问题吗?
如果您需要 Amazon 帮助您解决自定义源的问题,我们可能需要检查您请求中的 X-Amz-Cf-Id
标头条目。如果您没有记录这些条目,您将来可能需要它。有关更多信息,请参阅 使用 Amazon EC2(或其他自定义源)。如需进一步帮助,请访问 Amazon 支持中心
错误消息:CloudFront 正在使用证书:<certificate-id>
问题:当您尝试从 IAM 证书存储区中删除 SSL/TLS 证书时收到消息“CloudFront 正在使用证书: <certificate-id>”。
解决方案:每个 CloudFront 分配必须与默认 CloudFront 证书或自定义 SSL/TLS 证书相关联。在删除 SSL/TLS 证书前,必须轮换证书(将当前的自定义 SSL/TLS 证书替换为其他自定义 SSL/TLS 证书),或从使用自定义 SSL/TLS 证书恢复为使用默认 CloudFront 证书。要修复这一问题,请完成以下过程之一中的步骤: