このトピックでは、オブジェクトのアップロードまたはダウンロードリクエストにパラメーターを追加して、アップロードまたはダウンロードの帯域幅の上限を設定する方法について説明します。これにより、他のアプリケーションに十分な帯域幅を確保できます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、リージョンとエンドポイントをご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報の設定方法の詳細については、Python 1.0 用 OSS SDK を使用したアクセス認証情報の設定をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、初期化をご参照ください。
シンプルアップロードとシンプルダウンロードの単一接続帯域幅スロットリングの設定
次のサンプルコードは、シンプルアップロードとシンプルダウンロードの単一接続帯域幅スロットリングを設定する方法の例を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import OSS_TRAFFIC_LIMIT
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意: このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# バケット名を examplebucket に設定します。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。ローカルパスが指定されていない場合、ファイルはサンプルプログラムのディレクトリからアップロードされます。
local_file_name = 'D:\\localpath\\examplefile.txt'
# オブジェクトのダウンロード先の完全なパスを指定します。指定されたローカルファイルが存在する場合、上書きされます。ファイルが存在しない場合は作成されます。
# ローカルパスが指定されていない場合、ダウンロードされたファイルはサンプルプログラムのディレクトリに保存されます。
down_file_name = 'D:\\localpath\\exampleobject.txt'
# ヘッダーでスロットリング速度を 100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100 * 1024 * 8)
headers = dict()
headers[OSS_TRAFFIC_LIMIT] = str(limit_speed)
# ファイルのアップロードをスロットリングします。
result = bucket.put_object_from_file(object_name, local_file_name, headers=headers)
print('http response status:', result.status)
# ローカルマシンへのファイルのダウンロードをスロットリングします。
result = bucket.get_object_to_file(object_name, down_file_name, headers=headers)
print('http response status:', result.status)マルチパートアップロードのスロットリング
次のコードは、マルチパートアップロードをスロットリングする方法を示しています。
# -*- coding: utf-8 -*-
import os
from oss2 import SizedFileAdapter, determine_part_size
from oss2.headers import OSS_TRAFFIC_LIMIT
from oss2.models import PartInfo
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意: このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# バケット名を examplebucket に設定します。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
key = 'exampledir/exampleobject.txt'
# ローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
filename = 'D:\\localpath\\examplefile.txt'
total_size = os.path.getsize(filename)
# determine_part_size メソッドを使用してパートサイズを決定します。
part_size = determine_part_size(total_size, preferred_size=100 * 1024)
# マルチパートアップロードを初期化します。
upload_id = bucket.init_multipart_upload(key).upload_id
parts = []
# ヘッダーでスロットリング速度を 100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100 * 1024 * 8)
headers = dict()
headers[OSS_TRAFFIC_LIMIT] = str(limit_speed)
# パートを 1 つずつアップロードします。
with open(filename, 'rb') as fileobj:
part_number = 1
offset = 0
while offset < total_size:
num_to_upload = min(part_size, total_size - offset)
# SizedFileAdapter を使用してファイルオブジェクトをラップし、現在のパートのデータのみがアップロードされるようにします。
result = bucket.upload_part(key, upload_id, part_number,
SizedFileAdapter(fileobj, num_to_upload), headers=headers)
parts.append(PartInfo(part_number, result.etag))
offset += num_to_upload
part_number += 1
# マルチパートアップロードを完了します。
# マルチパートアップロードを完了するときにヘッダーを設定するには、次のサンプルコードをご参照ください。
headers = dict()
# オブジェクトのアクセス制御リスト (ACL) を設定します。この例では、ACL は非公開権限を指定する OBJECT_ACL_PRIVATE に設定されています。
# headers["x-oss-object-acl"] = oss2.OBJECT_ACL_PRIVATE
bucket.complete_multipart_upload(key, upload_id, parts, headers=headers)
# bucket.complete_multipart_upload(key, upload_id, parts)
# マルチパートアップロードを検証します。
with open(filename, 'rb') as fileobj:
assert bucket.get_object(key).read() == fileobj.read()署名付き URL を使用したアップロードとダウンロードの帯域幅スロットリングの設定
次のコードは、署名付き URL を使用したファイルのアップロードとダウンロードをスロットリングする方法を示しています。
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import OSS_TRAFFIC_LIMIT
# 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = "https://oss-cn-hangzhou.aliyuncs.com"
# エンドポイントに対応するリージョン (例: cn-hangzhou) を指定します。注意: このパラメーターは V4 署名に必要です。
region = "cn-hangzhou"
# バケット名を examplebucket に設定します。
bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めることはできません。例: exampledir/exampleobject.txt。
object_name = 'exampledir/exampleobject.txt'
# アップロードするローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。ローカルパスが指定されていない場合、ファイルはサンプルプログラムのディレクトリからアップロードされます。
local_file_name = 'D:\\localpath\\examplefile.txt'
# オブジェクトのダウンロード先の完全なパスを指定します。指定されたローカルファイルが存在する場合、上書きされます。ファイルが存在しない場合は作成されます。
# ローカルパスが指定されていない場合、ダウンロードされたファイルはサンプルプログラムのディレクトリに保存されます。
down_file_name = 'D:\\localpath\\exampleobject.txt'
# params でスロットリング速度を 100 KB/s (819,200 bit/s) に設定します。
limit_speed = (100 * 1024 * 8)
params = dict()
params[OSS_TRAFFIC_LIMIT] = str(limit_speed)
# スロットリングされたアップロード用の署名付き URL を作成します。URL は 60 秒間有効です。
url = bucket.sign_url('PUT', object_name, 60, params=params)
print('put object url:', url)
# アップロードをスロットリングします。
result = bucket.put_object_with_url_from_file(url, local_file_name)
print('http response status:', result.status)
# スロットリングされたダウンロード用の署名付き URL を作成します。URL は 60 秒間有効です。
url = bucket.sign_url('GET', object_name, 60, params=params)
print('get object url:', url)
# ダウンロードをスロットリングします。
result = bucket.get_object_with_url_to_file(url, down_file_name)
print('http response status:', result.status)関連ドキュメント
単一接続の帯域幅スロットリングの完全なサンプルコードについては、GitHub の例をご参照ください。