すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:OSS SDK for Pythonを使用してアクセスを許可する

最終更新日:Jun 17, 2024

このトピックでは、Security Token Service (STS) または署名付きURLによって提供される一時的なアクセス資格情報を使用して、Object Storage Service (OSS) リソースへの一時的なアクセスを許可する方法について説明します。

使用上の注意

  • STSから取得した一時的なアクセス資格情報と署名付き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にアクセスするには、次の操作を実行します。

ステップ1: RAMユーザーの作成

  1. RAM コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、アイデンティティ > [ユーザー] を選択します。

  3. [ユーザー] ページで、ユーザーの作成 をクリックします。

  4. ログイン名 および [表示名] パラメーターを設定します。

  5. アクセスモード セクションで、[OpenAPIアクセス] を選択します。 そして、[OK] をクリックします。

  6. プロンプトに従って完全なセキュリティ検証。

  7. RAMユーザーのAccessKeyペアをコピーします。

ステップ2: RAMユーザーにAssumeRole権限を付与する

  1. [ユーザー] ページで、作成したRAMユーザーを見つけ、[操作] 列の 権限の追加 をクリックします。

  2. 権限の追加 パネルで、[システムポリシー] タブをクリックし、[AliyunSTSAssumeRoleAccess] ポリシーを選択します。

    説明

    RAMユーザーには、STSのAssumeRole操作を呼び出すためのAliyunSTSAssumeRoleAccessポリシーがアタッチされています。 AliyunSTSAssumeRoleAccessポリシーの権限は、一時的なアクセス資格情報を取得し、一時的なアクセス資格情報を使用してOSSリクエストを開始するために必要な権限とは無関係です。

    image.png

  3. [OK] をクリックします。

ステップ3: STSから一時的なアクセス資格情報を取得するために使用するロールを作成する

  1. 左側のナビゲーションウィンドウで、アイデンティティ > [ロール] を選択します。

  2. ロールの作成 をクリックします。 [ロールの作成] パネルで、[信頼できるエンティティの選択] を Alibaba Cloud アカウント に設定し、[次へ] をクリックします。

  3. ロールの作成 パネルで、RAM ロール名 をRamOssTestに設定し、信頼できる Alibaba Cloud アカウントを選択現在の Alibaba Cloud アカウント に設定します。

  4. [OK] をクリックします。 ロールの作成後、[閉じる] をクリックします。

  5. [ロール] ページで、検索ボックスに [RamOssTest] と入力し、検索結果で [RamOssTest] をクリックします。

  6. RamOssTestページの右側にある [コピー] をクリックして、ロールのAlibaba Cloudリソース名 (ARN) を保存します。arn

手順4: OSSにオブジェクトをアップロードおよびOSSからオブジェクトをダウンロードする権限をロールに付与する

  1. カスタムポリシーをRAMロールにアタッチすることで、RAMロールによるオブジェクトのアップロードとダウンロードを許可します。

    1. 左側のナビゲーションウィンドウで、権限管理 > ポリシー を選択します。

    2. ポリシー ページで ポリシーの作成 をクリックします。

    3. [ポリシーの作成] ページで、[JSON] をクリックします。 ポリシーエディターでスクリプトを変更して、examplebucketという名前のバケットにオブジェクトをアップロードしたり、バケットからオブジェクトをダウンロードしたりする権限をロールに付与します。 次のサンプルコードは、ロールに権限を付与する方法の例を示しています。

      警告

      以下は参考例です。 ユーザーに過度の権限を与えないように、要件に基づいてきめ細かいRAMポリシーを構成する必要があります。 きめ細かいRAMポリシーを設定する方法の詳細については、「例9: RAMまたはSTSを使用してユーザーにOSSリソースへのアクセスを許可する」をご参照ください。

      {
          "Version": "1",
          "Statement": [
           {
                 "Effect": "Allow",
                 "Action": [
                   "OSS:のputObject"、
                   "oss:GetObject"
                 ],
                 "Resource": [
                   "acs:oss:*:*:examplebucket" 、
                   "acs:oss:*:*:examplebucket/*"
                 ]
           }
          ]
      }
    4. [次へ] をクリックしてポリシー情報を編集します。

    5. [基本情報] セクションで、[名前][RamTestPolicy] に設定し、[OK] をクリックします。

  2. カスタムポリシーをRamOssTestロールにアタッチします。

    1. 左側のナビゲーションウィンドウで、[アイデンティティ] > [ロール] を選択します。

    2. [ロール] ページで、[RamOssTest] ロールを見つけます。

    3. RamOssTestロールの [操作] 列で、[権限付与] をクリックします。

    4. [権限付与] パネルで、[カスタムポリシー] タブをクリックし、[RamTestPolicy] ポリシーを選択します。

    5. [OK] をクリックします。

