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

Object Storage Service:OSS SDK for Python 1.0 を使用してアクセス認証情報を構成する

最終更新日:Aug 16, 2025

Python 向け Object Storage Service (OSS) SDK を使用してリクエストを開始するには、ID とアクセス権限を確認するために使用されるアクセス認証情報を構成する必要があります。認証と承認の要件に基づいて、さまざまな種類のアクセス認証情報を選択できます。

使用上の注意

  • OSS リージョンとエンドポイントの一覧については、「OSS リージョンとエンドポイント」をご参照ください。

  • RAM ユーザーの AccessKey ペアを作成する方法については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。

  • アクセス認証情報を構成する前に、最新バージョンの Python 向け OSS SDK がインストールされていることを確認してください。詳細については、「インストール」をご参照ください。

  • alibabacloud-credentials のバージョンが 0.3.5 以降であることを確認してください。以前のバージョンではエラーが発生します。

認証情報プロバイダーの初期化

OSS は、認証情報プロバイダーを初期化する複数の方法をサポートしています。実際の認証と承認の要件に基づいて、適切な方法を選択できます。

初期化方法

シナリオ

必要な AccessKey ペアまたは STS トークン

基盤となる認証情報

認証情報の有効期間

認証情報のローテーションまたは更新方法

RAM ユーザーの AccessKey ペアを使用する

アプリケーションは、外部攻撃を受けやすいものではなく、安全で安定した環境にデプロイおよび実行され、頻繁な認証情報のローテーションなしでクラウドサービスに長期間アクセスする必要があります。

はい

AccessKey ペア

長期

手動ローテーション

STS によって提供される一時的なアクセス認証情報を使用する

アプリケーションは、信頼できない環境にデプロイおよび実行されます。この場合、認証情報の有効期間とアクセスできるリソースを管理する必要があります。

はい

Security Token Service (STS) トークン

一時的

手動更新

RAM ロールの ARN を使用する

アプリケーションは、アカウント間のアクセスなど、クラウドサービスへのアクセスを必要とします。

はい

STS トークン

一時的

自動更新

ECS インスタンスの RAM ロールを使用する

アプリケーションは、Elastic Compute Service (ECS) インスタンス、Elastic Container Instance、または Container Service for Kubernetes (ACK) ワーカーノードにデプロイおよび実行されます。

いいえ

STS トークン

一時的

自動更新

OIDC IdP のロールを使用する

信頼できないアプリケーションは、ACK ワーカーノードにデプロイおよび実行されます。

いいえ

STS トークン

一時的

自動更新

Function Compute のコンテキストで Credentials パラメーターを使用する

アプリケーションの関数は、Function Compute にデプロイおよび実行されます。

いいえ

STS トークン

一時的

更新不要

CredentialsURI を使用する

アプリケーションは、外部システムからのアクセス認証情報を必要とします。

いいえ

STS トークン

一時的

自動更新

自動的にローテーションする AccessKey ペアを使用する

アプリケーションは、AccessKey ペアの漏洩のリスクが高い環境にデプロイされており、クラウドサービスに長期間アクセスするためにアクセス認証情報を頻繁にローテーションする必要があります。

いいえ

AccessKey ペア

長期

自動ローテーション

カスタムアクセス認証情報を使用する

上記のいずれの方法も要件を満たしていない場合は、カスタムメソッドを使用してアクセス認証情報を取得できます。

カスタム

カスタム

カスタム

カスタム

一般的なシナリオの構成例

RAM ユーザーの AccessKey ペアを使用する

アプリケーションがアクセス認証情報を頻繁にローテーションせずに OSS に長期間アクセスする必要があり、外部攻撃を受けやすいものではなく、安全で安定した環境で実行されているとします。この場合、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) を使用して、認証情報プロバイダーを初期化できます。この方法では、AccessKey ペアを手動で管理する必要があることに注意してください。これにより、セキュリティリスクが発生し、メンテナンスの複雑さが増します。

