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

Alibaba Cloud SDK:アクセス認証情報の管理

最終更新日:Nov 09, 2025

Alibaba Cloud SDK を使用する場合、AccessKey ペアやセキュリティトークンサービス (STS) トークンなどの認証情報は Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報の種類と、それらの設定方法について説明します。

前提条件

Credentials ツールのインストール

pip を使用してツールをインストールすることをお勧めします。

pip install alibabacloud_credentials

alibabacloud_credentials ライブラリの最新バージョンについては、「alibabacloud-credentials · PyPI」または「Github」をご参照ください。すべての機能をサポートするために、最新バージョンを使用することをお勧めします。

Credentials ツールでサポートされる認証情報の種類とその設定パラメーター

Credentials ツールでサポートされる認証情報の種類とその設定パラメーターは、alibabacloud_credentials.models モジュールの Config クラスで定義されます。認証情報の種類は type パラメーターで指定します。認証情報の種類が異なれば、必要な設定パラメーターも異なります。次の表に、type の有効な値と、各種類でサポートされる設定パラメーターを示します。表では、サポート は必須パラメーターを示し、- はオプションのパラメーターを示し、サポートされていません はパラメーターがサポートされていないことを示します。

説明

次の表に記載されていないパラメーターは使用しないことをお勧めします。

type

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

access_key_id: AccessKey ID。

サポート

サポート

サポート

サポートされていません

サポートされていません

サポートされていません

サポートされていません

access_key_secret: AccessKey Secret。

サポート

サポート

サポートされていません

サポートされていません

サポートされていません

サポートされていません

security_token: セキュリティトークンサービス (STS) トークン。

サポートされていません

-

サポートされていません

サポートされていません

サポートされていません

サポートされていません

role_arn: Resource Access Management (RAM) ロールの Alibaba Cloud リソースネーム (ARN)。

サポートされていません

サポートされていません

サポート

サポートされていません

サポート

サポートされていません

サポートされていません

role_session_name: セッションのカスタム名。デフォルト値は credentials-python-current_timestamp のフォーマットです。

×

サポートされていません

-

サポートされていません

-

サポートされていません

サポートされていません

role_name: RAM ロールの名前を指定します。

サポートされていません

サポートされていません

サポートされていません

-

サポートされていません

サポートされていません

サポートされていません

disable_imds_v1: セキュリティ強化モード (IMDSv2) を強制的に使用するかどうかを指定します。このパラメーターを true に設定すると、セキュリティ強化モード (IMDSv2) が使用されます。デフォルト値: false

サポートされていません

×

サポートされていません

-

サポートされていません

サポートされていません

サポートされていません

bearer_token: ベアラートークン。

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポートされていません

policy: カスタムポリシー。

サポートされていません

サポートされていません

-

サポートされていません

-

×

サポートされていません

role_session_expiration: セッションのタイムアウト期間。デフォルト値: 3600。単位: 秒。

サポートされていません

サポートされていません

-

サポートされていません

-

サポートされていません

サポートされていません

oidc_provider_arn: OpenID Connect (OIDC) ID プロバイダー (IdP) の ARN。

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポート

サポートされていません

サポートされていません

oidc_token_file_path: OIDC トークンの絶対パス。

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポート

サポートされていません

サポートされていません

external_id: ロールの外部 ID。これは、混乱した使節の問題を防ぐために使用されます。詳細については、「外部 ID を使用して混乱した使節の問題を防ぐ」をご参照ください。

サポートされていません

×

-

サポートされていません

サポートされていません

サポートされていません

サポートされていません

credentials_uri: 認証情報の URI。

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポートされていません

サポート

サポートされていません

sts_endpoint: STS のエンドポイント。VPC エンドポイントとインターネットエンドポイントがサポートされています。デフォルト値: sts.aliyuncs.com。有効な値の詳細については、「エンドポイント」をご参照ください。

サポートされていません

サポートされていません

-

サポートされていません

-