ステップ5: STSを使用して一時的なアクセス資格情報を生成する

一時的なアクセス資格情報には、セキュリティトークンと、AccessKey IDとAccessKeyシークレットで構成される一時的なAccessKeyペアが含まれます。 一時的なアクセス資格情報の最小有効期間は900秒です。 一時的なアクセス資格情報の最大有効期間は、現在のロールに指定されている最大セッション期間です。 詳細については、「RAMロールの最大セッション期間の指定」をご参照ください。

完全なサンプルコードについては、『GitHub』をご参照ください。

重要

一時的なアクセス資格情報を取得する前に、pip install aliyun-python-sdk-stsコマンドを実行して、Python用の公式STSクライアントをインストールします。

# -*-コーディング: utf-8 -*-

aliyunsdkcoreインポートクライアントから
aliyunsdkcore.requestからCommonRequestをインポート
jsonのインポート
oss2のインポート

# 手順1でRAMユーザー用に作成したAccessKeyペアを指定します。 
access_key_id = 'yourAccessKeyId'
access_key_secret = 'yourAccessKeySecret'
# 手順3で作成したロールのARNを指定します。 例: acs:ram::175708322470 ****:role/ramtest。 
role_arn = 'acs:ram::175708322470 ****:role/ramtest'

# RAMポリシーを作成します。 
# このポリシーでは、examplebucketという名前のバケット内のリソースに対してのみPutObjectおよびGetObject操作を実行できることを指定しています。 
policy_text = '{"Version": "1", "Statement": [{"Action": ["oss:PutObject", "oss:GetObject"]], "Effect": "Allow", "Resource": ["acs:oss:*:*:examplebucket/*"]}}''

clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')
request = CommonRequest(product="Sts" 、version='2015-04-01 '、action_name='AssumeRole')
request.set_method('POST')
request.set_protocol_type ('http')
request.add_query_param('RoleArn', role_arn)
# さまざまなトークンを区別するために、カスタムロールセッション名を指定します。 例: sessiontest。 
request.add_query_param('RoleSessionName', 'sessiontest')
# 一時アクセス資格情報の有効期間を指定します。 単位は秒です。 有効値:900 〜 3600。 
request.add_query_param('DurationSeconds '、'3000')
# RAMポリシーを設定しない場合、RAMユーザーにはロールのすべての権限が付与されます。 権限に特定の要件がある場合は、上記のpolicy_textの設定を参照してください。 
request.add_query_param('Policy', policy_text)
request.set_accept_format('JSON')

body = clt.do_action_with_exception (リクエスト)

# RAMユーザーのAccessKeyペアを使用して、STSからの一時的なアクセス資格情報を申請します。 
token = json.loads(oss2.to_unicode(body))
# STSによって返される一時的なアクセス資格情報のAccessKey ID、AccessKeyシークレット、セキュリティトークン、および有効期限を表示します。 
print('AccessKeyId: '+ token['Credentials']['AccessKeyId'])
print('AccessKeySecret: '+ token['Credentials']['AccessKeySecret'])
print('SecurityToken: '+ token['Credentials']['SecurityToken'])
print('Expiration: '+ token['Credentials']['Expiration']) 

