S3を使ってファイルを共有したい
WordやPowerPoint, PDFなどのちょっとしたファイルは、あまり良い方法ではないことを理解してはいるのですが、zipにしてメール添付で転送し、他のユーザーに送ることはあります。ただ、動画ファイルとなると、20-30MBは当たり前、1GB近くになるものも扱うようになり、これをメールに添付はさすがにダメだろう、、、となります。
同じ会社内であれば、ネットワーク上のファイルサーバーなどで共有しますが、外部の協力会社やパートナー、お客様と共有するとなると、何を使うべきか悩むところです。
クラウドベンダーのネットワークドライブサービスを使う人も多いですし、実際、個人のアカウントで使いなれているサービスが1つくらいはあるでしょう。Google ドライブや Microsoft の OneDrive などは使っている方も多いでしょう。
一方でAWSのストレージサービスといえばAmazon S3(Simple Storage Service)ですが、OneDriveやGoogle DriveのようなSaaSとしてのサービス提供とは言えず、エンドユーザー向けの使い勝手になっていません。でも、自分がAWSのアカウントを持っているのであれば、S3を使ってファイル共有したいと思いますよね。
セキュリティが厳しい弊社
AWSのアカウントを持っていれば、S3を使ってファイル共有すればいい、と軽く考えます。ところがいざやってみようとすると「ユーザーのチェック(=認証と承認)はどうするんだ?」という問題にぶつかります。外部の方々とファイル共用したいので、ファイルのURLを渡して、匿名アクセス(=無条件のアクセス)させて、相手がダウンロードしたのを確認したら消せばいい、と考えがちです。
そこでやってしまうのが、S3バケット(フォルダーのようなもの)をパブリックアクセス(だれでもアクセス可能な状態)にして作成し、バケットに共有したいファイルを格納して、そのオブジェクト URLを共有する方法です。が、これはしてはいけません!
弊社では、弊社で管理しているAWSアカウントでこのようなパブリックアクセスのS3バケットを作成すると、1時間かからないくらいで「警告メール」を受け取ることになります。パブリックアクセスになっているS3バケットがあなたのアカウントで見つかった、セキュリティ上、情報漏洩のリスクが高く、早急に削除してください、という内容のものです。たしかに、今つくったバケットにいれたものは世界中からアクセス可能になるので、事故が起こるリスクが高いわけです。
ちなみに、この警告メールを無視すると大変なことになります。自分は、このメールを金曜日の夜に受け取り、土日まったく気が付かず、月曜日に会社にいったらビルに入館はできたものの、会社のメールやネットワークへのアクセスができなくなっていました。米国本社の役員までアラートが飛んでいました。
それでもS3を使いたい
かといって、Google DriveやOneDriveを使って同じようなことはできるのですが、セキュリティという観点からすると上記の措置も理解できるわけで、セキュリティを担保したうえで、S3を使って大きなサイズのファイルをするには、、、と考えました。
IAMでダウンロード用のユーザー作って渡す?いやいやそんな一時的なアカウント作りたくないです。
パスワード設定して、パスワードでアクセス可能にする?S3の仕組みにあるの?ない?ないならどうするの?Basic認証?EC2たてなきゃだめ??なんかサーバーレスでできるらしいぞ、それもCloudFront+S3で!
おいお前、DropBoxみたいものを作ろうとしてないか?
と、気づいたわけです。
そこで、さらに調べてみるとS3には署名付きURLという機能があって、それを使うことで、有効期限付きのURLを作成して利用することができる、とありました。
署名付きURLはCLIで
ITの世界はドッグイヤーと呼ばれるように変化・進化が激しい世界です。インターネットで検索にヒットして解決方法らしい記事を見つけるのはうれしいことなのですが、時としてその情報は古い情報であり、実はもっと簡単に楽にできるように機能拡張されているとか、新しいサービスができていることはよくあることなんです。
S3の署名付きURLの作成も、PHP/Python/C#/JAVAのSDK(Software Development Kit)をつかって作成する方法を紹介した記事がたくさんありました。一瞬自分も無料版のVisual Studio Community入れるか、と思いましたが、URLひとつ作るのにVisual Studio? という思いが強く(要は面倒)、引き続き検索をしていたら、なんと、CLIで事前署名付きURL(pre-signed URL)をコマンド1発で作成できるようになっていたのでした。
幸い、JAWS-UGのCLI専門支部を見学したこともあり、CLIを使う環境は自分のPCにできていたので楽でした。たぶん、初めての人はこのCLIの環境をPCにインストールするのが一番のハードルかもしれません。その時のポイントはCLIに紐づけるIAMのアカウントの権限でしょう。S3しか触れないポリシーを設定するのが推奨となるはずですが、わからなかったときはフルアクセスのユーザーをCLIに紐づけしていました、、、わかっていてやるならまだしも、わからずにこれは怖いことです。
作成するS3バケットは「パブリックアクセスをすべてブロック」で大丈夫です。共有したいファイルをS3バケットにアップロードして、ファイル(オブジェクト)のパスをコピーします。CLIのコマンド画面で以下のコマンドをいれてエンターキーで完了です!
AWS S3 presign <S3オブジェクトのパス> [--expires-in 3600]
そうすると、コマンドライン上で事前署名付きURLを受け取ることができます。上記の3600は3600秒つまり1時間の有効期限付きのURLを作成せよ、というコマンドです。
まとめ
・フルアクセスのS3バケットは作っちゃダメ!
・S3の署名付きURLを作るならCLIが一番楽。
・やり方はいろいろあるのがAWS。本当にそのやり方でいいのか検討・検索しまくろう!
というお話でした。
この話は昨年11月に大分で開催されたJAWS-UG大分支部の勉強会のLTで紹介した内容ですが、今でも署名付きURLを「警告メールなし」で使っています。とても使いやすいので皆さんもぜひ使ってみてください。
2713文字80分
Sebastian Mey による Pixabay からの画像をお借りしました
Darwin Laganzon Pixabay からの画像をお借りしました
この記事が気に入ったらサポートをしてみませんか?