簡體   English   中英

通過 CloudFront 通過簽名 URL 上傳到 S3?

[英]Uploads to S3 through CloudFront via Signed URLs?

我有使用 S3 源的 CloudFront。 如果可能,我希望能夠通過 CloudFront 分配生成用於將值上傳到 S3 的簽名 URL。

我一直在研究文檔,但沒有找到任何關於此的內容。 我想只要傳遞查詢參數,但情況是這樣嗎?

不是重復的:我正在使用簽名 URL。

是的,您可以使用 CloudFront 分配來提取 S3 文件上傳。

根據您的設置,在另一個答案中建議的S3 Transfer Acceleration 可能仍然是更好的選擇,它當然有更好的文檔記錄並且有更多的實現示例!

創建一個新的 CF 發行版

  • 使用目標 S3 存儲桶作為源
  • 配置源 S3 存儲桶訪問以使用 CloudFront 源訪問身份。 雖然您可以自動更新存儲桶策略(使用s3:GetObject訪問權限)作為起點,但無論如何我們都會將其添加/更改為s3:PutObject

配置 S3 存儲桶訪問以使用 CloudFront 源訪問身份

  • 配置“允許的 HTTP 方法”以包含POST

配置允許的 HTTP 方法

  • 我們將允許寫入存儲桶,因此最好“限制查看者訪問”並要求使用 CloudFront 簽名 URL或簽名 cookie 進行訪問。

需要簽名的 URL 或 cookie

配置 S3 存儲桶策略

  • 如果您已開始使用上述自動更新的存儲桶策略,則您的存儲桶策略應包含如下內容,其中XXXXX是 OAI ID,而YOUR-TARGET-BUCKET是您的目標存儲桶:
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXX"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::YOUR-TARGET-BUCKET/*"
        }
    ]
}
  • 您可以s3:PutObject添加為允許的操作,但如果您僅設置內容攝取的分發(即通過另一個分發提供,或根本不公開可用),您可以只替換允許的操作:
            "Action": "s3:PutObject",

使用 CloudFront 分配將文件上傳到 S3

分配更新后,您將能夠通過使用 Postman 或其他方式向https://your-distribution-url/desired-s3-key-name發出PUT請求,將文件添加到您的存儲桶中。 如果這是您配置的內容,請記住在此處使用簽名網址。

您的客戶端與 CF 邊緣的連接應該始終更快,而據傳聞,S3 加速速度比較並不總是有利的。

如果我對 AWS 定價的理解正確,那么與S3 Transfer Acceleration費用(0.04-0.08 美元/GB,具體取決於區域)相比,您需要支付“區域數據傳出到源”(0.02-0.16 美元/GB,具體取決於區域)。

原因是要為來自世界各地的用戶將文件上傳到中央存儲桶提供低延遲訪問嗎? 在這種情況下,我建議改為使用S3 Transfer Acceleration。

出於多種原因,您可能需要在存儲桶上使用Transfer Acceleration,包括:

  • 您擁有從世界各地上傳到集中存儲桶的客戶。

  • 您會在各大洲之間定期將千兆字節的數據傳輸到TB的數據。

  • 上傳到Amazon S3時,您將無法利用Internet上的所有可用帶寬。

https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html

Amazon S3傳輸加速正在場景中使用Cloudfront。

傳輸加速利用了Amazon CloudFront的全球分布邊緣位置。 當數據到達邊緣位置時,數據會通過優化的網絡路徑路由到Amazon S3。

我以為只要傳遞查詢參數,情況就是這樣嗎?

不完全的。 可以將CloudFront配置為傳遞查詢字符串參數,但是它仍然不支持此用例,因為CloudFront X-Amz-Cf-Id標頭注入發送到S3的請求中。 因為標題以X-Amz-*開頭,所以S3要求對其進行簽名...但這是不可能的,因為您無法知道其值。

可以授予CloudFront原始訪問身份寫入存儲桶的權限,但這也很麻煩,因為隨后CloudFront可以讀取的任何路徑也可以寫入-CloudFront簽名的URL允許“訪問”-無論哪種訪問方式CloudFront如果CloudFront通過OAI允許寫入存儲桶,則它本身具有-並且不能配置為只讀。

傳輸加速是一種更好的解決方案,因為它使用CloudFront網絡進行傳輸,但是可以理解本機S3簽名的URL。 您想要在Lambda函數中使用域名而不是存儲桶名稱來對URL進行簽名的爭論失敗了……因為您在任何情況下都無法對S3 URL進行簽名,而實際上並不知道存儲桶名稱。

暫無
暫無

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

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