AWS CLIがS3とのトラフィックを帯域制御できるようになりました

AWS CLI
201件のシェア(すこし話題の記事)

AWS CLI単体でS3とのトラフィックを帯域制御出来るようになったため、早速使ってみました。

3行まとめ

  • クライアント OS に依存せず AWS CLI 単体で帯域制御可能
  • インバウンド・アウトバウンドで同じ値を適用
  • 設定コマンド $ aws configure set default.s3.max_bandwidth 50MB/s

やってみた

環境

  • EC2(m4.xlarge)のAmazon Linux
  • AWS CLI:1.14.8

S3転送に利用するオブジェクトの作成

1 GB のオブジェクトを作成します。

$ fallocate -l 1G test.dat

AWS CLIの初期設定値

帯域制御用に追加された s3.max_bandwidth を除き、AWS CLI の設定値はデフォルトのままとします。

特に、s3.multipart_threshold は 8MB のため、今回試験に利用する 1GB のオブジェクトはマルチパート転送されます。

デフォルトでの転送速度を確認

S3 へのアップロード・S3 からのダウンロードの両方で初期状態で転送速度を確認します。

アップロード速度を確認

$ time aws s3 cp test.dat s3://BUCKET/default
upload: ./test.dat to s3://BUCKET/default

real	0m12.324s
user	0m9.904s
sys	0m2.940s

転送速度は 81.3 MiB/s 程度でした。

ダウンロード速度を確認

$ time aws s3 cp s3://BUCKET/default .
download: s3://BUCKET/default to ./default

real	0m10.793s
user	0m9.164s
sys	0m8.488s

転送速度は 92.7 MiB/s 程度でした。

帯域制御した転送速度を確認

S3 へのアップロード・S3 からのダウンロードの両方で初期状態で転送速度を確認します。

帯域制御を設定する

$ aws configure set default.s3.max_bandwidth BANDWIDTH のシンタックスで指定します。

数字だけの場合は byte/sec で解釈され、10MB/s や 10KB/s のようにレートサフィックスをつけて指定することも出来ます。

今回は 10MB/s とします。

$ aws configure set default.s3.max_bandwidth 10MB/s
$ cat $HOME/.aws/config
[default]
region = eu-central-1
s3 =
    max_bandwidth = 10MB/s

アップロード・ダウンロード速度を確認

先程と同様にアップロード・ダウンロードを行うと、共に 1分43秒程度かかり、転送速度は 9.67MB/s 程度で制限値の 10MB/s に近い値が出ていました。

注意

s3.max_concurrent_requests パラメーターはマルチパートアップロード含めて、S3 への API リクエストの並列度をコントロールします。帯域制限は、リクエスト単位ではなく、全リクエストが消費するトラフィックの合算に対して課されます。

この帯域制御はクライアント・AWS間のトラフィックを処理するためのものです。 S3 のオブジェクト削除や S3 バケット間のデータコピーのように、AWS サーバーサイドで完結する操作への影響はありません。

まとめ

これまで S3 との通信で帯域制御する際は、tc の呪文のようなコマンドに挫折しそうになったり、 trickle は AWS CLI と相性が悪くてがっかりしたり、そもそも OS によってアプローチが困ったりと、案件毎に頭を悩ますことが多かったと思います。

AWS CLI に帯域制御機能が追加されましたので、まずはこのシンプルな帯域制御で要件を満たせないか、評価されてみてはいかがでしょうか。

なお GitHub をのぞくと、2015年1月にフィーチャーリクエストが登録されたあと、67コメント&約3年かかってようやく実装されていました。

参考