配置AWS cloudfront以便从s3存储桶

时间:2017-02-16 06:37:32

标签: php amazon-web-services amazon-s3 laravel-5

我的s3存储桶中有一个名为private的文件夹,该文件夹中的内容只能由授权用户访问(即禁用公共读取访问权限)。

所以我生成了用于访问该文件夹中某个对象的sigened url,它工作正常。

以下是签名的网址格式

s3-<region>.amazonaws.com/<folder>/<imagename>??X-Amz-Content-Sha256=.......

此外,我还为上述s3存储桶创建了云端分发,以获得更好的性能。 这是云端网址xxxxjjjj.cloudfront.net

那么我如何使用此云端分发服务我的签名网址?

当我尝试使用此网址时

xxxxjjjj.cloudfront.net/<folder>/<imagename>??X-Amz-Content-Sha256=.......

我将获得访问被拒绝错误,我认为这不是通过cloudfront发布方式提供s3签名网址内容的正确方法。

使用php laravel框架

2 个答案:

答案 0 :(得分:5)

CloudFront的签名URL使用与S3的签名URL不同的格式和不同的凭据。

阅读Serving Private Content through CloudFront

GitHub上有laravel-url-signer,您也可以从this example in the CloudFront docs编写自己的代码。

要测试您的CloudFront和S3设置,您可以使用aws-cli中的aws cloudfront sign ...生成测试签名网址。

答案 1 :(得分:0)

您可以在此链接https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/cloudfront-signed-url.html

中使用PHP SDK提出一个示例

这是使用自定义策略的Larave(5.3)中的等效代码:

public static function signedUrl($resourceKey) {
    //$resourceKey = 'videos/example.mp4'
    $baseUrl = 'https://xxxxjjjj.cloudfront.net';
    $fullUrl = $baseUrl . '/' . $resourceKey;
    $expires = time() + 300;
    $customSigningPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$fullUrl}",
            "Condition": {
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;

    // CloudFront Signed Urls
    /** @var CloudFrontClient $cloudFront */
    $cloudFront = \AWS::createClient('CloudFront');
    $url = $cloudFront->getSignedUrl([
        'url' => $fullUrl,
        'policy' =>  $customSigningPolicy,
        'key_pair_id' => 'YOUR_KEY_PAIR_ID',
        'private_key' => '/path/to/your/cloudfront-private-key.pem'
    ]);

    return $url;
}

P.S。我在aws示例中发现了一个错误,因为他们使用$ resourceKey作为策略中的Resource值而不是woking,对我有用的是使用文件的完整url。

他们的代码:

$resourceKey = 'videos/example.mp4';
$customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$resourceKey}",
            "Condition": {
                "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"},
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;

工作原理:

$resourceKey = 'videos/example.mp4'; // or $resourceKey = 'videos/*'; or $resourceKey = '*';
$fullUrl = $baseUrl . '/' . $resourceKey;
$customPolicy = <<<POLICY
{
    "Statement": [
        {
            "Resource": "{$fullUrl}",
            "Condition": {
                "IpAddress": {"AWS:SourceIp": "{$_SERVER['REMOTE_ADDR']}/32"},
                "DateLessThan": {"AWS:EpochTime": {$expires}}
            }
        }
    ]
}
POLICY;