サポートされていません

サポートされていません

timeout: HTTP 読み取りリクエストのタイムアウト期間。デフォルト値: 5000。単位: ミリ秒。

サポートされていません

サポートされていません

-

-

-

-

サポートされていません

connect_timeout: HTTP 接続リクエストのタイムアウト期間。デフォルト値: 10000。単位: ミリ秒。

サポートされていません

サポートされていません

-

-

-

-

サポートされていません

Credentials ツールの使用

次のセクションでは、Credentials ツールの使用方法を示すコード例を示します。要件に応じてメソッドを選択できます。

重要
  • AccessKey ペアは、環境変数または設定ファイルに保存することをお勧めします。

  • Credentials ツールを使用する場合は、シングルトンパターンを使用することをお勧めします。この方法により、組み込みの認証情報キャッシュ機能が有効になります。これにより、複数の API 呼び出しによるスロットリングの問題を防ぎ、複数のインスタンスを作成することによるリソースの浪費を回避できます。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

方法 1: デフォルトの認証情報プロバイダーチェーン

説明

これは、OpenAPI Portal のサンプルコードで使用されるデフォルトのメソッドです。

設定パラメーターを渡さずに Credentials ツールを使用すると、ツールは デフォルトの認証情報プロバイダーチェーン から認証情報を取得します。このメソッドを使用する場合は、アプリケーションの実行環境で デフォルトの認証情報プロバイダーチェーン でサポートされている認証情報取得メソッドが少なくとも 1 つ設定されていることを確認する必要があります。

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models

# 設定パラメーターを指定しないでください。認証情報は、デフォルトの認証情報プロバイダーチェーンから取得されます。
credentialsClient = CredentialClient()

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 2: AccessKey ペア

Credentials ツールは、AccessKey をアクセス認証情報として使用します。

警告

Alibaba Cloud アカウントは、すべてのリソースに対する完全な権限を持っています。Alibaba Cloud アカウントの AccessKey ペアが漏洩すると、システムに重大なセキュリティ上の脅威をもたらします。Alibaba Cloud アカウントの AccessKey ペアを使用することはお勧めしません。

必要最小限の権限が付与された RAM ユーザーの AccessKey ペアを使用することをお勧めします。

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='access_key',
    # 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 3: STS トークン

Credentials ツールは、指定した静的な STS トークン をアクセス認証情報として使用します。

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='sts',
    # 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 必須。この例では、環境変数から一時的なセキュリティトークンを取得する方法を示します。
    security_token=os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN')
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 4: AccessKey ペアと RamRoleArn

Credentials ツールは、指定した AccessKey と RAM ロール ARN を使用して AssumeRole を呼び出し、STS トークンを取得し、そのトークンをアクセス認証情報として使用します。この方法で取得した認証情報は、自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='ram_role_arn',
    # 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # 必須。偽装する RAM ロールの ARN。例: acs:ram::123456789012****:role/adminrole。これは ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
    role_arn='<role_arn>',
    # オプション。ロールセッションの名前。これは ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
    role_session_name='<role_session_name>',
    # オプション。より小さい権限ポリシー。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    policy='<policy>',
    # オプション。ロールの外部 ID。これは、混乱した使節の問題を防ぐために使用されます。
    external_id='<external_id>',
    # オプション。セッションの有効期限。デフォルト値は 3600 秒です。
    role_session_expiration=3600
)

credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 5: ECS インスタンスの RAM ロール

アプリケーションが RAM ロールを割り当てられた ECS または ECI インスタンスで実行されている場合、Credentials ツールはインスタンスメタデータから RAM ロールの STS トークンを取得できます。この STS トークンは、アクセス認証情報として使用されます。この方法で取得された認証情報は、自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