警告
  • Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っており、その AccessKey ペアの漏洩は重大なセキュリティリスクをもたらします。したがって、必要な最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用して、認証情報プロバイダーを初期化することをお勧めします。

  • RAM ユーザーの AccessKey ペアを作成する方法については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。RAM ユーザーの AccessKey ペアは、RAM ユーザーの作成時にのみ表示されます。 AccessKey ペアをタイムリーに保存してください。 AccessKey ペアを忘れた場合は、ローテーション用に新しい AccessKey ペアを作成します。

環境変数

  1. RAM ユーザーの AccessKey ペアの環境変数を構成します。

    Linux
    1. CLI で次のコマンドを実行して、環境変数の構成を ~/.bashrc ファイルに追加します。

      echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc
      echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc
      1. 次のコマンドを実行して、変更を適用します。

        source ~/.bashrc
      2. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
    macOS
    1. ターミナルで次のコマンドを実行して、デフォルトのシェルタイプを表示します。

      echo $SHELL
    2. デフォルトのシェルタイプに基づいて環境変数を構成します。

      Zsh
      1. 次のコマンドを実行して、環境変数の構成を ~/.zshrc ファイルに追加します。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc
      2. 次のコマンドを実行して、変更を適用します。

        source ~/.zshrc
      3. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
      Bash
      1. 次のコマンドを実行して、環境変数の構成を ~/.bash_profile ファイルに追加します。

        echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile
        echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile
      2. 次のコマンドを実行して、変更を適用します。

        source ~/.bash_profile
      3. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

        echo $OSS_ACCESS_KEY_ID
        echo $OSS_ACCESS_KEY_SECRET
    Windows
    CMD
    1. CMD で次のコマンドを実行します。

      setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID"
      setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET"
    2. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

      echo %OSS_ACCESS_KEY_ID%
      echo %OSS_ACCESS_KEY_SECRET%
    PowerShell
    1. PowerShell で次のコマンドを実行します。

      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
    2. 次のコマンドを実行して、環境変数が有効になっているかどうかを確認します。

      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User)
      [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
  2. 設定が読み込まれていることを確認するために、IDE、コマンドラインツール、デスクトップ アプリケーション、バックグラウンドで実行されているサービスなど、コンパイル環境とランタイム環境を再起動または更新します。

  3. 環境変数を使用して認証情報を渡します。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # 環境変数から取得した RAM ユーザーの AccessKey ペアを使用して、アクセス認証情報を構成します。ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。

静的認証情報

次の例は、RAM ユーザーのアクセス認証情報をコードにハードコードする方法を示しています。

警告

本番環境にデプロイされたアプリケーションコードにアクセス認証情報を埋め込まないでください。この方法はテストのみを目的としています。

# -*- coding: utf-8 -*-
import oss2

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# バケットの名前を指定します。
bucket_name = 'yourBucketName'

# バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
region = 'cn-hangzhou'

# RAM ユーザーの AccessKey ID と AccessKey シークレットを入力します。
access_key_id = 'yourAccessKeyID'
access_key_secret = 'yourAccessKeySecret'

# RAM ユーザーの AccessKey ペアをアクセス認証情報として使用します。AuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
auth = oss2.AuthV4(access_key_id, access_key_secret)

# Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 後続の操作には、bucket オブジェクトを使用します。

STS によって提供される一時的なアクセス認証情報を使用する

アプリケーションが OSS に一時的にアクセスする必要がある場合は、STS によって提供される一時的なアクセス認証情報を使用できます。これは、AccessKey ペアと STS トークンで構成されます。この方法では、STS トークンを手動で管理する必要があることに注意してください。これにより、セキュリティリスクが発生し、メンテナンスの複雑さが増します。既存の STS トークンの有効期限が切れた後にアクセスを延長する場合は、STS トークンを手動で更新する必要があります。

重要
  • AssumeRole API オペレーションを呼び出すことによって、一時的なアクセス認証情報を取得できます。詳細については、「AssumeRole」をご参照ください。

  • SDK を使用して一時的なアクセス認証情報を取得することもできます。詳細については、「STS によって提供される一時的なアクセス認証情報を使用して OSS にアクセスする」をご参照ください。

  • トークンを生成するときに、STS トークンの有効期間を指定する必要があります。期限切れの STS トークンは使用できません。

  • STS エンドポイントの一覧については、「エンドポイント」をご参照ください。

環境変数

  1. 一時的なアクセス認証情報の環境変数を構成します。

    Mac OS X/Linux/Unix

    警告
    • RAM ユーザーの AccessKey ID と AccessKey シークレットの代わりに、STS によって提供される一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) が使用されることに注意してください。

    • STS によって提供される AccessKey ID は、STS で始まります。例: STS.****************.

    export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>

    Windows

    警告
    • RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) の代わりに、STS によって提供される一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) が使用されることに注意してください。

    • STS によって提供される AccessKey ID は、STS で始まります。例: STS.****************.

    set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID>
    set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET>
    set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>
  2. 環境変数を使用して認証情報を渡します。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2.credentials import EnvironmentVariableCredentialsProvider
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # AccessKey ID、AccessKey シークレット、STS トークンをアクセス認証情報として使用します。ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider())
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。

