ネットワークの不安定性やその他の例外により、ラージオブジェクトのダウンロードが失敗することがあります。場合によっては、複数回試行してもダウンロードが失敗することがあります。この問題を解決するために、Object Storage Service (OSS) は再開可能なダウンロード機能を提供しています。再開可能なダウンロードでは、OSS はオブジェクトを複数の部分に分割し、各部分を個別にダウンロードします。すべての部分がダウンロードされると、OSS はそれらを完全なオブジェクトに結合します。
使用上の注意
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用しています。OSS と同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。 OSS のリージョンとエンドポイントの詳細については、「OSS リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得されます。アクセス認証情報を設定する方法の詳細については、「OSS SDK for Python 1.0 を使用してアクセス認証情報を設定する」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「初期化」をご参照ください。
再開可能なダウンロードを使用するには、
oss:GetObject権限が必要です。詳細については、「RAM ユーザーにカスタムポリシーをアタッチする」をご参照ください。
手順
再開可能なダウンロードを使用するには、次の手順を実行します。
元のオブジェクト名とランダムなサフィックスで構成される名前の一時ローカルファイルを作成します。
HTTP リクエストで Range ヘッダーを指定して、オブジェクトが範囲に基づいて読み取られるようにします。次に、読み取られたコンテンツは、一時ローカルファイルの対応する位置に書き込まれます。
ダウンロードが完了したら、一時ファイルの名前を宛先ファイルに変更します。宛先ファイルが既に存在する場合、ダウンロードされたデータは既存ファイルのデータを上書きします。それ以外の場合は、新しいファイルが作成されます。
1 つのチェックポイント情報がローカルディスク上の別のチェックポイント情報を上書きしたり、1 つの一時ファイル名が別のファイル名と競合したりすることがあります。したがって、複数のプログラムまたはスレッドを使用して oss2.resumable_download メソッドを同時に呼び出して、同じオブジェクトを同じ宛先ファイルにダウンロードしないでください。
例
次のサンプルコードは、再開可能なダウンロードを実行する方法の例を示しています。
# -*- coding: utf-8 -*-
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"
# エンドポイントにマッピングされるリージョンの ID を指定します。例: cn-hangzhou。署名アルゴリズム V4 を使用する場合は、このパラメーターが必要です。
region = "cn-hangzhou"
# バケットの名前を指定します。
bucket = oss2.Bucket(auth, endpoint, "yourBucketName", region=region)
# オブジェクトの完全なパスを指定します。完全なパスにバケット名を含めないでください。例: exampledir/exampleobject.txt。
# ローカルファイルの完全なパスを指定します。例: D:\\localpath\\examplefile.txt。
oss2.resumable_download(bucket, 'exampledir/exampleobject.txt', 'D:\\localpath\\examplefile.txt')
# store パラメーターを使用してディレクトリを指定しない場合、HOME ディレクトリに .py-oss-upload ディレクトリが作成され、チェックポイント情報が保存されます。
# OSS SDK for Python バージョン 2.1.0 以降を使用する場合は、次のオプションパラメーターを設定できます。
# import sys
# # ダウンロードするデータの長さを特定できない場合、total_bytes の値は None になります。
# def percentage(consumed_bytes, total_bytes):
# if total_bytes:
# rate = int(100 * (float(consumed_bytes) / float(total_bytes)))
# print('\r{0}% '.format(rate), end='')
# sys.stdout.flush()
# # store パラメーターを使用してディレクトリを指定すると、チェックポイント情報は指定されたディレクトリに保存されます。num_threads パラメーターを使用して同時ダウンロードスレッド数を指定する場合は、oss2.defaults.connection_pool_size の値が同時ダウンロードスレッド数以上であることを確認してください。デフォルトの同時スレッド数は 1 です。
# oss2.resumable_download(bucket, 'exampledir/exampleobject.txt', 'D:\\localpath\\examplefile.txt',
# store=oss2.ResumableDownloadStore(root='/tmp'),
# # オブジェクトの長さが multipart_threshold パラメーターの値以上の場合に再開可能なダウンロードが使用されるように指定します。multipart_threshold パラメーターはオプションで、デフォルト値は 10 MB です。
# multiget_threshold=100*1024,
# # 各パートのサイズを指定します。単位: バイト。有効なパートサイズは 100 KB から 5 GB です。デフォルトのパートサイズは 100 KB です。
# part_size=100*1024,
# # 再開可能なダウンロードタスクの進捗状況を示すために使用するコールバック関数を設定します。
# progress_callback=percentage,
# # num_threads を使用して同時ダウンロードスレッド数を設定する場合は、oss2.defaults.connection_pool_size を同時ダウンロードスレッド数以上の値に設定します。デフォルトの同時スレッド数は 1 です。
# num_threads=4)