S3署名付きURLでのファイルのダウンロードおよびアップロード方法のメモ。
ダウンロード
ダウンロード用のURLはAWS CLIから生成できる。 有効期間のデフォルトは3600秒(1時間)で、最小は1秒、最大は604800秒(7日間)。24時間は86400秒。
aws s3 ls s3://my-backet-name/teraterm-4.105.exe aws s3 presign --expires-in 604800 s3://my-backet-name/teraterm-4.105.exe
なお、一時的な認証情報でURLを生成した場合、認証情報の有効期限が切れると、URLも失効するので注意すること。 IAM アクセスキーで URL を生成した場合も、アクセスキーを無効にすると、URL も失効する。
アップロード
アップロード用のURLの生成にはAWS SDKが必要となる。Pythonでやる場合は以下のようにする。
URLの生成
venvを作成してboto3
をインストールする。
python3 -m venv .env source .env/bin/activate pip install boto3
スクリプトを作成する。
generate_url.py
import os import boto3 BUCKET = os.getenv('BUCKET') KEY = os.getenv('KEY') s3 = boto3.client('s3') url = s3.generate_presigned_url( ClientMethod = 'put_object', Params = {'Bucket' : BUCKET, 'Key' : KEY}, ExpiresIn = 604800, HttpMethod = 'PUT' ) print(url)
バケット名とキー名を環境変数に指定してpythonスクリプトを実行する。
export BUCKET="<バケット名>" export KEY="<キー名(ファイル名)>" python generate_url.py
ファイルアップロード方法
curlでアップロードする場合は以下のようにする。
なお、-D
はレスポンスヘッダーを表示するオプションで-
で表示先として標準出力を指定している。
URL="<発行した署名付きURL>" FILE="<アップロードするファイル名>" curl -D - -XPUT --upload-file ${FILE} ${URL}
Windowsの場合は以下のようにアップロードできると思われるが未確認。
$uri = "<発行した署名付きURL>" $file = "<アップロードするファイル名>" Invoke-WebRequest -uri $uri -Method Put -Infile $file -UseBasicParsing
(補足)
TemporaryRedirect
となった場合は、リダイレクト先のURLを確認し、そちらのURLに対してアップロードを実行する。
curl -s -D - -XPUT --upload-file upload.zip ${URL} | grep -i Location: | awk '{print $2}'