もりはやメモφ(・ω・ )

ITとか読書感想文とか

aws s3 presign でのファイル受け渡しが便利

aws s3 presign を使うと時間経過で失効するURLを生成できます。そのURLからは誰でもS3上の該当ファイル*1にアクセスが可能です。 この機能を利用することでトラブルシュートなどで普段AWSを利用しないユーザに対してファイルを共有したいケースでも簡単に対応することができるよ、なメモです。

docs.aws.amazon.com

presign サブコマンドについて

上述したように s3presign サブコマンドは認証済みのURLを生成してくれます。

aws-cliのGitHubリポジトリを確認したところ、このサブコマンドが追加されたのは2016-08-19のコミットのようです。そのためかなり古くから利用されてきた機能と言えます。

github.com

利用方法は極めてシンプルです。以下は 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などで伝えたい相手に送りつけるだけです。大変便利ですね!!

SlackでPresignedなURLを送りつけるの図

有効期限が切れた場合

有効期限が切れた場合のサンプルも載せておきます。以下のようなメッセージが表示されてファイルへのアクセスはできなくなっています。 aws s3 presign で生成したURLはケースによって技術者では無い方へ連携する場合もあるため、エラー画面としては少々インパクトが強いきらいはあります...

This XML file does not appear to have any style information associated with it. The document tree is shown below.

presignedの有効期限が切れた場合のエラー

*1:S3の文脈だとオブジェクトと呼ぶべきですが利用者目線でファイルと呼びます