AWS CLIがS3とのトラフィックを帯域制御できるようになりました
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年かかってようやく実装されていました。