Credentials ツールは、デフォルトでセキュリティ強化モード (IMDSv2) を使用して ECS インスタンスメタデータにアクセスします。セキュリティ強化モードで例外が発生した場合、disable_imds_v1 パラメーターまたは ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を使用して例外処理ロジックを制御できます:

  • 値が False (デフォルト) の場合、システムは一般モードに切り替えて認証情報の取得を続行しようとします。

  • 値が True の場合、認証情報はセキュリティ強化モードでのみ取得できます。セキュリティ強化モードでのアクセスに失敗すると、例外がスローされます。

サーバーが IMDSv2 をサポートするかどうかは、サーバーの構成によって異なります。

また、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定して、インスタンスメタデータからの認証情報アクセスを無効にすることもできます。

説明
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='ecs_ram_role',
    # オプション。ECS ロールの名前。このパラメーターを指定しない場合、名前は自動的に取得されます。リクエスト数を減らすために、このパラメーターを指定することをお勧めします。これは ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して設定できます。
    role_name='<role_name>',
    # オプション。デフォルト値は False です。True に設定すると、セキュリティ強化モードが強制的に使用されます。False に設定すると、システムはまずセキュリティ強化モードで認証情報を取得しようとします。試行が失敗した場合、システムは通常モード (IMDSv1) に切り替わります。
    disable_imds_v1=True
)

credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 6: OIDCRoleArn

OIDC 認証プロトコルを使用し、すでに OIDC IdP の RAM ロールを作成 している場合は、OIDC IdP ARN、OIDC トークン、および RAM ロール ARN を Credentials ツールに提供できます。システムは自動的に STS の AssumeRoleWithOIDC API を呼び出して RAM ロールの STS トークンを取得し、この STS トークンをアクセス認証情報として使用します。この方法で取得した認証情報は、自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。たとえば、アプリケーションが RRSA 機能が有効になっている ACK クラスターで実行されている場合、Credentials ツールは Pod の環境変数から OIDC 構成情報を読み取り、AssumeRoleWithOIDC API を呼び出してサービスロールの STS トークンを取得し、その STS トークンを使用して Alibaba Cloud サービスにアクセスできます。

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='oidc_role_arn',
    # 必須。RAM ロールの ARN。これは ALIBABA_CLOUD_ROLE_ARN 環境変数を使用して設定できます。
    role_arn='<role_arn>',
    # 必須。OIDC IdP の ARN。これは ALIBABA_CLOUD_OIDC_PROVIDER_ARN 環境変数を使用して設定できます。
    oidc_provider_arn='<oidc_provider_arn>',
    # 必須。OIDC トークンファイルのパス。これは ALIBABA_CLOUD_OIDC_TOKEN_FILE 環境変数を使用して設定できます。
    oidc_token_file_path='<oidc_token_file_path>',
    # オプション。ロールセッションの名前。これは ALIBABA_CLOUD_ROLE_SESSION_NAME 環境変数を使用して設定できます。
    role_session_name='<role_session_name>',
    # オプション。より小さい権限ポリシー。例: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    policy='<policy>',
    # オプション。セッションの有効期限。デフォルト値は 3600 秒です。
    role_session_expiration=3600
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 7: URI 認証情報

STS サービスをカプセル化し、その URI を公開して、外部サービスが URI から STS トークンを取得できるようにすることができます。これにより、AccessKey などの機密情報が公開されるリスクが軽減されます。Credentials ツールは、指定した URI にアクセスして STS トークンを取得できます。この STS トークンは、アクセス認証情報として使用されます。この方法で取得された認証情報は、自動更新をサポートしています。詳細については、「セッション認証情報の自動更新メカニズム」をご参照ください。

URI は次の条件を満たす必要があります:

  • GET リクエストをサポートします。

  • 200 状態コードを返します。

  • 応答本文は次の構造を持ちます:

    {
      "Code": "Success",
      "AccessKeySecret": "yourAccessKeySecret",
      "AccessKeyId": "STS.****************",
      "Expiration": "2021-09-26T03:46:38Z",
      "SecurityToken": "yourSecurityToken"
    }
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='credentials_uri',
    # 必須。認証情報を取得するための外部 URI。フォーマットは http://local_or_remote_uri/ です。これは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数を使用して設定できます。
    credentials_uri='<credentials_uri>',
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Alibaba Cloud プロダクトの V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

