Member-only story

S3 POST Upload with sigv4 presigned URL

--

這東西跟一般 sigv4 不太一樣,一般的 Upload 會用 PUT 。會用到 POST 上傳的,我想大部分都是老舊裝置。但其實蠻想吐槽所謂的 “老舊裝置” 的,實在想不到啥老舊裝置可以老舊到瀏覽器不支援 PUT。 大部分的 sigv4 參數要放在 form body 裡面。boto3 還特地弄了一個 method 來產生 POST Upload 用的 presigned URL 。

import boto3from botocore.client import Configbucket_name='delete-me-dub-djfsakfjhwelkjcd'object_name='test.txt'fields={'acl': 'public-read'}conditions=[{'acl': 'public-read'}]expiration=3600# Generate a presigned S3 POST URLs3_client = boto3.client('s3',config=Config(signature_version='s3v4', region_name='eu-west-1'))print(s3_client.generate_presigned_post(bucket_name,object_name,Fields=fields,Conditions=conditions,ExpiresIn=expiration))

遇到的問題

  • 不曉得為啥 file 一定要放 form-data 欄位的最後面,否則會出錯。
  • config 裡面的 region 也最好設定一下,我設定在環境環境變數的 AWS_PROFILE 竟然沒有成功使用到 ~/.aws/config 下的內建 region 。應該是這個 condig 只給 CLI 使用的緣故,SDK 無法讀取到。
  • 如果要 acl: public read 還要注意一下 block public access 設定。

--

--

Chen Li-Chi (陳立其)
Chen Li-Chi (陳立其)

Written by Chen Li-Chi (陳立其)

希望所有困難事都可以拆成簡單的事

No responses yet