大容量ファイルを 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

料金については、ストレージの種類によって異なりますが、データの受け渡しのような一時的な利用であれば、極めて安価に利用できます。

qiita.com

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を発行することでセキュリティレベルを落とすことにもなるのでその点は注意が必要です。

dev.classmethod.jp