この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
西澤です。S3 Transfer Accelerationの利用を検討する為、みんな大好きAWS CLIから試してみたのでご紹介したいと思います。
S3 Transfer Accelerationとは?
S3 Transfer Accelerationとは、海外リージョン等の送信元から遠く離れたS3へのデータ転送を、AWSのエッジロケーションとネットワークプロトコルの最適化を利用して高速化するサービスです。詳細については、下記の「よくある質問」がわかりやすいかと思います。
S3 Transfer Accelerationを有効にする
S3 Transfer Accelerationは、バケット単位で有効にすることができます。設定そのものでは課金は発生しませんが、GBアップロードあたり$0.04が課金対象となりますのでご注意ください。また、下記の制約がある点にもご注意ください。
バケットで Transfer Acceleration を使用するには、バケット名がピリオド (".") を含んでおらず、DNS 命名要件に準拠している必要があります。
Amazon S3 Transfer Acceleration - Amazon Simple Storage Service
設定作業そのものは非常に簡単です。今回は試しに、Ireland(eu-west-1)にバケットを作成してS3 Transfer Accelerationを有効にしてみました。
AWS CLIを使ってS3 Transfer Accelerationを試してみた
それでは、早速試してみましょう。まずは、オプション指定なしでアップロードを試してみます。通常通りのリージョン別に用意されたS3エンドポイントが利用されます。
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m2.493s
user 0m0.328s
sys 0m0.064s
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m2.472s
user 0m0.332s
sys 0m0.056s
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m2.471s
user 0m0.336s
sys 0m0.052s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m4.732s
user 0m0.460s
sys 0m0.044s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m4.797s
user 0m0.480s
sys 0m0.032s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m4.829s
user 0m0.436s
sys 0m0.056s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m8.004s
user 0m1.160s
sys 0m0.156s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m7.763s
user 0m1.148s
sys 0m0.152s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m9.718s
user 0m1.200s
sys 0m0.136s
S3 Transfer Accelerationを利用するには、自動的に最寄りのエッジロケーションを利用できるs3-accelerate.amazonaws.com
をエンドポイントとして指定する必要があります。AWS CLIでこれを指定する場合には、--endpoint-url
オプションを指定するのが簡単です。それでは試してみましょう。
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m0.775s
user 0m0.348s
sys 0m0.036s
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m1.221s
user 0m0.336s
sys 0m0.036s
$ time aws s3 cp ./1mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./1mb.dummy to s3://accelerated-bucket-in-eu-west-1/1mb.dummy
real 0m1.220s
user 0m0.340s
sys 0m0.032s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m1.829s
user 0m0.412s
sys 0m0.040s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m2.072s
user 0m0.400s
sys 0m0.044s
$ time aws s3 cp ./10mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./10mb.dummy to s3://accelerated-bucket-in-eu-west-1/10mb.dummy
real 0m2.324s
user 0m0.376s
sys 0m0.068s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m3.396s
user 0m0.944s
sys 0m0.124s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m3.743s
user 0m0.908s
sys 0m0.148s
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m3.696s
user 0m0.944s
sys 0m0.124s
8〜10秒かかっていた100MBのファイルが4秒程度でアップロードできるようになりましたね!
--endpoint-url
オプションを毎回指定するのが面倒な方は、configファイルに埋め込むことも可能ですが、こちらはあまりお薦めしません(理由は後述)。
$ aws configure set default.s3.use_accelerate_endpoint true
$ cat ~/.aws/config
[default]
s3 =
use_accelerate_endpoint = true
$ time aws s3 cp ./100mb.dummy s3://accelerated-bucket-in-eu-west-1/
upload: ./100mb.dummy to s3://accelerated-bucket-in-eu-west-1/100mb.dummy
real 0m3.596s
user 0m0.932s
sys 0m0.120s
利用時の注意点
非常に簡単に利用できることがわかったのですが、いくつか気付いたことがあったのでまとめておきたいと思います。
S3 Transfer Accelerationが有効でないバケットでオプション指定するとエラーになる
当たり前かもしれませんが、Transfer Accelerationが有効でないバケットで、s3-accelerate.amazonaws.com
をエンドポイントに指定しようとするとエラーになります。
$ aws s3 cp ./1mb.dummy s3://not-accelerated-bucket-in-eu-west-1/ \
--endpoint-url https://s3-accelerate.amazonaws.com
upload failed: ./1mb.dummy to s3://not-accelerated-bucket-in-eu-west-1/1mb.dummy An error occurred (InvalidRequest) when calling the PutObject operation: S3 Transfer Acceleration is not configured on this bucket
例えば、こんな形でS3バケット間でsyncをしたい時にも、両方のバケットでTransfer Accelerationを有効にしている必要があります。ですので、先に紹介したuse_accelerate_endpoint = true
をconfigファイルで指定してしまうと、下記のように有効でないバケットを含む操作ができなくなってしまいますので、configファイルへの設定は避けるべきかと思います。もちろんこれは一般論でユースケース次第ですが。
$ aws s3 sync s3://not-accelerated-bucket-in-eu-west-1 s3://accelerated-bucket-in-eu-west-1
fatal error: An error occurred (InvalidRequest) when calling the ListObjects operation: S3 Transfer Acceleration is not configured on this bucket
s3-accelerateエンドポイントは、アップロードでなくても利用できる
S3 Transfer Accelerationを有効にしたバケットであれば、S3関連のすべてのAPIを、専用エンドポイントで受けられるようになるようです。lsでもこのs3-accelerateエンドポイントを利用することができました。
$ aws s3 ls s3://not-accelerated-bucket-in-eu-west-1 \
--endpoint-url https://s3-accelerate.amazonaws.com
An error occurred (InvalidRequest) when calling the ListObjects operation: S3 Transfer Acceleration is not configured on this bucket
$ aws s3 ls s3://accelerated-bucket-in-eu-west-1 \
--endpoint-url https://s3-accelerate.amazonaws.com
2017-03-30 14:50:14 104857600 100mb.dummy
2017-03-30 14:42:52 10485760 10mb.dummy
2017-03-30 14:49:52 1048576 1mb.dummy
公式ドキュメント類には明確な記載が無いのですが、それならアップロードではなく、ダウンロードも速いのではないか?と思ったので、念の為、試してみたところ、、、
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m11.407s
user 0m2.403s
sys 0m0.736s
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m11.297s
user 0m2.376s
sys 0m0.769s
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m19.282s
user 0m2.459s
sys 0m0.798s
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./ \
--endpoint-url https://s3-accelerate.amazonaws.com
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m6.441s
user 0m2.639s
sys 0m0.795s
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./ \
--endpoint-url https://s3-accelerate.amazonaws.com
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m5.237s
user 0m2.627s
sys 0m0.773s
$ time aws s3 cp s3://accelerated-bucket-in-eu-west-1/100mb.dummy ./ \
--endpoint-url https://s3-accelerate.amazonaws.com
download: s3://accelerated-bucket-in-eu-west-1/100mb.dummy to ./100mb.dummy
real 0m4.641s
user 0m2.657s
sys 0m0.798s
明らかに速くなっていました。公式ドキュメントでは、アップロードのことばかり触れられているように読めたのですが、実測した結果を共有させていただきます。
まとめ
今回調べてみるまで、AWS CLIからこんなに簡単に利用できることを把握していませんでした。もう1年近く前にリリースされた機能だというのに、これまで触れていなかった、、、怠けていてはいけませんね。海外リージョンのS3と大きなファイルの受け渡しが必要であれば、ぜひ使ってみてください。
どこかの誰かのお役に立てば嬉しいです。