🏎️

【AWS S3】AWS CLIで爆速データ転送大作戦

2024/11/07に公開

はじめに

とある事情で1ファイル数百GB以上のオブジェクトを別のS3にコピーするタスクがありました。
そこでなんとか爆速転送をしようと色々右往左往したので知見を備忘録として残します。
S3で爆速転送をしたい方は是非参考にしてもらえると嬉しいです。

参考資料

デフォルト設定

~/.aws/configの設定

[profile default]
region = ap-northeast-1
output = json
s3 =
  max_concurrent_requests = 10
  max_queue_size = 1000
  multipart_threshold = 8MB
  multipart_chunksize = 8MB

この設定で学んだこと

max_concurrent_requestsはもっと増やしても良い。
AWS側でリソースは持っているので料金を気にしないなら、並列リクエストは増やしたほうが得

multipart_thresholdは基本TRUEになりそう。
(この設定はマルチパートアップロードのオン・オフなので、
極端にファイルサイズを大きくしなければ大丈夫)

速度

44MiB/s
転送に1時間以上かかる

少しパラメータ調整

~/.aws/configの設定

[profile default]
region = ap-northeast-1
output = json
s3 =
  max_concurrent_requests = 50
  max_queue_size = 30000
  multipart_threshold = 500MB
  multipart_chunksize = 300MB

速度

244MiB/s
1時間未満で転送が終わる

この設定で学んだこと

max_concurrent_requestsはまだ増やせる。50だとここがボトルネック。

max_queue_sizeは大きすぎる、これだとマルチパートで転送するデータがキューに溜まるのに時間がかかる。

multipart_chunksizeはSnowflakeのマイクロパーティションが50MB~500MBぐらいの小分けデータで管理していることを参考に調整。

爆速チューニング

~/.aws/configの設定

[profile default]
region = ap-northeast-1
output = json
s3 =
  max_concurrent_requests = 500
  max_queue_size = 3000
  multipart_threshold = 500MB
  multipart_chunksize = 500MB

速度

11000MiB/s (11GiB/s)
転送が始まったと思ったら終わる

この設定で学んだこと

max_concurrent_requestsを増やした影響か転送が開始されるまでの待ち時間が2,3分ほどかかった。
(転送開始後は数秒で終わる)

まとめ

max_queue_sizeにリクエストが溜まったらアップロードみたいな形になると思うので、
通信環境を見ながらmax_concurrent_requestsmultipart_chunksizeを調整するのが良さそう。

また、爆速転送用のprofileを用意したが、ロール認証をするとprofileがdefaultになって悩む方は export AWS_PROFILE=<爆速転送用_profile>をbashで実行すると幸せになるかも

さいごに

みんなもS3の爆速転送をして待ち時間をなくそう!!
ただし、リージョンを跨ぐ転送の場合は使いすぎは厳禁!お金が吹き飛びます

以上hamaでした〜

Discussion