このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。
使用上の注意
一時アクセス資格情報と署名付きURLには、有効期間を指定する必要があります。 一時的なアクセス資格情報を使用して、オブジェクトのアップロードやダウンロードなどの操作を実行するために使用される署名付きURLを生成する場合、最小有効期間が優先されます。 たとえば、一時的なアクセス資格情報の有効期間を1,200秒に設定し、資格情報を使用して生成された署名付きURLの有効期間を3,600秒に設定できます。 この場合、STSの一時アクセス資格情報の有効期限が切れた後は、署名付きURLを使用してオブジェクトをアップロードすることはできません。
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba CloudサービスからOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。
STS を使用した一時的アクセス許可
STSを使用して、OSSへの一時アクセスを許可できます。 STSは、一時的なアクセストークンを提供するwebサービスです。 STSを使用して、管理されているサードパーティのアプリケーションまたはRAMユーザーに、カスタムの有効期間とカスタムのアクセス許可を持つ一時的なアクセス資格情報を付与できます。 STSの詳細については、「STSの概要」をご参照ください。
STSには次の利点があります。
一時的なアクセストークンを生成し、そのアクセストークンをサードパーティのアプリケーションに送信するだけで済みます。 サードパーティのアプリケーションにAccessKeyペアを提供する必要はありません。 トークンのアクセス権限と有効期間を指定できます。
トークンは、有効期間後に自動的に期限切れになります。 したがって、トークンのアクセス権限を手動で取り消す必要はありません。
STSが提供する一時的なアクセス資格情報を使用してOSSにアクセスするには、次の操作を実行します。
一時的なアクセス許可に署名付きURLを使用する
次のセクションでは、署名付きURLを使用してOSSへの一時アクセスを許可する方法の例を示します。
署名付きURLを生成し、一時的なアクセスのためのURLを訪問者に提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が指定されたデータにアクセスできる期間を制限できます。
次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+
) が含まれる場合があります。 この場合、URLのプラス記号 (+
) を % 2B
に置き換える必要があります。 そうでない場合、署名付きURLにアクセスできない可能性があります。
URLに署名情報を追加し、サードパーティのユーザーに許可されたアクセス権を提供できます。 詳細については、「URLへの署名の追加」をご参照ください。
versionIdヘッダーを含む署名付きURLを生成する
次のサンプルコードは、versionIdヘッダーを含む署名付きURLを生成する方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
object_name = 'exampledir/exampleobject.txt'
# ヘッダーを指定します。
headers = dict()
# オブジェクトのバージョンIDを指定します。
headers["versionId"] = "CAEQARiBgID8rumR2hYiIGUyOTAyZGY2MzU5MjQ5ZjlhYzQzZjNlYTAyZDE3 ****"
# オブジェクトのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60に設定します。 単位は秒です。
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print ('The signed URL:', url)
署名付き URL を使用したオブジェクトのアップロード
次のサンプルコードは、署名付きURLを使用してオブジェクトをアップロードする方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
object_name = 'exampledir/exampleobject.txt'
# ヘッダーを指定します。
headers = dict()
# コンテンツタイプを指定します。
# headers['Content-Type'] = 'text/txt'
# オブジェクトのストレージクラスを指定します。
# headers["x-oss-storage-class"] = "Standard"
# オブジェクトのアップロードに使用される署名付きURLを生成します。 署名付きURLの有効期間を60に設定します。 単位は秒です。
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。
url = bucket.sign_url('PUT', object_name, 60, slash_safe=True, headers=headers)
print('The signed URL:', url)
# 署名付きURLを使用してオブジェクトをアップロードします。 要求は例として使用されます。
# ローカルファイルのフルパスを指定します。 例: D :\\ exampledir\\examplefile.txt。
requests.put(url, data=open('D :\\ exampledir\\examplefile.txt ', 'rb').read(), headers=headers)
署名付き URL を使用してオブジェクトをダウンロード
次のサンプルコードは、署名付きURLを使用してオブジェクトをダウンロードする方法の例を示しています。
# -*-コーディング: utf-8 -*-
oss2のインポート
oss2.credentialsからEnvironmentVariableCredentialsProviderをインポート
インポートリクエスト
# 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。
# バケットの名前を指定します。 例: examplebucket.
bucket = oss2.Bucket(auth, 'https:// oss-cn-hangzhou.aliyuncs.com ', 'examplebucket')
# オブジェクトのフルパスを指定します。 例: exampledir/exampleobject.txt。 バケット名をフルパスに含めないでください。
object_name = 'exampledir/exampleobject.txt'
# ヘッダーを指定します。
headers = dict()
# Accept-Encodingを指定します。
ヘッダー ['Accept-Encoding'] = 'gzip'
# HTTPクエリパラメータを指定します。
params = dict()
# シングル接続帯域幅調整を設定します。 単位:bit/s。 この例では、最大帯域幅は100 KB/sに設定されています。
# params['x-oss-traffic-limit'] = str(100*1024*8)
# IPアドレスまたはCIDRブロックを指定します。
# params['x-oss-ac-source-ip'] = "127.0.0.1"
# サブネットマスクの1桁の数字を指定します。
# params['x-oss-ac-subnet-mask'] = "32"
# 仮想プライベートクラウド (VPC) のIDを指定します。
# params['x-oss-ac-vpc-id'] = "vpc-t4nlw426y44rd3iq4 ****"
# リクエストを転送できるかどうかを指定します。
# params['x-oss-ac-forward-allow'] = "true"
# オブジェクトのダウンロードに使用される署名付きURLを生成します。 URLの有効期間は60秒です。
# デフォルトでは、署名付きURLが生成されると、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別します。 したがって、署名付きURLを直接使用することはできません。
# slash_safeパラメーターをTrueに設定します。 このように、OSSはオブジェクトのフルパスのスラッシュ (/) をエスケープ文字として識別しません。 この場合、生成された署名付きURLを使用してオブジェクトをアップロードできます。
url = bucket.sign_url('GET', object_name, 60, slash_safe=True, headers=headers, params=params)
print('The signed URL:', url)
# 署名付きURLを使用してオブジェクトをダウンロードします。 要求は例として使用されます。
resp = requests.get(url、headers=headers)
# ローカルファイルのフルパスを指定します。 例: D :\\ exampledir\\examplefile.txt。
コードとしてopen("D :\\ exampledir\\examplefile.txt", "wb") を持つ:
code.write(resp.content)