静的認証情報

次の例は、一時的なアクセス認証情報をコードにハードコードする方法を示しています。

警告

本番環境にデプロイされたアプリケーションコードにアクセス認証情報を埋め込まないでください。この方法はテストのみを目的としています。

# -*- coding: utf-8 -*-
import oss2

# Alibaba Cloud アカウントの AccessKey ID と AccessKey シークレットの代わりに、STS によって提供される一時的な AccessKey ID と AccessKey シークレットを指定します。
# STS によって提供される AccessKey ID は STS で始まることに注意してください。
sts_access_key_id = 'STS.****************'
sts_access_key_secret = 'yourAccessKeySecret'
# STS から取得した STS トークンを指定します。
security_token = 'yourSecurityToken'

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# バケットの名前を指定します。
bucket_name = 'yourBucketName'

# バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
region = 'cn-hangzhou'

# StsAuth インスタンスを初期化します。auth_version は v4 に設定されていることに注意してください。これは、署名アルゴリズム V4 が使用されていることを示しています。
auth = oss2.StsAuth(sts_access_key_id,
                    sts_access_key_secret,
                    security_token,
                    auth_version="v4")

# StsAuth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 後続の操作には、bucket オブジェクトを使用します。

その他のシナリオの構成例

RAM ロールの ARN を使用する

アカウント間のアクセスシナリオなどで、アプリケーションに OSS へのアクセスを承認する必要がある場合は、RAM ロールの Alibaba Cloud Resource Name (ARN) を使用して認証情報プロバイダーを初期化できます。この方法の基本的なロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Credentials ツールは、RAM ロールの ARN に基づいて STS トークンを取得し、セッションの有効期限が切れる前に AssumeRole オペレーションを呼び出すことによって STS トークンを更新します。policy を指定して、RAM ロールに付与される権限を制限できます。

重要
  • Alibaba Cloud アカウントは、そのリソースに対する完全な権限を持っており、その AccessKey ペアの漏洩は重大なセキュリティリスクをもたらします。したがって、必要な最小限の権限を持つ RAM ユーザーの AccessKey ペアを使用して、認証情報プロバイダーを初期化することをお勧めします。

  • RAM ユーザーの AccessKey ペアを作成する方法については、「RAM ユーザーの AccessKey ペアを作成する」をご参照ください。RAM ユーザーの AccessKey ペアは、RAM ユーザーの作成時にのみ表示されます。 AccessKey ペアをタイムリーに保存してください。 AccessKey ペアを忘れた場合は、ローテーション用に新しい AccessKey ペアを作成します。

  • CreateRole オペレーションを呼び出すことによって、RAM ロールを作成できます。RAM ロールの ARN はレスポンスに含まれています。詳細については、「CreateRole」をご参照ください。

  1. alibabacloud_credentials 依存関係を追加します。

    pip install alibabacloud_credentials
  2. AccessKey ペアと RAMRoleARN をアクセス認証情報として構成します。

    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    import os
    
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    config = Config(
        # 環境変数から RAM ユーザーの AccessKey ペア (AccessKey ID と AccessKey シークレット) を取得します。
        access_key_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        access_key_secret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        type='ram_role_arn',
        # アプリケーションにアタッチさせる RAM ロールの ARN を、ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで指定します。例: acs:ram::123456789012****:role/adminrole
        role_arn='<RoleArn>',
        # ロールのセッション名を、ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を指定することで指定します。
        role_session_name='<RoleSessionName>',
        # (オプション) 制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        policy='<Policy>',
        # (オプション) ロールのセッションの有効期間を指定します。
        role_session_expiration=3600
    )
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。
    

