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

fun*_*err 5 php amazon-s3 amazon-web-services amazon-cloudfront

这是我的签名 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

 <Error><Code>AccessDenied</Code><Message>Access
 Denied</Message><RequestId>SOME_ID_HERE</RequestId><HostId>SOME_BASE64_HERE_NOT_READABLE</HostId></Error>
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*bot 8

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

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

Server: Amazon S3
x-amz-request-id: (same value as the XML RequestId)
x-amz-id-2: (same value as the XML HostId)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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