Le SDK Alibaba Cloud utilise l'outil Credentials pour gérer de manière centralisée les identifiants, tels que votre AccessKey et votre jeton STS. Cette rubrique décrit les types d'identifiants pris en charge ainsi que leurs méthodes de configuration.
Prérequis
L'outil Credentials nécessite Python 3.7 ou une version ultérieure. Pour plus d'informations, consultez la Politique de maintenance du SDK Alibaba Cloud.
Utilisez un SDK Alibaba Cloud V2.0. Pour plus d'informations, consultez la rubrique SDK V2.0 et SDK V1.0.
Installer l'outil Credentials
Nous vous recommandons d'utiliser pip pour installer l'outil Credentials :
pip install alibabacloud_credentials
Pour vérifier la dernière version de la bibliothèque alibabacloud_credentials, consultez la page du package alibabacloud-credentials sur PyPI ou le journal des modifications sur GitHub. Utilisez la dernière version pour garantir la prise en charge de toutes les fonctionnalités.
Types d'identifiants et paramètres
La classe Config du module alibabacloud_credentials.models définit les types d'identifiants pris en charge par l'outil Credentials ainsi que les paramètres de configuration de chaque type. Le paramètre type spécifie le type d'identifiant, et chaque type nécessite un ensemble différent de paramètres de configuration. Dans le tableau suivant, chaque colonne correspond à une valeur valide de type, et chaque ligne correspond à un paramètre de configuration. indique un paramètre obligatoire, - indique un paramètre facultatif, et indique que le paramètre n'est pas pris en charge.
Nous vous recommandons d'utiliser uniquement les types d'identifiants et les paramètres répertoriés dans le tableau suivant.
| Paramètre | access_key | sts | ram_role_arn | ecs_ram_role | oidc_role_arn | credentials_uri | bearer |
| access_key_id : ID de l'AccessKey. | |||||||
| access_key_secret : Secret de l'AccessKey. | |||||||
| security_token : Jeton Security Token Service (STS). | - | ||||||
| role_arn : Nom de ressource Alibaba Cloud (ARN) du rôle Resource Access Management (RAM). | |||||||
role_session_name : Nom de la session personnalisée. Le format par défaut est credentials-python-The current timestamp. |
- | - | |||||
| role_name : Nom du rôle RAM. | - | ||||||
disable_imds_v1 : Indique s'il faut utiliser de force le mode de sécurité renforcée (IMDSv2). Valeur par défaut : False. |
- | ||||||
| bearer_token : Un jeton bearer. | |||||||
| policy : Une politique personnalisée. | - | - | |||||
| role_session_expiration : Durée d'expiration de la session. Valeur par défaut : 3600. Unité : secondes. | - | - | |||||
| oidc_provider_arn : ARN du fournisseur d'identité OpenID Connect (OIDC). | |||||||
| oidc_token_file_path : Chemin d'accès au fichier de jeton OIDC. | |||||||
| external_id : ID externe du rôle, principalement utilisé pour prévenir le problème du « confused deputy ». Pour plus d'informations, consultez la rubrique Prévenir le problème du confused deputy avec les ID externes. | - | ||||||
| credentials_uri : URI des identifiants. | |||||||
sts_endpoint : Endpoint de STS. Les endpoints VPC et Internet sont pris en charge. Pour connaître les valeurs valides, consultez la rubrique Endpoints STS. Valeur par défaut : sts.aliyuncs.com. |
- | - | |||||
| timeout : Délai de lecture des requêtes HTTP. Valeur par défaut : 5000. Unité : millisecondes. | - | - | - | - | |||
| connect_timeout : Délai de connexion des requêtes HTTP. Valeur par défaut : 10000. Unité : millisecondes. | - | - | - | - |
Utilisation de l'outil Credentials
La section précédente décrit les types d'identifiants et les paramètres de configuration pris en charge par l'outil Credentials. Les sections suivantes fournissent des exemples de code illustrant l'utilisation de l'outil. Sélectionnez la méthode la mieux adaptée à votre scénario.
Coder en dur un AccessKey dans votre projet crée des risques de sécurité. Des autorisations de référentiel mal gérées peuvent exposer toutes les ressources de votre compte. Il est recommandé de stocker l'AccessKey dans des variables d'environnement ou des fichiers de configuration.
Utilisez un modèle singleton avec l'outil Credentials. Ce modèle permet à la mise en cache intégrée des identifiants de l'outil d'éviter les limitations de débit dues aux appels API fréquents et de prévenir le gaspillage de ressources lié à la création de plusieurs instances. Pour plus d'informations, consultez la rubrique Actualisation automatique des identifiants de session.
Méthode 1 : Chaîne d'identifiants par défaut
Il s'agit de la méthode par défaut utilisée dans l'exemple de code du portail OpenAPI.
Si vous utilisez l'outil Credentials sans transmettre de paramètres de configuration, l'outil récupère les identifiants à partir de la chaîne d'identifiants par défaut. Avant d'utiliser cette méthode, assurez-vous que l'environnement d'exécution de votre application est configuré avec l'une des sources d'identifiants prises en charge par la chaîne d'identifiants par défaut.
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models
# If no configuration parameter is specified, credentials are retrieved from the default credential chain.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# Use config to initialize the client of the cloud service. For more information, see the SDK documentation of each cloud service.
Méthode 2 : Paire AccessKey
L'outil Credentials utilise l'AccessKey que vous fournissez comme identifiant d'accès.
Un compte Alibaba Cloud (compte racine) dispose de toutes les autorisations sur l'ensemble de ses ressources ; par conséquent, une exposition de l'AK présente un risque de sécurité important. N'utilisez pas l'AK d'un compte racine.
Utilisez l'AK d'un utilisateur RAM disposant des autorisations minimales nécessaires.
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',
# Required. In this example, the AccessKey ID is retrieved from an environment variable.
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
# Required. In this example, the AccessKey secret is retrieved from an environment variable.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# Then, use config to initialize the client of the corresponding cloud service.
Méthode 3 : Jeton STS
L'outil Credentials utilise le jeton STS statique que vous fournissez comme identifiant d'accès.
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',
# Required. In this example, the AccessKey ID is retrieved from an environment variable.
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
# Required. In this example, the AccessKey secret is retrieved from an environment variable.
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
# Required. In this example, the temporary security token is retrieved from an environment variable.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Méthode 4 : Paire AccessKey et ARN de rôle RAM
L'outil Credentials utilise la paire AccessKey et l'ARN de rôle RAM que vous fournissez pour appeler AssumeRole et obtenir un jeton STS. L'outil utilise ensuite le jeton STS comme identifiant d'accès. Les identifiants obtenus de cette manière prennent en charge l'actualisation automatique. Pour plus d'informations, consultez le Mécanisme d'actualisation automatique des identifiants de session.
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',
# Required. In this example, the AccessKey ID is retrieved from an environment variable.
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
# Required. In this example, the AccessKey secret is retrieved from an environment variable.
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
# Required. The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can also use the ALIBABA_CLOUD_ROLE_ARN environment variable to set this parameter.
role_arn='<role_arn>',
# Optional. The role session name. You can also use the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable to set this parameter.
role_session_name='<role_session_name>',
# Optional. A more restrictive policy. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy='<policy>',
# Optional. The external ID of the role, which is mainly used to prevent the confused deputy problem.
external_id='<external_id>',
# Optional. The session expiration time. Default value: 3600 seconds.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Méthode 5 : Rôle RAM d'instance ECS
Si votre application s'exécute sur une instance Elastic Compute Service (ECS) ou Elastic Container Instance (ECI) à laquelle un rôle RAM est attaché, l'outil Credentials peut obtenir le jeton STS du rôle RAM à partir des métadonnées de l'instance et utiliser ce jeton comme identifiant d'accès. Les identifiants obtenus de cette manière prennent en charge l'actualisation automatique. Pour plus d'informations, consultez le Mécanisme d'actualisation automatique des identifiants de session.
Par défaut, l'outil Credentials utilise le mode de sécurité renforcée (IMDSv2) pour accéder aux métadonnées de l'instance ECS. Si une erreur se produit en mode de sécurité renforcée, utilisez le paramètre disable_imds_v1 ou la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLED pour contrôler la façon dont l'outil gère l'erreur :
Si la valeur est
False(valeur par défaut), l'outil Credentials tente de basculer vers le mode normal (IMDSv1) pour continuer à obtenir les identifiants.Si la valeur est
True, l'outil Credentials obtient les identifiants uniquement en mode de sécurité renforcée. Si l'accès en mode de sécurité renforcée échoue, une exception est levée. La prise en charge du mode de sécurité renforcée par une instance dépend de sa configuration.
Vous pouvez également définir la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true pour empêcher l'outil Credentials d'obtenir les identifiants à partir des métadonnées de l'instance.
Pour plus d'informations sur les métadonnées d'instance, consultez la rubrique Métadonnées d'instance.
Pour savoir comment attacher un rôle RAM à une instance ECS ou ECI, consultez les rubriques Étape 1 : Créer un rôle RAM et Attacher un rôle RAM d'instance à une instance ECI.
Pour obtenir des identifiants d'identité temporaires en mode de sécurité renforcée, utilisez
alibabacloud_credentialsversion 0.3.6 ou ultérieure.
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',
# Optional. The name of the ECS role. If you leave this parameter empty, the name is obtained automatically. We recommend that you specify the name to reduce the number of requests. You can also use the ALIBABA_CLOUD_ECS_METADATA environment variable to set this parameter.
role_name='<role_name>',
# Optional. Default value: False. True: credentials are obtained only in the security hardening mode (IMDSv2), and an exception is thrown if access fails, so set True only for instances that support the security hardening mode. False: the tool first tries to obtain credentials in the security hardening mode. If the attempt fails, the tool switches to the normal mode (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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Méthode 6 : ARN de rôle OIDC
Si vous utilisez le protocole d'authentification OIDC et que vous avez créé un rôle RAM pour un fournisseur d'identité OIDC, vous pouvez transmettre l'ARN du fournisseur d'identité OIDC, le jeton OIDC et l'ARN du rôle RAM à l'outil Credentials. L'outil appelle automatiquement l'opération AssumeRoleWithOIDC de STS pour obtenir le jeton STS du rôle RAM et utilise ce jeton comme information d'identification d'accès. Les informations d'identification obtenues de cette manière prennent en charge l'actualisation automatique. Pour plus d'informations, consultez le document Mécanisme d'actualisation automatique des informations d'identification de session.
Par exemple, si votre application s'exécute dans un cluster Container Service for Kubernetes (ACK) avec RRSA activé, l'outil Credentials lit la configuration OIDC depuis les variables d'environnement du pod et appelle l'opération AssumeRoleWithOIDC pour obtenir le jeton STS du rôle de service. Votre application utilise ensuite le jeton STS pour accéder aux services 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',
# Required. The RAM role ARN. You can also use the ALIBABA_CLOUD_ROLE_ARN environment variable to set this parameter.
role_arn='<role_arn>',
# Required. The ARN of the OIDC IdP. You can also use the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable to set this parameter.
oidc_provider_arn='<oidc_provider_arn>',
# Required. The path to the OIDC token file. You can also use the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable to set this parameter.
oidc_token_file_path='<oidc_token_file_path>',
# Optional. The role session name. You can also use the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable to set this parameter.
role_session_name='<role_session_name>',
# Optional. A more restrictive policy. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy='<policy>',
# Optional. The session expiration time. Default value: 3600 seconds.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Méthode 7 : Informations d'identification via URI
Vous pouvez encapsuler le service STS et exposer une URI afin que les services externes puissent obtenir un jeton STS via cette URI. Cette approche réduit le risque d'exposition d'informations sensibles telles qu'une paire AccessKey. L'outil Credentials accède à l'URI que vous fournissez pour obtenir un jeton STS et utilise ce jeton comme information d'identification d'accès. Les informations d'identification obtenues de cette manière prennent en charge l'actualisation automatique. Pour plus d'informations, consultez le document Mécanisme d'actualisation automatique des informations d'identification de session.
L'URI doit respecter les conditions suivantes :
Les requêtes GET sont prises en charge.
Le code d'état de la réponse est 200.
Le corps de la réponse présente la structure suivante :
{
"Code": "Success",
"AccessKeySecret": "yourAccessKeySecret",
"AccessKeyId": "STS.****************",
"Expiration": "2021-09-26T03:46:38Z",
"SecurityToken": "yourSecurityToken"
}
L'exemple suivant montre comment obtenir des informations d'identification à partir d'une URI :
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',
# Required. The URI from which the credentials are obtained. The format is http://local_or_remote_uri/. You can also use the ALIBABA_CLOUD_CREDENTIALS_URI environment variable to set this parameter.
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()
# When you use a V2.0 SDK for a cloud service, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Méthode 8 : Jeton Bearer
Actuellement, seul Alibaba Cloud Call Center (CCC) prend en charge l'authentification par jeton Bearer.
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',
# Required. Enter your bearer token.
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()
# When you use the CCC V2.0 SDK, pass the credential by using the Config class of the alibabacloud_tea_openapi.models module.
config = open_api_models.Config(
credential=credentialsClient,
endpoint='<endpoint>'
)
# The code that uses config to initialize the client of the cloud service is omitted.
Chaîne de fournisseurs d'informations d'identification par défaut
La chaîne de fournisseurs d'informations d'identification par défaut est un mécanisme de secours qui recherche une information d'identification en vérifiant une séquence prédéfinie d'emplacements. La recherche se poursuit jusqu'à ce qu'une information d'identification soit trouvée. Si aucune information d'identification n'est trouvée après avoir vérifié tous les emplacements, une exception CredentialException est levée. L'ordre de recherche est le suivant :
1. Obtenir les informations d'identification à partir des variables d'environnement
Si aucune information d'identification n'est trouvée dans les propriétés système, la chaîne de fournisseurs vérifie ensuite les variables d'environnement.
Si ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET sont toutes deux présentes et non vides, la chaîne de fournisseurs les utilise comme informations d'identification par défaut.
Si ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET et ALIBABA_CLOUD_SECURITY_TOKEN sont également définies, la chaîne de fournisseurs utilise un jeton STS comme information d'identification par défaut.
2. Obtenir les informations d'identification en utilisant le rôle RAM d'un fournisseur d'identité OIDC
Si aucune information d'identification n'a été trouvée, la chaîne de fournisseurs vérifie les variables d'environnement suivantes liées à un rôle RAM OIDC :
ALIBABA_CLOUD_ROLE_ARN : L'ARN du rôle RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN : L'ARN du fournisseur OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE : Le chemin d'accès au fichier du jeton OIDC.
Si les trois variables d'environnement sont présentes et non vides, la chaîne de fournisseurs utilise ces valeurs pour appeler l'API AssumeRoleWithOIDC du Security Token Service (STS) afin d'obtenir un jeton STS.
3. Obtenir les informations d'identification à partir d'un fichier de configuration
Cette fonctionnalité nécessite alibabacloud_credentials version 1.0rc3 ou ultérieure.
Si aucune information d'identification n'a été trouvée, la chaîne de fournisseurs tente de charger le fichier d'informations d'identification partagé, config.json, depuis son emplacement par défaut et utilise l'information d'identification spécifiée dans le fichier.
Linux/macOS :
~/.aliyun/config.jsonWindows :
C:\Users\USER_NAME\.aliyun\config.json
Pour configurer une information d'identification de cette manière, vous pouvez utiliser Alibaba Cloud CLI ou créer manuellement un fichier config.json dans le chemin approprié. L'exemple suivant montre le format du contenu :
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
|
Paramètre |
Description |
|
current |
Spécifiez le nom de l'information d'identification pour récupérer la configuration correspondante. Le nom de l'information d'identification correspond à la valeur du paramètre |
|
profiles |
Contient une collection de configurations d'informations d'identification. Le paramètre
|
4. Obtenir les informations d'identification en utilisant le rôle RAM d'une instance ECS
Si aucune information d'identification n'a été trouvée, la chaîne de fournisseurs tente de récupérer un jeton STS pour le rôle RAM de l'instance à partir des métadonnées de l'instance. Ce jeton est ensuite utilisé comme information d'identification par défaut. Pour ce faire, la chaîne récupère d'abord le nom du rôle RAM attribué à l'instance, puis utilise ce rôle pour obtenir le jeton STS correspondant. Afin de réduire le temps de récupération des informations d'identification et d'améliorer l'efficacité, vous pouvez spécifier directement le nom du rôle RAM en utilisant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA.
Par défaut, la chaîne de fournisseurs accède aux métadonnées de l'instance en mode renforcé sur le plan de la sécurité (IMDSv2). Si une exception se produit en mode renforcé sur le plan de la sécurité, vous pouvez utiliser la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLED pour contrôler le comportement de secours :
Lorsque la valeur est
false(par défaut), le système tente de basculer vers le mode hérité pour récupérer l'information d'identification.Lorsque la valeur est
true, le mode renforcé sur le plan de la sécurité est appliqué de force. Si l'accès échoue dans ce mode, une exception est levée.
De plus, vous pouvez empêcher la chaîne de fournisseurs d'accéder aux métadonnées de l'instance pour les informations d'identification en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Pour plus d'informations sur les métadonnées d'instance, consultez la rubrique Métadonnées d'instance.
Pour savoir comment attacher un rôle RAM à une instance ECS ou ECI, consultez les rubriques Étape 1 : Créer un rôle RAM et Attacher un rôle RAM d'instance à une instance ECI.
Pour obtenir des informations d'identification d'identité temporaires en mode de renforcement de la sécurité, utilisez
alibabacloud_credentialsversion 0.3.6 ou ultérieure.
5. Obtenir les informations d'identification en fonction d'une URI
Si aucune information d'identification n'a été trouvée, la chaîne de fournisseurs vérifie la variable d'environnement ALIBABA_CLOUD_CREDENTIALS_URI. Si cette variable est définie et pointe vers une URI valide, la chaîne accède à l'URI pour récupérer un jeton STS.
Mécanisme d'actualisation automatique des informations d'identification de session
Les types d'informations d'identification de session, tels que ram_role_arn, ecs_ram_role, oidc_role_arn et credentials_uri, prennent en charge l'actualisation automatique grâce à un mécanisme intégré dans le fournisseur d'informations d'identification. Lorsqu'un client d'informations d'identification récupère une information d'identification pour la première fois, le fournisseur la stocke dans un cache. Lors des opérations suivantes, la même instance de client récupère automatiquement l'information d'identification à partir de ce cache. Si l'information d'identification mise en cache a expiré, l'instance de client en récupère une nouvelle et met à jour le cache en conséquence.
Pour les informations d'identification ecs_ram_role, le fournisseur d'informations d'identification les actualise proactivement 15 minutes avant leur expiration.
L'exemple suivant utilise le modèle singleton pour créer un client d'informations d'identification. Il illustre le mécanisme d'actualisation en récupérant une information d'identification à différents intervalles de temps et en appelant une opération OpenAPI pour vérifier que l'information d'identification est utilisable.
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
#
# Thread-safe singleton decorator.
#
def singleton(cls):
"""Implements a thread-safe singleton pattern."""
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 service class.
#
@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
#
# Task function.
#
def execute_task():
try:
# Obtain the credential and the ECS client.
credential = Credential().client.get_credential()
ecs_client = EcsClient(Credential().client).client
# Print the credential information.
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)
# Call an API operation to query the region list.
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
# Define the delays of the scheduled tasks.
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()
Time: 2025-05-28 14:51:51
AK ID: STS.NXC2_xxx_3e8nhx6
AK Secret: 89HQ_xxx_3pVFMsJzbStqUQn
STS Token: CAISxAJ1q6Ft5B2yfSjIr5v2ed2M3uhT3JKAb3b9h3AdS+oUga3T1Dz2IHhMeXZoA+4YsPw2mmFW6/sdLqdJQpp
/QkjJRNF20pLM7VtilmAGIpbng4YfgbiJREKxaXeiru_xxx_3XUiTnmW3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkK7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/Qcp6if5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5f_xxx_+UxM3D2hT+Bi3HLQztRLNaRsQdpz0agA6vG9rqhiMsdPZDiIoh5FHnB/fZ
+F9ol26SXsmquJdjfFgX9FFPVOqvnsHYRXUS2abqNKD_xxx_1GzLDX26i+hM2jxG6CFc9BJ3S5iElyLCAA
Invoke result: 200
Time: 2025-05-28 15:01:51
AK ID: STS.NXC2_xxx_3e8nhx6
AK Secret: 89HQ_xxx_3pVFMsJzbStqUQn
STS Token: CAISxAJ1q6Ft5B2yfSjIr5v2ed2M3uhT3JKAb3b9h3AdS+oUga3T1Dz2IHhMeXZoA+4YsPw2mmFW6/sdLqdJQpp
/QkjJRNF20pLM7VtilmAGIpbng4YfgbiJREKxaXeiru_xxx_3XUiTnmW3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkK7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/Qcp6if5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5f_xxx_+UxM3D2hT+Bi3HLQztRLNaRsQdpz0agA6vG9rqhiMsdPZDiIoh5FHnB/fZ
+F9ol26SXsmquJdjfFgX9FFPVOqvnsHYRXUS2abqNKD_xxx_1GzLDX26i+hM2jxG6CFc9BJ3S5iElyLCAA
Invoke result: 200
Time: 2025-05-28 16:01:53
AK ID: STS.NVw9_xxx_QZ3M4mu
AK Secret: 2mP6_xxx_Xvp38ai4mJTazm
STS Token: CAISxAJ1q6Ft5B2yfSjIr5XCctz4vp1A9qmocRChqE4hXdUfovH6Lzz2IHhMeXZoA+4YsPw2mmFW6/sdLqdJQpp
/QkjJRNF20pLM7VtoxWAYIpbng4YfgbiJREKxaXeiru_xxx_iTnmW3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkK7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/Qcp6if5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5f_xxx_xM3D2hT+Bi3HLQztXxScP8Qdpz0agAG61LMbLwCjTNi3juW48l
+/w3E16v00Wet2c9vr1Ftp3qaJ8zuQJIMgixWIvAXa4_xxx_eAMf+DaoEa0gUg1lQ7096D76vMDDr1eTiiAA
Invoke result: 200
Time: 2025-05-28 16:03:31
AK ID: STS.NVw9_xxx_QZ3M4mu
AK Secret: 2mP6_xxx_Xvp38ai4mJTazm
STS Token: CAISxAJ1q6Ft5B2yfSjIr5XCctz4vp1A9qmocRChqE4hXdUfovH6Lzz2IHhMeXZoA+4YsPw2mmFW6/sdLqdJQpp
/QkjJRNF20pLM7VtoxWAYIpbng4YfgbiJREKxaXeiru_xxx_iTnmW3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkK7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/Qcp6if5I
/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5f_xxx_xM3D2hT+Bi3HLQztXxScP8Qdpz0agAG61LMbLwCjTNi3juW48l
+/w3E16v00Wet2c9vr1Ftp3qaJ8zuQJIMgixWIvAXa4_xxx_eAMf+DaoEa0gUg1lQ7096D76vMDDr1eTiiAA
Invoke result: 200
Analyse basée sur la sortie du journal :
Lors du premier appel, le cache est vide. Le système récupère une information d'identification en fonction de votre configuration, puis la stocke dans le cache.
Le deuxième appel utilise la même information d'identification que le premier, ce qui indique qu'elle a été récupérée à partir du cache.
Lors du troisième appel, l'information d'identification mise en cache a expiré. Son heure d'expiration (
RoleSessionExpiration) est de 3 600 secondes, mais cet appel est effectué 4 200 secondes après le premier. Par conséquent, le mécanisme d'actualisation automatique du SDK récupère une nouvelle information d'identification et met à jour le cache.Le quatrième appel utilise la même information d'identification que le troisième, confirmant que le cache a été mis à jour.
Documents connexes
Pour un aperçu des concepts de base de RAM, consultez la rubrique Concepts de base.
Pour créer une AccessKey, consultez la rubrique Créer une AccessKey.
Pour créer par programme des utilisateurs RAM, des AccessKeys et des rôles RAM ; définir des politiques d'autorisation et accorder des autorisations, consultez la rubrique Présentation du SDK RAM.
Pour endosser un rôle par programme, consultez la rubrique Présentation du SDK STS.
Pour plus de détails sur les API RAM et STS, consultez la Référence API.