这是我的签名网址功能:
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调用中?
答案 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>'
]);