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

:Python 用 OSS SDK のアクセス認証情報を構成する

最終更新日:Mar 14, 2025

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

使用上の注意

  • 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
    2. 次のコマンドを実行して、変更を適用します。

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

      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 = 'LTAI5tQQx1DWEYK7********'
access_key_secret = 's5LkMqKmmKbt3zjs7MNJTj********'

# 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

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

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

    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

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

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

    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.NTvKBumxJdJbN3U2********'
sts_access_key_secret = '6dg5r6N56FJ75JQMErowXVZYAnSGHXFHJwcN********'
# STS から取得した STS トークンを指定します。
security_token = '********'

# バケットが配置されているリージョンのエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを 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 のロールを使用する

ACK ワーカーノードで RAM ロールが構成されると、そのノード上のポッド内のアプリケーションは、ECS インスタンスにデプロイされたアプリケーションと同様に、メタデータサーバーを使用してアタッチされたロールの STS トークンを取得できます。ただし、アプリケーションコードを開示せずに顧客が送信したアプリケーションなど、信頼されていないアプリケーションが、ワーカーノードにアタッチされた RAM ロールの STS トークンを取得するためにメタデータサーバーにアクセスすることは望ましくない場合があります。クラウドリソースのセキュリティを確保し、信頼されていないアプリケーションが必要な STS トークンを安全に取得できるようにし、アプリケーションレベルの権限を最小限に抑えるには、RAM Roles for Service Account(RRSA)機能を使用できます。このメソッドの基盤となるロジックは、STS から取得した STS トークンを使用してアクセス認証情報を構成することです。ACK は、異なるアプリケーションポッドに対応する OpenID Connect(OIDC)トークンファイルを作成およびマウントし、関連する構成情報を環境変数に渡します。資格情報ツールは、環境変数から構成情報を取得し、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 コンテキストでの認証情報の使用

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

  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 環境変数を指定することにより、認証情報の URI を http://local_or_remote_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 を使用する場合、リージョン パラメーターを指定する必要があります。指定しないと、エラーが返されます。
    bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)
    
    # 後続の操作には、バケット オブジェクトを使用します。
    

自動的にローテーションする 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=<your client key private key password environment variable name>
    client_key_password_from_file_path=<your client key private key password file path>
    
    # クライアントキーの秘密鍵ファイルのパスを指定します。
    client_key_private_key_path=<your client key private key file 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 を使用する場合、リージョンパラメータを指定する必要があります。指定しないと、エラーが返されます。
bucket = oss2.Bucket(auth, endpoint, bucket_name, region=region)

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

よくある質問

資格情報プロバイダーを初期化する際に、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 エンドポイントのリストについては、「リージョンとエンドポイント」をご参照ください。

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

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

OSS は、エラーの特定の種類を判断するのに役立つ エラーコード を提供します。たとえば、一般的な認証エラーの場合は 02-AUTH を参照できます。