Amazon S3 Transfer Accelerationを利用したアップロードの速度をテストしてみる

AWS Labs で公開されている、Amazon S3 Transfer Acceleration を利用した場合のアップロード速度を測定するシェルスクリプトを試してみました。
2022.07.19

Amazon S3 Transfer Acceleration のアップロード速度をテストする方法を考えているときに、AWS Labs において、指定したファイルを Transfer Acceleration でアップロードした場合の速度を測定するシェルスクリプト test-upload.sh が提供されていることを知ったので試してみました。

次の AWS のサイトでも紹介されています。


アップロード速度のテストを試してみる

Amazon S3 Transfer Acceleration を利用したアップロードと Transfer Acceleration を利用しない Direct Upload の速度を比較できるサイトとして、Amazon S3 Transfer Acceleration Speed Comparison があります。リージョン毎に確認できます。

今回は、別の方法として、AWS Labs で公開されている S3 サポートツールの 1 つである test-upload.sh を試してみます。

S3 バケットに対して指定したファイルを Direct Upload または Transfer Acceleration を利用したアップロードを行い、速度をテストするシェルスクリプトです。

test-upload.sh の大まかな流れは次の通りです。

  • スクリプト実行後にパラメータを指定
    • アップロードするファイルのパス
    • アップロード後の S3 オブジェクト名
    • アップロードする S3 バケット名
    • S3 バケットのリージョン
    • S3 Transfer Acceleration の利用有無
  • ファイルのアップロードを行い、アップロード速度を表示
  • アップロードしたファイルを削除するかどうか選択

アップロード速度のテストを試してみます。


S3 の準備

事前準備として、S3 バケットの設定をしていきます。

S3 バケットは test-s3-transfer-acceleration-20220716 を一時的に作成して利用しました。主な設定は次の通りです。

  • AWS リージョン:us-west-2
  • バージョニング:有効
  • デフォルトの暗号化:有効(SSE-S3)

Transfer Acceleration を有効化します。

$ aws s3api put-bucket-accelerate-configuration --bucket test-s3-transfer-acceleration-20220716 --accelerate-configuration Status=Enabled
$ aws s3api get-bucket-accelerate-configuration --bucket test-s3-transfer-acceleration-20220716
{
    "Status": "Enabled"
}

また、ブロックパブリックアクセス設定やバケットポリシーでアップロードを拒否している場合はテスト用にアップロードを許可する設定に変更する必要があります。


クライアントの準備

次のクライアント側(MAC 端末)の設定をしていきます。

AWS CLI は次のバージョンを利用しました。

$ aws --version
aws-cli/2.7.16 Python/3.9.11 Darwin/20.6.0 exe/x86_64 prompt/off

test-upload.sh を利用するために GNU Core Utilities をインストールします。要件は README.md に記されており、Linux の要件と MAC OS の要件が記載されています。

$ brew install coreutils

test-upload.sh をダウンロードします。

$ wget https://raw.githubusercontent.com/awslabs/aws-support-tools/master/S3/S3_Transfer_Acceleration/Bash-script/test-upload.sh

権限を変更します。

$ chmod 755 test-upload.sh

アップロード用のダミーファイルを作成します。100MB のサイズとしました。

$ mkfile -v 100m test.dat
test.dat 104857600 bytes

ここまでの作業で、作業フォルダのファイルは次の通りになっています。

$ tree
.
├── test-upload.sh
└── test.dat

0 directories, 2 files


アップロード速度のテスト

まず、Transfer Acceleration を利用せずにテストしてみます。

$ ./test-upload.sh
Enter the local path of the file you want to upload: test.dat
Enter the destination file name: test.dat
Enter the name of the bucket: test-s3-transfer-acceleration-20220716
Enter the region of your Bucket (e.g. us-west-2): us-west-2
Do you want to upload via Transfer Acceleration: (y/n) n
upload: ./test.dat to s3://test-s3-transfer-acceleration-20220716/test.dat
File uploaded without acceleration at 13 Mbps speed.
Do you want to delete the uploaded file: (y/n) y
delete: s3://test-s3-transfer-acceleration-20220716/test.dat

アップロード速度は 13Mbps でした。

ちなみに、スクリプト内のテスト時に実行しているコマンドは次のコマンドでした。

aws s3 cp test.dat s3://test-s3-transfer-acceleration-20220716/test.dat --region us-west-2

また、最後にアップロードしたファイルを削除していますが、もし S3 バケットでバージョニングが有効な場合は、削除マーカーは付与されますが、以前のバージョンとして残るので注意が必要です。不要な場合は完全に削除します。

次に、Transfer Acceleration を利用してテストしてみます。

$ ./test-upload.sh
Enter the local path of the file you want to upload: test.dat
Enter the destination file name: test.dat
Enter the name of the bucket: test-s3-transfer-acceleration-20220716
Enter the region of your Bucket (e.g. us-west-2): us-west-2
Do you want to upload via Transfer Acceleration: (y/n) y
upload: ./test.dat to s3://test-s3-transfer-acceleration-20220716/test.dat
File uploaded with acceleration at 17 Mbps speed.
Do you want to delete the uploaded file: (y/n) y
delete: s3://test-s3-transfer-acceleration-20220716/test.dat

アップロード速度は 17Mbps であり、速度が向上していることが分かりました。

テスト時に実行しているコマンドは次のコマンドでした。

aws s3 cp test.dat s3://test-s3-transfer-acceleration-20220716/test.dat --region us-west-2 --endpoint-url http://s3-accelerate.amazonaws.com

以上でアップロード速度のテストは終わりです。ネットワークの状況によりアップロード速度に違いがでてくるとは思いますが、おおよその速度を確認することはできそうです。

最後に、S3 バケットのブロックパブリックアクセス設定やバケットポリシーを元に戻すことを忘れないようにしましょう。


おわりに

Amazon S3 Transfer Acceleration のアップロード速度をテストできるスクリプトが AWS Lab で公開されていたため試してみました。他の方法としては、time コマンドを利用してアップロード時間を測定する方法もあり、次のブログがその参考となります。