[英]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使用不同的格式和憑據。
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.