kakakakakku blog

Weekly Tech Blog: Keep on Learning!

boto3 Config で Amazon S3 Transfer Acceleration エンドポイントを使えるようにする

Amazon S3 で Transfer Acceleration を有効化すると,エッジロケーションを活用してオブジェクトを高速にアップロード・ダウンロードできるようになる.そして bucketname.s3-accelerate.amazonaws.com というエンドポイントが追加される👀

aws.amazon.com

docs.aws.amazon.com

boto3 x Amazon S3 Transfer Acceleration

Python (boto3) で Amazon S3 Transfer Acceleration エンドポイントを使う場合は Boto3 Config の use_accelerate_endpoint で設定できる👌今回は検証も兼ねて Config 設定の動作確認をしてみた.

boto3.amazonaws.com

準備

自宅(東京)から動作確認をするため,今回は us-east-1(バージニア)に Amazon S3 バケットを作った.そして aws s3api put-bucket-accelerate-configuration コマンドで Amazon S3 Transfer Acceleration を有効化した.あと mkfile 50m 50mb コマンドで 50MB のダミーファイルを作っておく📁

$ aws s3 mb s3://transfer-acceleration-sandbox --region us-east-1
$ aws s3api put-bucket-accelerate-configuration --bucket transfer-acceleration-sandbox --accelerate-configuration Status=Enabled --region us-east-1

1. Config 設定なし

今回はエンドポイントを確認するため botocore のデバッグログを出力できるようにしておく👌

import time
import uuid

import boto3
import botocore

botocore.session.Session().set_debug_logger()

session = boto3.Session(profile_name='xxxxx', region_name='us-east-1')

s3_client = session.client(
    's3',
)

start = time.time()
s3_client.upload_file('50mb', 'transfer-acceleration-sandbox', f'50mb-{uuid.uuid4().hex}')
end = time.time()

print(f'{end - start} seconds')

実行すると s3.amazonaws.com エンドポイントにリクエストを送信していた🛜

Sending http request:
(中略)
url=https://transfer-acceleration-sandbox.s3.amazonaws.com/50mb-a3637f080158476fa0333dc838d700d7?uploadId=xxx
(中略)

計3回実行したアップロード時間は以下だった💡

  • 35.75226593017578 seconds
  • 36.11813402175903 seconds
  • 42.113038063049316 seconds

2. Config 設定あり

今度は Config で use_accelerate_endpoint を設定する❗️

import time
import uuid

import boto3
import botocore

botocore.session.Session().set_debug_logger()

session = boto3.Session(profile_name='xxxxx', region_name='us-east-1')

s3_client = session.client(
    's3',
    config=boto3.session.Config(
        s3={
            'use_accelerate_endpoint': True,
        },
    ),
)

start = time.time()
s3_client.upload_file('50mb', 'transfer-acceleration-sandbox', f'50mb-{uuid.uuid4().hex}')
end = time.time()

print(f'{end - start} seconds')

実行すると今度は s3-accelerate.amazonaws.com エンドポイントにリクエストを送信していた🛜

Sending http request:
(中略)
url=https://transfer-acceleration-sandbox.s3-accelerate.amazonaws.com/50mb-8b5a312964c94d5a8e803655e1aa6792?uploadId=xxx
(中略)

計3回実行したアップロード時間は以下だった💡速くなってる〜 \( 'ω')/

  • 14.759350061416626 seconds
  • 12.844246625900269 seconds
  • 13.640271663665771 seconds