簡體   English   中英

配置AWS Cloudfront以從s3存儲桶提供簽名的URL

[英]Configure AWS cloudfront for serving signed url from s3 bucket

我的s3存儲桶中有一個名為private的文件夾,並且該文件夾中的內容僅由授權用戶訪問(即,公共讀取訪問已禁用)。

因此,我正在生成已簽名的url,用於訪問該文件夾中的對象之一,效果很好。

這是簽名的URL格式

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

我也為上述s3存儲桶創建了Cloudfront發行版,以獲得更好的性能。 這是cloudfront網址xxxxjjjj.cloudfront.net

那么,如何通過此Cloudfront發行版本提供我的簽名URL?

當我嘗試使用此網址

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

我將收到拒絕訪問錯誤,我認為這不是通過Cloudfront分發交付s3簽名url內容的正確方法。

使用PHP Laravel框架

CloudFront的簽名URL與S3的簽名URL使用不同的格式和憑據。

閱讀通過CloudFront提供私人內容

GitHub上有一個laravel-url-signer ,或者您可以在CloudFront docs中的此示例中編寫自己的代碼。

為了測試您的CloudFront和S3設置,您可以在aws-cli中使用aws cloudfront sign ...生成測試簽名的URL。

在此鏈接中有一個示例說明您使用PHP SDK的要求:https://docs.aws.amazon.com/aws-sdk-php/v3/guide/service/cloudfront-signed-url.html

這是使用自定義策略的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;
}

PS:我在aws示例中發現了一個錯誤,因為它們使用$ resourceKey作為未喚醒策略中的Resource值,所以對我有用的是使用文件的完整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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM