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

时间:2018-04-08 22:13:24

标签: php amazon-web-services amazon-s3 amazon-cloudfront

这是我的签名网址功能:

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调用中?

2 个答案:

答案 0 :(得分:2)

错误中的错误比你看到的要多。您的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提取您的内容。

请参阅Using an Origin Access Identity to Restrict Access to Your Amazon S3 Content并验证您的配置。

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

如果一切看起来都正确,您可能需要查看S3存储桶日志以确保您正在请求您想要的对象。在CloudFront原始设置中,有一个名为Origin Path的值,几乎总是留空。在那里放置一个值会导致CloudFront要求一个不同的对象而不是URL使它看起来像你要求的那样,所以这个值通常不应该设置为任何东西。

答案 1 :(得分:0)

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