1

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 . '">';

私が間違っていることはありますか?

4

1 に答える 1

1

今日問題を修正したので、誰かが同じ問題に遭遇した場合は、ここに解決策を投稿すると思いました.

URL自体の生成に問題があるに違いないと考えたので、資格情報をもう一度調べました。すべてを確認した後、新しい Cloudfront キーペアを作成してみることにしました。何らかの理由で、これで問題が解決しました。

于 2014-12-24T14:51:05.263 に答える