方法 8: ベアラートークン

現在、ベアラートークンをサポートしているのは Cloud Call Center (CCC) のみです。

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='bearer',
    # 必須。ベアラートークンを入力してください。
    bearer_token='<BearerToken>',
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# CCC V2.0 SDK を使用する場合は、alibabacloud_tea_openapi.models モジュールの Config クラスを使用して認証情報を渡します。
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... config オブジェクトを使用してプロダクトクライアントを初期化するコードは省略されています。

デフォルトの認証情報プロバイダーチェーン

デフォルトの認証情報プロバイダーチェーンは、事前定義された順序で認証情報を検索するフォールバック戦略です。ツールは、認証情報が見つかるまでチェーンを順に処理します。チェーン内のどのプロバイダーからも認証情報を取得できない場合、`CredentialException` がスローされます。検索順序は次のとおりです:

1. 環境変数の使用

システムプロパティに認証情報が見つからない場合、Credentials ツールは環境変数をチェックします。

  • ALIBABA_CLOUD_ACCESS_KEY_ID および ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数が存在し、空でない場合、AccessKey ペアがデフォルトの認証情報として使用されます。

  • ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET、および ALIBABA_CLOUD_SECURITY_TOKEN 環境変数がすべて設定されている場合、STS トークンがデフォルトの認証情報として使用されます。

2. OIDC IdP の RAM ロールを使用して認証情報を取得する

認証情報が見つからない場合、Credentials ツールは OIDC RAM ロールに関連する次の環境変数をチェックします:

  • ALIBABA_CLOUD_ROLE_ARN: RAM ロールの ARN。

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: OIDC IdP の ARN。

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: OIDC トークンファイルのパス。

上記の 3 つの環境変数が存在し、空でない場合、Credentials ツールはこれらの環境変数の値を使用して STS の AssumeRoleWithOIDC 操作を呼び出し、STS トークンをデフォルトの認証情報として取得します。

3. 設定ファイルの使用

説明

この機能には、alibabacloud_credentials バージョン 1.0rc3 以降が必要です。

それでも認証情報が見つからない場合、Credentials ツールはデフォルトパスから config.json ファイルをロードし、指定された認証情報をデフォルトの認証情報として使用しようとします。デフォルトのファイルパスは次のとおりです:

  • Linux/macOS: ~/.aliyun/config.json

  • Windows: C:\Users\USER_NAME\.aliyun\config.json

この方法で認証情報を設定するには、Cloud Assistant CLI を使用するか、対応するパスに config.json 設定ファイルを手動で作成します。次のコードブロックは、コンテンツフォーマットの例を示しています:

{
  "current": "<プロファイル名>",
  "profiles": [
    {
      "name": "<プロファイル名>",
      "mode": "AK",
      "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
    },
    {
      "name": "<プロファイル名1>",
      "mode": "StsToken",
      "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
      "sts_token": "<セキュリティトークン>"
    },
    {
      "name":"<プロファイル名2>",
      "mode":"RamRoleArn",
      "access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
      "access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
      "ram_role_arn":"<ロール ARN>",
      "ram_session_name":"<ロールセッション名>",
      "expired_seconds":3600
    },
    {
      "name":"<プロファイル名3>",
      "mode":"EcsRamRole",
      "ram_role_name":"<RAM ロール ARN>"
    },
    {
      "name":"<プロファイル名4>",
      "mode":"OIDC",
      "oidc_provider_arn":"<OIDC プロバイダー ARN>",
      "oidc_token_file":"<OIDC トークンファイル>",
      "ram_role_arn":"<ロール ARN>",
      "ram_session_name":"<ロールセッション名>",
      "expired_seconds":3600
    },
    {
      "name":"<プロファイル名5>",
      "mode":"ChainableRamRoleArn",
      "source_profile":"<プロファイル名>",
      "ram_role_arn":"<ロール ARN>",
      "ram_session_name":"<ロールセッション名>",
      "expired_seconds":3600
    }
  ]
}

