Вот моя функция 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?
В этой ошибке больше, чем вы видите. Ваш подписанный URL-адрес CloudFront действительно работает. <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)
S3 не позволяет CloudFront получать ваш контент.
Увидеть Использование идентификатора исходного доступа для ограничения доступа к вашему контенту Amazon S3 и проверьте свою конфигурацию.
Также просмотрите шаги в Задержка Amazon CloudFront чтобы установить минимальный TTL для кэширования ошибок для 403 ошибок равным 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>'
]);