S3の署名付きURL(S3 Presinged URL)は、S3バケットへのアクセス権限を持たないユーザーに対して一時的なアクセスを許可するために発行するURLです。
コンソールからも作成可能ですが、発行する条件によって有効期限が色々決まっているのが複雑で、意図した有効期限より短くなってしまう場合があります。
- IAMインスタンスプロファイル: 最長 6時間
- AWSコンソールで設定可能な時間: 最長 12時間
- IAMロールの連鎖セッションで発行した場合:最長 12時間(デフォルトは1時間)
- AWS Security Token Service (STS): IAM ユーザーが署名した場合は最長 36時間、ルートユーザーが署名した場合は最長 1時間
- IAM ユーザー: 最長 7 日間有効 (AWS 署名バージョン 4 を使用した場合)
今回は、最長の 7日間有効なURLを発行する手順を確認しました。CloudShellに少し設定を加えるのが簡単なようでしたので、そのやり方をまとめました。
1.CloudShellでアクセスキーを設定
CloudShellには認証情報が設定されていますが、そのままだと最長の場合に該当しません。アクセスキーを作成し、aws configureコマンドで追加設定します。
$ aws configure
AWS Access Key ID [******************FU]: <アクセスキーを入力>
AWS Secret Access Key [******************1q]: <シークレットキーを入力>
Default region name [us-east-1]: <リージョンを入力(この場合は何でもよい)>
Default output format [json]: <出力形式(この場合は何でもよい)>
2.スクリプトでURLを発行
AWS 署名バージョン 4 を使用するスクリプトを作成します。ここではスクリプト内で 604800 秒を指定していますが、短くすることももちろん可能です。
generate_presigned_url.py
import sys
import boto3
from botocore.client import Config
args = sys.argv
bucket = args[1]
key = args[2]
# Get the service client with sigv4 configured
s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
# Generate the URL expires in 604800 seconds (seven days)
url = s3.generate_presigned_url(
ClientMethod='get_object',
Params={
'Bucket': bucket,
'Key': key
},
ExpiresIn=604800
)
print(url)
あとはファイルを指定してpython3(CloudShellでboto3インストール済)で実行すればURLが生成できます。
python3 generate_presigned_url.py <バケット名> <オブジェクトキー>
実行例:
$ python3 generate_presigned_url.py dev-test-backet folder/test/public.txt
https://dev-test-backet.s3.amazonaws.com/folder/test/public.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAYSE7XXXXXXXXXXXXXXXX220407%2Fus-east-1%2Fs3%2Faws4_request
&X-Amz-Date=20220407T014221Z&X-Amz-Expires=604800&X-Amz-SignedHeaders=host&X-Amz-Signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXe44d71b78a5
あとは時間経過後にアクセスして、意図した有効期間でURLが生成されていることが確認できます。