パラメーター

説明

current

使用する認証情報の名前を指定します。これは profiles パラメーターの name の値に対応します。デフォルトでは、システムは ALIBABA_CLOUD_PROFILE 環境変数で指定された認証情報名を優先します。この環境変数が設定されていない場合、システムは current で指定された認証情報名を使用します。

profiles

認証情報のコレクション。mode パラメーターを使用して認証情報の種類を指定します:

  • AK: ユーザーの AccessKey ペアを認証情報として使用します。

  • StsToken: STS トークンを認証情報として使用します。

  • RamRoleArn: RAM ユーザーが RAM ロールを偽装して認証情報を取得します。

  • EcsRamRole: インスタンスメタデータから認証情報を取得します。

  • OIDC: OIDC IdP ARN、OIDC トークン、および RAM ロール ARN を使用して認証情報を取得します。

  • ChainableRamRoleArn: ロールチェーン方式を使用して、source_profile を使用して profiles 内の別の認証情報の名前を指定し、新しい認証情報を取得します。

4. ECS インスタンスの RAM ロールを使用して認証情報を取得する

認証情報が見つからない場合、Credentials ツールは、インスタンスに付与された RAM ロールの STS トークンをインスタンスメタデータから取得し、それをデフォルトの認証情報として使用しようとします。インスタンスメタデータにアクセスする際、プログラムはまず現在のインスタンスにアタッチされている RAM ロールの名前を取得し、そのロールに基づいて対応する STS トークンを取得します。ALIBABA_CLOUD_ECS_METADATA 環境変数を使用して RAM ロール名を指定することで、認証情報の取得に必要な時間を短縮し、効率を向上させることもできます。

デフォルトでは、Credentials ツールはセキュリティ強化モード (IMDSv2) でメタデータにアクセスします。セキュリティ強化モードで例外が発生した場合、ALIBABA_CLOUD_IMDSV1_DISABLED 環境変数を使用して例外処理ロジックを制御できます:

  • 値が false (デフォルト) の場合、システムは一般モードに切り替えて認証情報の取得を続行しようとします。

  • 値が true の場合、認証情報の取得にはセキュリティ強化モードのみが許可されます。セキュリティ強化モードでのアクセスに失敗すると、例外がスローされます。

さらに、ALIBABA_CLOUD_ECS_METADATA_DISABLED=true 環境変数を設定することで、インスタンスメタデータからの認証情報アクセスを無効にできます。

説明

5. URI に基づいて認証情報を取得する

認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。

セッション認証情報の自動更新メカニズム

セッション認証情報には、ram_role_arnecs_ram_roleoidc_role_arn、および credentials_uri が含まれます。この種類の認証情報には、Credentials ツールに組み込まれた自動更新メカニズムがあります。認証情報クライアントが初めて認証情報を取得すると、Credentials ツールは認証情報をキャッシュに保存します。後続のリクエストでは、同じ認証情報クライアントインスタンスが自動的にキャッシュから認証情報をフェッチします。キャッシュ内の認証情報が期限切れの場合、認証情報クライアントインスタンスは認証情報を再取得し、キャッシュを更新します。

説明

`ecs_ram_role` 認証情報の場合、Credentials ツールは認証情報が有効期限切れになる 15 分前にキャッシュをリフレッシュします。

次の例では、シングルトンパターンで認証情報クライアントを作成します。クライアントは、異なる時点で認証情報を取得して自動更新メカニズムを検証し、OpenAPI 操作を呼び出して取得した認証情報が有効であることを確認します。

import os
import sys
import time
import threading
from functools import wraps
from threading import Lock

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_ecs20140526.client import Client
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
from alibabacloud_tea_openapi.models import Config as EcsConfig


