S3 Transfer AccelerationをAWS CLIを使って試してみた
西澤です。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と大きなファイルの受け渡しが必要であれば、ぜひ使ってみてください。
どこかの誰かのお役に立てば嬉しいです。