手順6: 一時的なアクセス資格情報を使用して、OSSへのオブジェクトのアップロードとOSSからのオブジェクトのダウンロード

  • 一時的なアクセス資格情報を使用してオブジェクトをOSSにアップロードする

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    
    # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
    endpoint = 'https:// oss-cn-hangzhou.aliyuncs.com'
    # STSから取得した一時的なAccessKeyペアを指定します。 
    sts_access_key_id = 'yourAccessKeyId'
    sts_access_key_secret = 'yourAccessKeySecret'
    # バケットの名前を指定します。 
    bucket_name = 'examplebucket'
    # オブジェクトのフルパスとアップロードする文字列を指定します。 バケット名をフルパスに含めないでください。 
    object_name = 'exampleobject.txt'
    # STSから取得したセキュリティトークンを指定します。 
    security_token = 'yourSecurityToken'
    
    
    # 一時アクセス資格情報の認証情報に基づいて、StsAuthインスタンスを初期化します。 
    auth = oss2.StsAuth(sts_access_key_id、
                        sts_access_key_secret、
                        security_token)
    
    # StsAuthインスタンスを使用してバケットを初期化します。 
    bucket = oss2.Bucket(auth、endpoint、bucket_name)
    
    # オブジェクトをアップロードします。 
    result = bucket.put_object(object_name, "hello world")
    プリント (result.status) 
  • 一時的なアクセス資格情報を使用してOSSからオブジェクトをダウンロードする

    # -*-コーディング: utf-8 -*-
    oss2のインポート
    
    # バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。 
    endpoint = 'https:// oss-cn-hangzhou.aliyuncs.com'
    # STSから取得した一時的なAccessKeyペアを指定します。 
    sts_access_key_id = 'yourAccessKeyId'
    sts_access_key_secret = 'yourAccessKeySecret'
    # バケットの名前を指定します。 例: examplebucket. 
    bucket_name = 'examplebucket'
    # オブジェクトのフルパスとダウンロードする文字列を指定します。 バケット名をフルパスに含めないでください。 
    object_name = 'exampleobject.txt'
    # STSから取得したセキュリティトークンを指定します。 
    security_token = 'yourSecurityToken'
    
    # 一時アクセス資格情報の認証情報に基づいて、StsAuthインスタンスを初期化します。 
    auth = oss2.StsAuth(sts_access_key_id、
                        sts_access_key_secret、
                        security_token)
    
    # StsAuthインスタンスを使用してバケットを初期化します。 
    bucket = oss2.Bucket(auth、endpoint、bucket_name)
    
    # オブジェクトをダウンロードします。 
    read_obj = bucket.get_object(object_name)
    print(read_obj.read()) 

署名付きURLを使用して一時アクセスを許可する

使用上の注意

  • OSS SDKを使用して署名付きURLを生成する場合、OSS SDKはローカルコンピューターに保存されているキー情報に基づいて特定のアルゴリズムを使用して署名を計算し、URLに署名を追加してURLの有効性とセキュリティを確保します。 URLを計算し構築するために実行される操作は、クライアント上で完了する。 ネットワーク経由でサーバーにリクエストを送信する必要はありません。 この方法では、署名付きURLを生成するときに、呼び出し元に特定の権限を付与する必要はありません。 ただし、サードパーティのユーザーが署名付きURLによって承認されたリソースに対して関連する操作を実行できるようにするには、API操作を呼び出して署名付きURLを生成するプリンシパルに対応する権限があることを確認する必要があります。

    たとえば、プリンシパルが署名付きURLを使用してオブジェクトをアップロードする場合は、プリンシパルにoss:PutObject権限を付与する必要があります。 プリンシパルが署名付きURLを使用してオブジェクトをダウンロードまたはプレビューする場合は、プリンシパルにoss:GetObject権限を付与する必要があります。

  • 署名付きURLを生成し、一時的なアクセスのために訪問者にURLを提供できます。 署名付きURLを生成するときに、URLの有効期間を指定して、訪問者が特定のデータにアクセスできる期間を制限できます。

  • HTTPS経由でリソースにアクセスするために使用される署名付きURLを生成するには、エンドポイントのプロトコルをHTTPSに設定します。

  • 次のサンプルコードを使用して生成された署名付きURLには、プラス記号 (+) が含まれる場合があります。 この場合、URLのプラス記号 (+) を % 2Bに置き換えます。 そうでない場合、署名付き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 ('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()
# Content-Typeヘッダーを指定します。 
# 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 ('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-t4nlw426y44rd3iq4xxxx"
# リクエストを転送できるかどうかを指定します。 
# 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 ('Signed URL:', url)

# 署名付きURLを使用してオブジェクトをダウンロードします。 この例では、リクエストが使用されます。 
resp = requests.get(url、headers=headers)

# ローカルファイルのフルパスを指定します。 例: D :\\ exampledir\\examplefile.txt。 
コードとしてopen("D :\\ exampledir\\examplefile.txt", "wb") を持つ:
    code.write(resp.content)