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

Amazon S3

西澤です。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

例えば、こんな形で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

まとめ

今回調べてみるまで、AWS CLIからこんなに簡単に利用できることを把握していませんでした。もう1年近く前にリリースされた機能だというのに、これまで触れていなかった、、、怠けていてはいけませんね。海外リージョンのS3と大きなファイルの受け渡しが必要であれば、ぜひ使ってみてください。

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