Alibaba Cloud SDK を使用する場合、AccessKey ペアやセキュリティトークンサービス (STS) トークンなどの認証情報は Credentials ツールによって管理されます。このトピックでは、Credentials ツールがサポートする認証情報の種類と、それらの設定方法について説明します。
前提条件
Python 3.7 以降。詳細については、「Alibaba Cloud SDK サポートポリシー」をご参照ください。
Alibaba Cloud SDK for Python V2.0。詳細については、「SDK V2.0 および V1.0」をご参照ください。
Credentials ツールのインストール
pip を使用してツールをインストールすることをお勧めします。
pip install alibabacloud_credentialsalibabacloud_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: セッションのカスタム名。デフォルト値は | - | - | |||||
role_name: RAM ロールの名前を指定します。 | - | ||||||
disable_imds_v1: セキュリティ強化モード (IMDSv2) を強制的に使用するかどうかを指定します。このパラメーターを true に設定すると、セキュリティ強化モード (IMDSv2) が使用されます。デフォルト値: | - | ||||||
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 エンドポイントとインターネットエンドポイントがサポートされています。デフォルト値: | - | - | |||||
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 環境変数を設定して、インスタンスメタデータからの認証情報アクセスを無効にすることもできます。
詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを割り当てる方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに割り当てる」をご参照ください。
セキュリティ強化モードを使用して一時的な ID 認証情報を取得する場合、
alibabacloud_credentialsはバージョン 0.3.6 以降である必要があります。
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.jsonWindows:
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 | 認証情報のコレクション。
|
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 環境変数を設定することで、インスタンスメタデータからの認証情報アクセスを無効にできます。
詳細については、「インスタンスメタデータ」をご参照ください。
ECS または ECI インスタンスに RAM ロールを割り当てる方法の詳細については、「RAM ロールを作成して ECS インスタンスに付与する」および「インスタンス RAM ロールを ECI インスタンスに割り当てる」をご参照ください。
セキュリティ強化モードで一時的な ID 認証情報を取得するには、alibabacloud_credentials のバージョンが 0.3.6 以降であることを確認する必要があります。
5. URI に基づいて認証情報を取得する
認証情報が見つからない場合、Credentials ツールは ALIBABA_CLOUD_CREDENTIALS_URI 環境変数をチェックします。この変数が存在し、有効な URI を指している場合、Credentials ツールはこの URI にアクセスして STS トークンをデフォルトの認証情報として取得します。
セッション認証情報の自動更新メカニズム
セッション認証情報には、ram_role_arn、ecs_ram_role、oidc_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()

次のセクションでは、ログ結果を分析します:
最初の呼び出しでは、認証情報がキャッシュされていません。そのため、システムは設定に基づいて認証情報を取得します。認証情報が取得されると、キャッシュに保存されます。
2 回目の呼び出しで使用される認証情報は、1 回目と同じです。これは、2 回目の呼び出しの認証情報がキャッシュから取得されたことを示します。
3 回目の呼び出しでは、キャッシュ内の認証情報が期限切れになっています。これは、認証情報の有効期間 (`RoleSessionExpiration`) が 3,600 秒に設定されており、3 回目の呼び出しが最初の呼び出しから 4,200 秒後に発生するためです。したがって、SDK は自動更新メカニズムに基づいて新しい認証情報を再取得し、新しい認証情報をキャッシュに保存します。
4 回目の呼び出しで使用される認証情報は、3 回目の呼び出しで取得された新しい認証情報と同じです。これは、キャッシュ内の認証情報が期限切れになった後に更新されたことを示します。
リファレンス
詳細については、「用語」をご参照ください。
詳細については、「AccessKey ペアの作成」をご参照ください。
RAM ユーザー、AccessKey ペア、RAM ロール、およびアクセスポリシーをプログラムで作成し、権限を付与する方法の詳細については、「RAM SDK の概要」をご参照ください。
プログラムでロールを偽装する方法の詳細については、「STS SDK の概要」をご参照ください。
RAM および STS 関連の API 操作の詳細については、「API リファレンス」をご参照ください。