S3 Transfer AccelerationをAWS CLIを使って試してみた

2017.03.31

この記事は公開されてから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を有効にしてみました。

s3_transfer_acceleration_01

s3_transfer_acceleration_02

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と大きなファイルの受け渡しが必要であれば、ぜひ使ってみてください。

どこかの誰かのお役に立てば嬉しいです。