Member-only story
S3 POST Upload with sigv4 presigned URL
May 18, 2022
這東西跟一般 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 設定。