S3署名付きURLでのファイルのダウンロードおよびアップロード

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}'

参考リンク