大容量ファイルを S3 に置いてダウンロードする方法
大容量の画像ファイルなどを急ぎで共有したいとき、ありますよね。
今回はaws-cli
をつかって、ある程度のサイズのファイルであれば Dropbox のようなサービスの無料枠で共有が可能ですが無料使用枠を越えた容量の場合の対処法をメモします。
ただし、この方法には情報の漏洩のセキュリティリスクがあるので、重要な情報であればよりセキュリティレベルを高めた方法(後述)で検討すべきと思います。
前提条件
aws-cli
を使用します。
$ python --version Python 2.7.11 $ aws --version aws-cli/1.10.63 Python/2.7.11 Darwin/15.6.0 botocore/1.4.53
また、今回の方法ではURLが外部に漏れたときに認証無しでファイルをダウンロードできるという情報漏洩のリスクがあります。
対策としてURLの有効期限を短めに設定したり、ダウンロードが完了したらIAMポリシーを速やかに破棄したりといった対策も検討すべきかと思います。
あるいは、presigned URL を利用するのでなく、 S3 に対応した SSH クライアントソフト( Cyberduck など)を利用して、認証付きでダウンロードするという方法もありかと思います。
https://cyberduck.io/index.ja.html?l=ja
S3 とは
S3 ( Amazon Simple Storage Service )は2016年にリリースされたサービス。
S3は「99.999999999%の耐久性と年間99.99%のオブジェクトの可用性を提供できるように設計されています」。(中略)AmazonのエバンジェリストであるJeff Barrによれば、この9の並びが意味しているのは、「10,000個のオブジェクトをS3に保存したとすれば、平均て1000万年に1つほどのファイルを失うことになる。 といわれる、データの完全性、可用性において極めて優れたサービスであると言えます。
https://www.amazon.co.jp/dp/4873115817
料金については、ストレージの種類によって異なりますが、データの受け渡しのような一時的な利用であれば、極めて安価に利用できます。
IAM の設定
test-bucket
という名前の Bucket とその直下のファイル対して参照だけできるIAMポリシーを設定しておきます。
{ "Version": "20xx-xx-xx", "Statement": [ { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws:s3:::test-bucket" ] }, { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::test-bucket/*" } ] }
aws-cli
を使って presigned URL を生成
test.txt
というファイルをtest-bucket
に設置します。
上で設定したAWSロールを適用したIAMユーザhogehoge
を作って、aws configure --profile hogehoge
で認証情報の設定を作成しておきます。
今回は、有効期間1日の URL を生成するため--expires-in 86400
のオプションを指定しました(60 * 60 * 24)。
$ aws s3 presign test-bucket/test.txt --expires-in 86400 --profile hogehoge
これURLが発行されるので、そのURLを伝えればダウンロード可能です。ダウンロードが終わったらIAMポリシーを削除するなりしたらダウンロードできなくなります。
なお、上にも記載しましたが、presigned URLを発行することでセキュリティレベルを落とすことにもなるのでその点は注意が必要です。