ECS インスタンスの RAM ロールを使用する

アプリケーションが ECS インスタンス、Elastic Container Instance、または ACK ワーカーノードで実行されている場合は、ECS インスタンスの RAM ロールを使用して認証情報プロバイダーを初期化することをお勧めします。この方法の基本的なロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。RAM ロールを ECS インスタンス、Elastic Container Instance、または ACK ワーカーノードにアタッチして、インスタンス上の STS トークンを自動的に更新できます。この方法では AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。CreateRole オペレーションを呼び出すことによって RAM ロールを作成できます。ARN はレスポンスに含まれています。詳細については、「CreateRole」をご参照ください。

  1. alibabacloud_credentials 依存関係を追加します。

    pip install alibabacloud_credentials
  2. RAM ロールを使用してアクセス認証情報を提供します。

    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    
    config = Config(
        type='ecs_ram_role',      # 認証情報タイプを指定します。値を ecs_ram_role に設定します。
        role_name='<RoleName>'    # ECS インスタンスにアタッチされている RAM ロールの名前を指定します。RAM ロールの名前はオプションです。このパラメーターを構成しない場合、システムは自動的に RAM ロールを検索します。リクエスト数を減らすために、このパラメーターを構成することをお勧めします。
    )
    
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。
    

OIDC IdP のロールを使用する

RAM ロールが ACK ワーカーノードで構成されると、そのノードのポッド内のアプリケーションは、ECS インスタンスにデプロイされたアプリケーションと同様に、メタデータサーバーを使用してアタッチされたロールの STS トークンを取得できます。ただし、アプリケーションコードを開示せずに顧客が送信したアプリケーションなど、信頼できないアプリケーションが、ワーカーノードにアタッチされた RAM ロールの STS トークンを取得するためにメタデータサーバーにアクセスすることを許可したくない場合があります。クラウドリソースのセキュリティを確保し、信頼できないアプリケーションが必要な STS トークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるには、RAM Roles for Service Account (RRSA) 機能を使用できます。この方法の基本的なロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。ACK は、さまざまなアプリケーションポッドに対応する OpenID Connect (OIDC) トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。Credentials ツールは、環境変数から構成情報を取得し、STS の AssumeRoleWithOIDC オペレーションを呼び出して、アタッチされたロールの STS トークンを取得します。この方法では AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。詳細については、「RRSA を使用してさまざまなポッドにさまざまなクラウドサービスへのアクセスを承認する」をご参照ください。

  1. alibabacloud_credentials 依存関係を追加します。

    pip install alibabacloud_credentials
  1. OIDC IdP のロール ARN をアクセス認証情報として使用します。

    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    import os
    
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    
    config = Config(
        # 認証情報タイプを oidc_role_arn に設定します。
        type='oidc_role_arn',
        # ALIBABA_CLOUD_ROLE_ARN 環境変数を指定することで、RAM ロールの ARN を指定します。
        role_arn=os.environ.get('<RoleArn>'),
        # ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を指定することで、OIDC IdP の ARN を指定します。
        oidc_provider_arn=os.environ.get('<OidcProviderArn>'),
        # ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を指定することで、OIDC トークンファイルのパスを指定します。
        oidc_token_file_path=os.environ.get('<OidcTokenFilePath>'),
        # ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を指定することで、ロールセッション名を指定します。
        role_session_name='<RoleSessionName>',
        # (オプション) 制限付き権限を指定します。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
        policy='<Policy>',
        # セッションの有効期間を指定します。
        role_session_expiration=3600
    )
    
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。
    

