如何调试 AWS Cloudfront 签名 URL 访问被拒绝?



这是我的符号URL函数:

private function signUrl($lesson) {
$cloudFrontClient = AWS::createClient('CloudFront', [
'region'  => '<my-region>',
'version' => '2017-03-25' 
]);
$streamHostUrl = 'https://<mydomain>.cloudfront.net';
$resourceKey = $object->s3_video;
$expires = time() + 300;
// Create a signed URL for the resource using the canned policy
$signedUrlCannedPolicy = $cloudFrontClient->getSignedUrl([
'url'         => $streamHostUrl . '/' . $resourceKey,
'expires'     => $expires,
'private_key' => '<MY_PEM_FILE_PATH>',
'key_pair_id' => '<KEY_PAIR_ID>'
]);
return $signedUrlCannedPolicy;
}

单击链接时,我收到此模棱两可的错误消息,这并不能真正帮助我调试问题:

<Error><Code>AccessDenied</Code><Message>Access
Denied</Message><RequestId>SOME_ID_HERE</RequestId><HostId>SOME_BASE64_HERE_NOT_READABLE</HostId></Error>

我想知道是否有某种方法可以调试它,也许在 AWS 控制台或某些 API 调用中?

该错误中的内容比您看到的要多。 您的 CloudFront 签名 URL 实际上正在工作。<HostId><RequestId>不是来自 CloudFront 的访问被拒绝错误中的组件。 此错误来自 CloudFront 接受您的签名请求后的 S3。

在 HTTP 响应标头中,您应该看到...

Server: Amazon S3
x-amz-request-id: (same value as the XML RequestId)
x-amz-id-2: (same value as the XML HostId)

S3 不允许 CloudFront 提取您的内容。

请参阅使用源访问身份限制对 Amazon S3 内容的访问并验证您的配置。

另请查看 Amazon CloudFront 延迟中的步骤,将 403 错误的错误缓存最小 TTL 设置为 0 秒,否则,在修复问题后,您将在最多 5 分钟(默认值)内继续看到该错误。

如果一切看起来都正确,您可能需要查看 S3 存储桶日志,以确保您请求的对象是您想要的对象。在 CloudFront 源设置中,有一个名为源路径的值,该值几乎应始终留空。 在此处放置值将导致 CloudFront 请求的对象与 URL 显示您正在请求的对象不同,因此您通常不应将此值设置为任何值。

试试

$signedUrlCannedPolicy = $cloudFrontClient->getSignedUrl([
'url'  => "{$streamHostUrl} / {$resourceKey}",
'expires'     => $expires,
'private_key' => '<MY_PEM_FILE_PATH>',
'key_pair_id' => '<KEY_PAIR_ID>'
]);

最新更新