aws s3 presign
を使うと時間経過で失効するURLを生成できます。そのURLからは誰でもS3上の該当ファイル*1にアクセスが可能です。
この機能を利用することでトラブルシュートなどで普段AWSを利用しないユーザに対してファイルを共有したいケースでも簡単に対応することができるよ、なメモです。
presign サブコマンドについて
上述したように s3
の presign
サブコマンドは認証済みのURLを生成してくれます。
aws-cliのGitHubリポジトリを確認したところ、このサブコマンドが追加されたのは2016-08-19のコミットのようです。そのためかなり古くから利用されてきた機能と言えます。
利用方法は極めてシンプルです。以下は aws s3 presign help
によるヘルプ結果からの抜粋ですが、対象のファイルは必須であるため、実質オプションは"有効期間を指定する"1つしかありません。
NAME presign - DESCRIPTION Generate a pre-signed URL for an Amazon S3 object. This allows anyone who receives the pre-signed URL to retrieve the S3 object with an HTTP GET request. For sigv4 requests the region needs to be configured explicitly. See 'aws help' for descriptions of global parameters. SYNOPSIS presign <S3Uri> [--expires-in <value>] OPTIONS path (string) --expires-in (integer) Number of seconds until the pre-signed URL expires. Default is 3600 seconds. See 'aws help' for descriptions of global parameters.
また、ヘルプにあるように有効期限を指定しない場合の制限時間は 3600 secondes = 1 hour です。この1時間をどう捉えるかはユースケース次第ですが個人的には長すぎず短すぎずのちょうど良い時間と感じています。
ちょっとした工夫
なお私は以下のような工夫を行っています。シンプルなシェルを常用コマンドとして作成しておくだけでファイル共有の速度が格段に上がります。
- 一時用のS3バケットには短期間で削除するLifeCycleを設定しておく
- 簡単なシェルで一時用のS3バケットへファイルアップロード
- 同じシェル内でダウンロード用のpresignedなURLの生成
#!/bin/bash -xe S3_BUCKET=morihaya-temp-bucket aws s3 cp $1 s3://${S3_BUCKET}/ aws s3 presign s3://${S3_BUCKET}/$1
利用イメージ
実際の利用イメージは以下です。
hoge
というファイルをシュッとS3バケットへアップします。
[morihaya@vm01 ~]$ s3up hoge + S3_BUCKET=morihaya-temp-bucket + aws s3 cp hoge s3://morihaya-temp-bucket/ upload: ./hoge to s3://morihaya-temp-bucket/hoge + aws s3 presign s3://morihaya-temp-bucket/hoge https://morihaya-temp-bucket.s3.amazonaws.com/hoge?AWSAccessKeyId=ABCDEFGHIJK&Signature=aBCDEfghiJKLMnOPqrSTxpires=1655648361 [morihaya@vm01 ~]$
後はこのURLをSlackなどで伝えたい相手に送りつけるだけです。大変便利ですね!!
有効期限が切れた場合
有効期限が切れた場合のサンプルも載せておきます。以下のようなメッセージが表示されてファイルへのアクセスはできなくなっています。 aws s3 presign
で生成したURLはケースによって技術者では無い方へ連携する場合もあるため、エラー画面としては少々インパクトが強いきらいはあります...
This XML file does not appear to have any style information associated with it. The document tree is shown below.
*1:S3の文脈だとオブジェクトと呼ぶべきですが利用者目線でファイルと呼びます