Function Compute のコンテキストで Credentials を使用する

アプリケーションの関数が Function Compute にデプロイおよび実行されている場合、Function Compute コンテキストの Credentials を使用して認証情報プロバイダーを初期化できます。この方法の基本的なロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Function Compute は、関数に構成されているロールに基づいてサービスロールをアタッチすることにより、STS トークンを取得します。次に、STS トークンはコンテキスト内の Credentials を使用してアプリケーションに渡されます。STS トークンは 36 時間有効です。有効期間を変更することはできません。関数は最大 24 時間実行できます。関数が実行されている間、STS トークンは有効なままであるため、関数の実行中に STS トークンを更新する必要はありません。この方法では AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。Function Compute に OSS へのアクセスを承認する方法の詳細については、「関数ロールを使用して Function Compute に他のクラウドサービスへのアクセス権限を付与する」をご参照ください。

  1. Function Compute コンテキストの Credentials を使用して認証情報プロバイダーを初期化します。

    # -*- coding: utf-8 -*-
    import oss2
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    
    def handler(event, context):
    
        class CredentialProviderWrapper(CredentialsProvider):
            def get_credentials(self):
                creds = context.credentials
                return Credentials(creds.access_key_id, creds.access_key_secret, creds.security_token)
    
        credentials_provider = CredentialProviderWrapper()
        # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
        auth = oss2.ProviderAuthV4(credentials_provider)
    
        # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
        endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
        # バケットの名前を指定します。
        bucket_name = 'yourBucketName'
    
        # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
        region = 'cn-hangzhou'
    
        # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
        bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
        # 後続の操作には、bucket オブジェクトを使用します。
    
        return 'success'
    

CredentialsURI を使用する

アプリケーションが外部システムから Alibaba Cloud 認証情報を取得して柔軟な認証情報管理とキーレスアクセスを実装する必要がある場合は、CredentialsURI を使用して認証情報プロバイダーを初期化できます。この方法の基本的なロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。Credentials ツールは、指定された URI を使用してクライアントを初期化することにより、STS トークンを取得します。この方法では AccessKey ペアまたは STS トークンは必要ないため、これらの認証情報の手動管理に関連するリスクがなくなります。

重要
  • CredentialsURI は、STS トークンを生成するサーバーのアドレスを指します。

  • 認証情報 URI レスポンスを提供するバックエンドサービスは、アプリケーションが常に有効な認証情報を取得できるように、STS トークンを自動的に更新する必要があります。

  1. Credentials ツールが STS トークンを正しく解析して使用できるようにするには、URI が次の要件に準拠している必要があります。

    • レスポンスステータスコード: 200

    • レスポンスボディ構造:

      {
          "Code": "Success",
          "AccessKeySecret": "AccessKeySecret",
          "AccessKeyId": "AccessKeyId",
          "Expiration": "2021-09-26T03:46:38Z",
          "SecurityToken": "SecurityToken"
      }
  2. alibabacloud_credentials 依存関係を追加します。

    pip install alibabacloud_credentials
  3. URI をアクセス認証情報として構成します。

    # -*- coding: utf-8 -*-
    import oss2
    from alibabacloud_credentials.client import Client
    from alibabacloud_credentials.models import Config
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    
    
    class CredentialProviderWrapper(CredentialsProvider):
        def __init__(self, client):
            self.client = client
    
        def get_credentials(self):
            credential = self.client.get_credential()
            access_key_id = credential.access_key_id
            access_key_secret = credential.access_key_secret
            security_token = credential.security_token
            return Credentials(access_key_id, access_key_secret, security_token)
    
    
    config = Config(
        type='credentials_uri',
        # ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を指定することで、http://local_or_remote_uri/ 形式の認証情報の URI を指定します。
        credentials_uri='<CredentialsUri>',
    )
    
    
    cred = Client(config)
    
    credentials_provider = CredentialProviderWrapper(cred)
    
    # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。
    

