【问题标题】:How to use "temporaryUrl" with custom cname in Laravel::Storage with Amazon S3 -> CloudFront and using a Cname如何在 Laravel::Storage 中使用带有自定义 cname 的“temporaryUrl”和 Amazon S3 -> CloudFront 并使用 Cname
【发布时间】:2019-01-21 22:30:42
【问题描述】:

我在 S3 中有一个文件,使用 CloudFront 使用 cname(使用亚马逊 SSL 证书),而文件是公开的,我可以使用 URL 毫无问题地访问它。

公共文件中的有效示例:

https://xxxxxxxxxxxxx.cloudfront.net/media/logos/logo1.png
https://cdn.{mydomain.com}/media/logos/logo1.png
https://s3.amazonaws.com/{mys3bucketname}/media/logos/logo1.png

在 laravel 中

$disk = Storage::disk('cnames3');
$tempUrl = $disk->temporaryUrl($file, now()->addMinutes(5));

我发现的最佳选择是: Should I use CloudFront together as TemporaryUrl for sensitive files in s3

'cnames3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
        'endpoint' => env('AWS_ENDPOINT'),
]

=====
.env
AWS_BUCKET={mys3bucketname}
AWS_ENDPOINT=https://xxxxxxxxxxxxx.cloudfront.net
AWS_URL=https://cdn.{mydomain.com}

但我生成的 URL 包含存储桶的名称,因此它对我不起作用,因为它拒绝我访问。

https://cdn.{mydomain.com}/{mys3bucketname}/media/logos/logoprivate.png?{params}

如何获得与 CNAME 兼容的 URL,或者如何才能使用我自己的域和签名 URL;我寻找这种格式:

https://cdn.{mydomain.com}/media/logos/logoprivate.png?{params}

如果我有私有文件并使用没有端点的“temporaryUrl” 它返回一个有效的网址:

 https://s3.amazonaws.com/{mys3bucketname}/media/logos/logoprivate.png?{params}

但是没有我的域,这对我不起作用,我一直在寻找解决方案几个小时,希望你能帮助这个主题的初学者

【问题讨论】:

  • 您尝试添加bucket_endpoint => true 吗?

标签: laravel laravel-5 amazon-s3 amazon-cloudfront laravel-filesystem


【解决方案1】:

您必须在配置中将bucket_endpoint 设置为true,然后它不会在您的域中附加bucket name

'cnames3' => [
        'driver' => 's3',
        'key' => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        'url' => env('AWS_URL'),
        'bucket_endpoint' => true,  //add this 
        'endpoint' => env('AWS_ENDPOINT'),
]

您可以在这里查看https://github.com/aws/aws-sdk-php/blob/master/src/S3/S3Client.php

【讨论】:

  • 现在格式是否正确! -> 但它不起作用docs.aws.amazon.com/sdk-for-php/v3/developer-guide/…
  • 3年后,真正的救世主!
【解决方案2】:

(假设带有 CNAME 的 CloudFront 已经在工作)

在 CloudFrontDistributions 的选项中>{yourCFID} 在“起源”选项卡中编辑:

原始访问身份 -> 使用身份

限制存储桶访问:是(并且是,更新存储桶策略)

在默认缓存行为设置中:

限制查看者访问 (使用签名 URL 或 已签名的 Cookie)= 是

可信签名者 = SELF

1.- 首先从 CloudFront 创建私钥

Creating CloudFront Key Pairs for Your Trusted Signers

2.-

composer require league/flysystem-aws-s3-v3

composer require aws/aws-sdk-php

3.- 创建函数: Signing CloudFront URLs for Private Distributions

例子:

 use Aws\CloudFront\CloudFrontClient;

...

//$filesystemDisk = "s3"
private function signUrl($filesystemDisk, $resourceKey = null)
{
    $cloudFront = new CloudFrontClient([
        'region'  => config('filesystems.disks.' . $filesystemDisk . '.region'),
        'version' => '2014-11-06',
    ]);
    // Set up parameter values for the resource
    //example
    $resourceKey = 'https://cdn.mydomain.com/media/logos/logoprivate.jpg';
    $expires = time() + 200;

// Create a signed URL for the resource using the canned policy
        $signedUrlCannedPolicy = $cloudFront->getSignedUrl([
            'url'         => $resourceKey,
            'expires'     => $expires,
            'private_key' => '/path/to/keys/amazon/cloudfront/private/pk-APKFYWFAKEFAKEFAKEIQ.pem',
            'key_pair_id' => 'APKFYWFAKEFAKEFAKEIQ',
        ]);

        return $signedUrlCannedPolicy;
    }

4.- 完成;你得到(用你的 cname):

https://cdn.{mydomain.com}/media/logos/logoprivate.jpg?{params}

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 2013-10-24
    • 1970-01-01
    • 2012-07-14
    • 2012-01-01
    • 2020-07-17
    • 1970-01-01
    • 2012-10-01
    • 2017-10-23
    相关资源
    最近更新 更多