S3 バケットをオリジンとして Cloudfront プライベート ディストリビューションを使用してコンテンツを提供しようとしています。
テスト目的でバケットにイメージ ファイルがあり、アクセス許可がプライベートに設定されています。Cloudfront オリジン アクセス ID がアクセス許可を取得できるようにバケット ポリシーを設定しました
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity **************"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::studeersnel.{{my-bucket}}/*"
}
]
}
Cloudfront ディストリビューションを (署名付き URL を使用せずに) パブリックに設定すると、正常に動作します。S3 の直接リンクではオブジェクトにアクセスできませんが、Cloudfront の URL を使用してアクセスできます。
「デフォルトのキャッシュ動作設定」で「ビューアー アクセスを制限する (署名付き URL を使用する)」を「はい」に設定すると、機能しなくなりました。403 エラーが発生します。署名付き URL をたどると、次のメッセージが表示されます。
<Error>
<Code>AccessDenied</Code>
<Message>Access denied</Message>
</Error>
次のコードを使用して、php-sdk を使用して署名付き URL を作成しています。
require '../vendor/autoload.php';
use Aws\CloudFront\CloudFrontClient;
$cloudFront = CloudFrontClient::factory(array(
'key' => '********************',
'secret' => '****************************************',
'private_key' => '../pk-********************.pem',
'key_pair_id' => '********************',
));
$hostUrl = 'http://**************.cloudfront.net';
$resourceKey = 'desert.jpg';
$expires = time() + 300;
$signedUrl = $cloudFront->getSignedUrl(array(
'url' => $hostUrl . '/' . $resourceKey,
'expires' => $expires,
));
echo $signedUrl.'<br><br>';
echo '<img src="' . $signedUrl . '">';
私が間違っていることはありますか?