自動的にローテーションする AccessKey ペアを使用する

アプリケーションが OSS に長期間アクセスする必要がある場合は、認証情報の漏洩のリスクを軽減するために、AccessKey ペアを手動でローテーションする必要があります。この場合、クライアントキーを使用して認証情報プロバイダーを初期化できます。この方法の基本的なロジックは、AccessKey ペアを使用して OSS リソースにアクセスすることです。クライアントキーを使用すると、Key Management Service (KMS) は管理対象 RAM ユーザーの AccessKey ペアを自動的かつ定期的にローテーションし、RAM ユーザーの静的 AccessKey ペアを動的に変更できます。これにより、AccessKey ペアの漏洩のリスクが軽減されます。KMS は即時ローテーションもサポートしており、漏洩した AccessKey ペアを迅速に無効にすることができます。これにより、AccessKey ペアを手動で管理する必要がなくなり、セキュリティリスクとメンテナンスの複雑さが軽減されます。クライアントキーの取得方法の詳細については、「AAP を作成する」をご参照ください。

  1. 認証情報の依存関係を追加します。

    pip install aliyun-secret-manager-client
  2. secretsmanager.properties という名前の構成ファイルを作成します。

    # 認証情報タイプを client_key に設定します。
    credentials_type=client_key
    
    # クライアントキーの復号化パスワードを指定します。復号化パスワードは、環境変数またはファイルから読み取ることができます。
    client_key_password_from_env_variable=<クライアントキーの秘密キーのパスワードの環境変数名>
    client_key_password_from_file_path=<クライアントキーの秘密キーのパスワードのファイルパス>
    
    # クライアントキーの秘密キーファイルのパスを指定します。
    client_key_private_key_path=<クライアントキーの秘密キーのファイルパス>
    
    # KMS を使用するリージョンの ID を指定します。
    cache_client_region_id=[{"regionId":"<regionId>"}]
  3. 構成ファイルを使用して認証情報を渡します。

    # -*- coding: utf-8 -*-
    import json
    import oss2
    from oss2 import CredentialsProvider
    from oss2.credentials import Credentials
    from alibaba_cloud_secretsmanager_client.secret_manager_cache_client_builder import SecretManagerCacheClientBuilder
    
    
    class CredentialProviderWrapper(CredentialsProvider):
        def get_credentials(self):
            secret_cache_client = SecretManagerCacheClientBuilder.new_client()
            secret_info = secret_cache_client.get_secret_info("<secretName>")
            secret_value_json = json.loads(secret_info.secret_value)
            return Credentials(secret_value_json["AccessKeyId"], secret_value_json["AccessKeySecret"])
    
    
    credentials_provider = CredentialProviderWrapper()
    
    # ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
    auth = oss2.ProviderAuthV4(credentials_provider)
    
    # バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
    endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'
    
    # バケットの名前を指定します。
    bucket_name = 'yourBucketName'
    
    # バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
    region = 'cn-hangzhou'
    
    # Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、bucket オブジェクトを使用します。
    

カスタムアクセス認証情報を使用する

上記のいずれの方法も要件を満たしていない場合は、CredentialsProvider オペレーションを呼び出すことによって、カスタムメソッドを指定してアクセス認証情報を取得できます。基盤となる実装が STS トークンに基づいている場合は、認証情報の更新サポートを提供する必要があることに注意してください。

# -*- coding: utf-8 -*-
import oss2
from oss2 import CredentialsProvider
from oss2.credentials import Credentials


class CredentialProviderWrapper(CredentialsProvider):
    def get_credentials(self):
        # TODO
        # カスタムアクセス認証情報を取得するために使用されるメソッドを指定します。

        # 長期アクセス認証情報 (AccessKey ID と AccessKey シークレット) を返します。
        return Credentials('<access_key_id>', '<access_key_secrect>')

        # 一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) を返します。
        # 有効期間に基づいて一時的なアクセス認証情報を更新します。
        # return Credentials('<access_key_id>', '<access_key_secrect>', '<token>');


