使用签名URL在Cloudfront分发上拒绝访问

时间:2014-12-15 14:47:15

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

我正在尝试使用带有S3存储桶的Cloudfront私有分发来提供内容。

我的存储桶中有一个图像文件用于测试,其权限设置为私有。我已设置了我的存储桶策略,因此Cloudfront Origin Access Identity已获得权限

{
"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发行版设置为公开(不使用签名网址)时,它可以正常工作。使用直接S3链接无法访问该对象,但可以使用Cloudfront URL访问该对象。

现在,当我在“默认缓存行为设置”下将“限制查看器访问(使用签名的URL)”设置为“是”时,它不再起作用。我收到403错误。如果我按照签名的网址收到此消息:

<Error>
  <Code>AccessDenied</Code>
  <Message>Access denied</Message>
</Error>

我使用php-sdk使用以下代码创建我的签名网址:

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

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

修复了今天的问题,所以如果有人遇到同样的问题,我想在此处发布解决方案。

我认为它必须是生成url本身的问题,所以再次查看凭据。检查完所有内容后,我决定尝试创建一个新的Cloudfront密钥对。出于某种原因,这解决了这个问题。