AWS S3 CLI 事前署名付きURL発行コマンド presign が便利過ぎて感激しながら考えたこと

こんにちは。梶原です。
これは TECHSCORE Advent Calendar 2017 の2日目の記事です。

Amazon Web Service を利用していて、久しぶりに
あらん限りの声で「

(人''▽`)ありがとう☆

」と叫びたくなった出来事がありました。
クリスマスは感謝の季節! あまりにも嬉しかったので、記事に残しておくことにしました。

CLI コマンド「presign」に関する記述は記事の中ほどです。こちらからジャンプしてください。

目次

困った、S3 上にあるファイルを渡したい、けど…


photo credit: professor.jruiz FlickrCC via photopin (license)

社内でちょっとしたファイルの受け渡しをするときに、困ったことはありませんか?

  • メールで送るにはサイズが大きすぎる
  • ファイルは S3 上に置かれているので取りに来てもらいたいけど、同じ社内とはいえ
    他部署のメンバーに AWS のユーザーアカウントを渡したくない
  • 数日が経過すると S3 上から削除されてしまうファイルなので
    教えた URL が「Not Found」になってしまうのはカッコ悪い
  • そもそも、S3 上のファイルは非公開に設定してあるので URL からはアクセスできない

こういう時に威力を発揮するのが「事前署名付き URL(pre-signed URL)」です。
有効期限付きで URL を発行できればパーフェクトですね。

AWS ユーザーアカウントは不要。URLをクリックするだけでファイルダウンロードが可能です。開発業務ではない部署のメンバーでも操作に迷いが起きない、親切な方法です。
ファイルの削除前に必ず URL の有効期限が切れるようにしておけば、有効期限が切れた後は「アクセス拒否」となります。URL を発行する側が期限をコントロールするので、「Not Found」の100倍はカッコ良い!ヾ(*≧∀≦)ノ゙

なお、S3 アクセス時のセキュリティ対策については AWS アカウントの管理者と事前によく相談しましょう。

以前はコーディングが必要だったけど、今は…

S3 の事前署名付き URL の発行方法は、数年前に調べたことがありました。
Java や Perl でのサンプルコードが公開されており、「ふーん、意外に面倒だなー」と思っていました。

署名付き URL の署名を作成するためのコード例 - Amazon CloudFront

社内業務で S3 上のファイルのやり取りが必要になり、「とうとうあのサンプルコードを活かさせてもらう機会が来たかー」と覚悟を決めました。
そして、ふと思いました。

CLI コマンド操作で URL が発行出来ればいいのになー(´・ω・`)、

と。

はい。コマンド一発で簡単に出来るんです。それが「presign」コマンドです。
今から1年以上前にリリース済み。
知らないとは恐ろしいもので、危うく自分でガリガリとコーディングして楽しむ…時間を無駄にするところでした。

シンプルなコマンド「presign」

presign — AWS CLI 1.12.0 Command Reference

リファレンスの短さからも分かる通り、非常にシンプルなコマンドです。
利用方法も明快で、S3 のリソースURL と、必要な場合は --expires-in オプションで有効期限(単位:秒、デフォルト値は3,600秒 = 1時間)を設定するだけです。

生成されたURL の例(一部 加工済み)
https://****/my-bucket.s3.amazonaws.com/test/my-data.csv?AWSAccessKeyId=AABBCCDDEEFFGGHHIIJJKK&Expires=1511780718&Signature=xs3S3AbCdefG7hjJKfooFobar7c%3D

有効期限内にURLをクリックするとダウンロードが開始されますが、有効期限が切れるとエラー情報が返されます。(一部 加工済み)
有効期限切れエラー

情報掲載が行き届いた公式ドキュメントたち

設定できる有効期限に上限値を設けられているんだろうか? と疑問を感じる人がいるかも知れません。
AWS SDK のドキュメントにちゃんと答えがありました。( Ruby 版ドキュメントでの場合)
Class: Aws::S3::Presigner — AWS SDK for Ruby V2
「7日間(604,800秒)」です。

ダウンロード中に有効期限を迎えた場合はどうなるんだ? と疑問を感じる人もいるかも知れません。
公式ドキュメントにちゃんと答えがありました。
署名付き URL の使用 - Amazon CloudFront
「ダウンロード中に有効期限切れ時刻が経過してもダウンロードは完了します」です。

事前署名付き URL の SDK 解説箇所に「presign コマンドをリリースしたからこっちも確認してね」等のリンクが無いなど、情報の整理に関しては多少とっ散らかっている印象はあります(※個人の感想です!)が、よくある疑問は公式ドキュメントだけで解決できると思います。

感激しながら考えたことと、まとめ

S3 上にあるファイルを渡したい、けど…、という私の困りごとを完璧かつ綺麗にハマる形で解決してくれた「presign」コマンド。
シンプルかつ迷いがない仕様。
疑問に明快に答えてくれるドキュメント。

各種言語で URL を発行できる SDK を既に提供済みであるのに、更に一歩踏み込んでコマンド一発で簡単に発行出来るようにしようと思い、そして実現した AWS 開発陣の皆さんはすごい! よくぞ気が付いてくれた、と感謝感激でした。

「驚きと喜び(幸せ)を提供する」という目標を掲げている会社は数多あります。
当然我が社もその1つなのですが、「そうか、こういう事か」と今回の体験を通じて改めて認識しました。
この「ストンと腑に落ちた感」を他の誰かに手渡せる成果を私も挙げていかないといけないし、そうできればいい、を目標に日々研鑽を積んで行こうと思います。


photo credit: K-nekoTR SAKURA #517 via photopin (license)

Comments are closed, but you can leave a trackback: Trackback URL.