credentials_provider = CredentialProviderWrapper()

# ProviderAuthV4 は、署名アルゴリズム V4 が使用されていることを示していることに注意してください。
auth = oss2.ProviderAuthV4(credentials_provider)

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
endpoint = 'https://oss-cn-hangzhou.aliyuncs.com'

# バケットの名前を指定します。
bucket_name = 'yourBucketName'

# バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します。
region = 'cn-hangzhou'

# Auth インスタンスを使用してバケットを初期化します。署名アルゴリズム V4 を使用する場合、region パラメーターを指定する必要があります。そうしないと、エラーが返されます。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

# 後続の操作には、bucket オブジェクトを使用します。

よくある質問

認証情報プロバイダーを初期化するときに、STS によって提供される一時的なアクセス認証情報と RAM ユーザーの AccessKey ペアをどのように区別できますか?

STS から取得した一時的なアクセス認証情報 (AccessKey ID、AccessKey シークレット、STS トークン) を使用して認証情報プロバイダーを初期化する場合、STS によって返される AccessKey ID と RAM ユーザーの AccessKey ID を混同しないでください。STS から取得した AccessKey ID は STS で始まります。例:

image

RAM ユーザーの AccessKey ID を表示するにはどうすればよいですか? AccessKey ペアの AccessKey シークレットを表示できますか?

  1. RAM ユーザーの AccessKey ペアに関する情報を表示するに記載されている手順に従って、RAM ユーザーの AccessKey ペアを表示できます。

  2. RAM ユーザーの AccessKey シークレットは、AccessKey ペアの作成時にのみ表示されます。後で AccessKey ペアを表示することはできません。 AccessKey シークレットを忘れた場合は、AccessKey シークレットを取得できません。この場合、RAM コンソールでローテーション用に新しい AccessKey ペアを直接作成できます。詳細については、「AccessKey ペアを作成する」をご参照ください。

RAM ユーザーの AccessKey ペアを使用してファイルをアップロードするときに発生する AccessDenied エラーを修正するにはどうすればよいですか?

AccessDenied エラーは通常、間違った AccessKey ペアまたはアップロード権限の不足という 2 つの理由で発生します。次の手順を実行して、AccessDenied エラーのトラブルシューティングを行うことができます。

  1. RAM ユーザーの AccessKey ペアに関する情報を表示するに記載されている手順に従って、提供された AccessKey ペアが正しいかどうかを確認します。

  2. RAM ユーザーの AccessKey シークレットは、AccessKey ペアの作成時にのみ表示されます。後で AccessKey ペアを表示することはできません。 AccessKey シークレットを忘れた場合は、AccessKey シークレットを取得できません。この場合、RAM コンソールでローテーション用に新しい AccessKey ペアを直接作成できます。詳細については、「AccessKey ペアを作成する」をご参照ください。

  3. RAM コンソールで、RAM ユーザーに OSS にファイルをアップロードする権限があるかどうかを確認します。ない場合は、必要な権限を付与します。

パブリック OSS エンドポイントを使用して OSS にアクセスするときに接続エラーを修正するにはどうすればよいですか?

パブリックエンドポイント経由で OSS にアクセスするときに接続エラーが発生した場合は、エンドポイントが正しくないことが原因である可能性があります。エラーを修正するには、次のチェックを実行します。

  1. OSS コンソールでバケットのリージョンを確認します。

  2. 指定されたエンドポイントがリージョンに対して正しいかどうかを確認します。たとえば、バケットが中国 (杭州) リージョンにある場合は、oss-cn-hangzhou.aliyuncs.com エンドポイントを使用してパブリックネットワークアクセスを有効にします。OSS エンドポイントの一覧については、「OSS リージョンとエンドポイント」をご参照ください。

  3. お使いの環境がインターネットに接続できるかどうかを確認します。

エラーが報告された場合、エラーのタイプをどのように判断すればよいですか?

OSS は、エラーの特定のタイプを判断するのに役立つエラーコードを提供します。たとえば、一般的な認証エラーについては、02-AUTH を参照してください。