#
# スレッドセーフなシングルトンデコレーター
#

def singleton(cls):
    """スレッドセーフなシングルトンパターンを実装します"""
    instances = {}
    lock = Lock()

    @wraps(cls)
    def wrapper(*args, **kwargs):
        with lock:
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


#
# シングルトンサービスクラス
#

@singleton
class Credential:
    def __init__(self):
        self._client = self._init_client()

    @staticmethod
    def _init_client() -> CredentialClient:
        try:
            config = CredentialConfig(
                type="ram_role_arn",
                access_key_id=os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                access_key_secret=os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                role_arn=os.getenv("ALIBABA_CLOUD_ROLE_ARN"),
                role_session_name="RamRoleArnTest",
                role_session_expiration=3600,
            )
            return CredentialClient(config)
        except Exception as e:
            raise RuntimeError(f"Credential initialization failed: {e}") from e

    @property
    def client(self) -> CredentialClient:
        return self._client


@singleton
class EcsClient:
    def __init__(self, credential: CredentialClient):
        self._client = self._init_client(credential)

    @staticmethod
    def _init_client(credential: CredentialClient) -> Client:
        try:
            ecs_config = EcsConfig(credential=credential)
            ecs_config.endpoint = 'ecs.cn-hangzhou.aliyuncs.com'
            return Client(ecs_config)
        except Exception as e:
            raise RuntimeError(f"ECS client initialization failed: {e}") from e

    @property
    def client(self) -> Client:
        return self._client


#
# タスク関数
#

def execute_task():
    try:
        # 認証情報と ECS クライアントを取得します。
        credential = Credential().client.get_credential()
        ecs_client = EcsClient(Credential().client).client

        # 認証情報を出力します。
        print("Time:", time.strftime("%Y-%m-%d %H:%M:%S"))
        print("AK ID:", credential.access_key_id)
        print("AK Secret:", credential.access_key_secret)
        print("STS Token:", credential.security_token)

        # API 操作を呼び出してリージョンのリストをクエリします。
        request = DescribeRegionsRequest()
        response = ecs_client.describe_regions(request)
        print("Invoke result:", response.to_map()["statusCode"])

    except Exception as e:
        print(f"ECS client execution failed: {e}")
        raise


def schedule_task():
    def run_execute_task():
        try:
            execute_task()
        except Exception as e:
            print(f"Task execution failed: {e}")
        finally:
            nonlocal task_count
            task_count += 1
            if task_count == len(DELAYS):
                print("All tasks completed. Exiting program.")
                sys.exit(0)

    def schedule_execution(delay):
        task_timer = threading.Timer(delay, run_execute_task)
        task_timer.start()
        return task_timer

    # スケジュールされたタスクの遅延を定義します。
    DELAYS = [0, 600, 4200, 4300]
    task_count = 0

    timers = [schedule_execution(delay) for delay in DELAYS]

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("Program interrupted by user.")
        for timer in timers:
            timer.cancel()


if __name__ == "__main__":
    schedule_task()

image

次のセクションでは、ログ結果を分析します:

  • 最初の呼び出しでは、認証情報がキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。

  • 2 回目の呼び出しで使用される認証情報は、1 回目と同じです。これは、2 回目の呼び出しの認証情報がキャッシュから取得されたことを示します。

  • 3 回目の呼び出しでは、キャッシュ内の認証情報が期限切れになっています。これは、認証情報の有効期間 (`RoleSessionExpiration`) が 3,600 秒に設定されており、3 回目の呼び出しが最初の呼び出しから 4,200 秒後に発生するためです。したがって、SDK は自動更新メカニズムに基づいて新しい認証情報を再取得し、新しい認証情報をキャッシュに保存します。

  • 4 回目の呼び出しで使用される認証情報は、3 回目の呼び出しで取得された新しい認証情報と同じです。これは、キャッシュ内の認証情報が期限切れになった後に更新されたことを示します。

リファレンス