El SDK de Alibaba Cloud utiliza la herramienta Credentials para gestionar de forma centralizada las credenciales, como su AccessKey y su STS Token. En este tema se describen los tipos de credenciales compatibles y sus métodos de configuración.
Requisitos previos
La herramienta Credentials requiere Python 3.7 o una versión posterior. Para más información, consulte Alibaba Cloud SDK maintenance policy.
Utilice un SDK V2.0 de Alibaba Cloud. Para más información, consulte V2.0 SDK and V1.0 SDK.
Instalación de la herramienta Credentials
Se recomienda usar pip para instalar la herramienta Credentials:
pip install alibabacloud_credentials
Para comprobar la versión más reciente de la biblioteca alibabacloud_credentials, consulte la página del paquete alibabacloud-credentials en PyPI o el registro de cambios en GitHub. Utilice siempre la versión más reciente para asegurar que todas las funciones sean compatibles.
Tipos de credenciales y parámetros
La clase Config del módulo alibabacloud_credentials.models define los tipos de credenciales que admite la herramienta Credentials y los parámetros de configuración de cada tipo. El parámetro type especifica el tipo de credencial, y cada uno requiere un conjunto distinto de parámetros de configuración. En la siguiente tabla, cada columna corresponde a un valor válido de type y cada fila a un parámetro de configuración. indica un parámetro obligatorio, - señala un parámetro opcional y significa que el parámetro no se admite.
Se recomienda utilizar únicamente los tipos de credenciales y los parámetros que aparecen en la siguiente tabla.
|
Parámetro |
access_key |
sts |
ram_role_arn |
ecs_ram_role |
oidc_role_arn |
credentials_uri |
bearer |
|
access_key_id: el ID de AccessKey. |
|
|
|
|
|
|
|
|
access_key_secret: el secreto de AccessKey. |
|
|
|
|
|
|
|
|
security_token: el token de Security Token Service (STS). |
|
|
- |
|
|
|
|
|
role_arn: el nombre de recurso de Alibaba Cloud (ARN) del rol de Resource Access Management (RAM). |
|
|
|
|
|
|
|
|
role_session_name: el nombre de la sesión personalizada. El formato predeterminado es |
|
|
- |
|
- |
|
|
|
role_name: el nombre del rol de RAM. |
|
|
|
- |
|
|
|
|
disable_imds_v1: especifica si se debe forzar el uso del modo de seguridad reforzada (IMDSv2). Valor predeterminado: |
|
|
|
- |
|
|
|
|
bearer_token: un token de portador (bearer token). |
|
|
|
|
|
|
|
|
policy: una política personalizada. |
|
|
- |
|
- |
|
|
|
role_session_expiration: el tiempo de expiración de la sesión. Valor predeterminado: 3600. Unidad: segundos. |
|
|
- |
|
- |
|
|
|
oidc_provider_arn: el ARN del proveedor de identidades (IdP) de OpenID Connect (OIDC). |
|
|
|
|
|
|
|
|
oidc_token_file_path: la ruta al archivo del token OIDC. |
|
|
|
|
|
|
|
|
external_id: el ID externo del rol, que se usa principalmente para evitar el problema del delegado confuso (confused deputy). Para más información, consulte Prevent the confused deputy problem with external IDs. |
|
|
- |
|
|
|
|
|
credentials_uri: el URI de las credenciales. |
|
|
|
|
|
|
|
|
sts_endpoint: el endpoint de STS. Se admiten endpoints de VPC y de Internet. Para consultar los valores válidos, consulte STS endpoints. Valor predeterminado: |
|
|
- |
|
- |
|
|
|
timeout: el periodo de tiempo de espera de lectura de las solicitudes HTTP. Valor predeterminado: 5000. Unidad: milisegundos. |
|
|
- |
- |
- |
- |
|
|
connect_timeout: el periodo de tiempo de espera de conexión de las solicitudes HTTP. Valor predeterminado: 10000. Unidad: milisegundos. |
|
|
- |
- |
- |
- |
|
Uso de la herramienta Credentials
En la sección anterior se describen los tipos de credenciales y los parámetros de configuración que admite la herramienta Credentials. A continuación se presentan ejemplos de código que muestran cómo usar esta herramienta. Seleccione el método que mejor se adapte a su escenario.
Incluir un AccessKey directamente en el código del proyecto genera riesgos de seguridad. Si los permisos del repositorio no se gestionan correctamente, todos los recursos de su cuenta podrían quedar expuestos. Se recomienda almacenar el AccessKey en variables de entorno o en archivos de configuración.
Aplique el patrón singleton con la herramienta Credentials. Este patrón habilita la caché de credenciales integrada de la herramienta, lo que evita los límites de velocidad por llamadas frecuentes a la API y previene el desperdicio de recursos al crear varias instancias. Para más información, consulte Automatic refresh of session credentials.
Método 1: Cadena de credenciales predeterminada
Este es el método predeterminado que se utiliza en el código de ejemplo del portal de OpenAPI.
Si utiliza la herramienta Credentials sin pasar ningún parámetro de configuración, la herramienta obtiene las credenciales de default credential chain. Antes de aplicar este método, asegúrese de que el entorno de ejecución de su aplicación esté configurado con alguna de las fuentes de credenciales que admite default credential chain.
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étodo 2: Par de AccessKey
La herramienta Credentials utiliza AccessKey que usted proporciona como credencial de acceso.
Una cuenta de Alibaba Cloud (cuenta raíz) tiene permisos totales sobre todos sus recursos, por lo que exponer su AK representa un riesgo de seguridad importante. No utilice el AK de una cuenta raíz.
Utilice el AK de un usuario de RAM con permisos de mínimo privilegio.
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étodo 3: Token de STS
La herramienta Credentials utiliza STS token estático que usted proporciona como credencial de acceso.
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étodo 4: Par de AccessKey y ARN de rol de RAM
La herramienta Credentials utiliza el par de AccessKey y el ARN del rol de RAM que usted proporciona para llamar a AssumeRole y obtener un token de STS. Después, emplea ese token como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh mechanism of session credentials.
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étodo 5: Rol de RAM de instancia de ECS
Si su aplicación se ejecuta en una instancia de Elastic Compute Service (ECS) o de Elastic Container Instance (ECI) que tiene un rol de RAM asociado, la herramienta Credentials puede obtener el token de STS de dicho rol desde los metadatos de la instancia y usarlo como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh mechanism of session credentials.
De forma predeterminada, la herramienta Credentials accede a los metadatos de la instancia de ECS mediante el modo de seguridad reforzada (IMDSv2). Si ocurre un error en este modo, utilice el parámetro disable_imds_v1 o la variable de entorno ALIBABA_CLOUD_IMDSV1_DISABLED para controlar cómo responde la herramienta ante el error:
Si el valor es
False, que es el valor predeterminado, la herramienta intenta cambiar al modo normal (IMDSv1) para continuar obteniendo las credenciales.Si el valor es
True, la herramienta obtiene las credenciales únicamente en el modo de seguridad reforzada. Si falla el acceso en este modo, se lanza una excepción. La compatibilidad de una instancia con el modo de seguridad reforzada depende de su configuración.
También puede establecer la variable de entorno ALIBABA_CLOUD_ECS_METADATA_DISABLED=true para evitar que la herramienta Credentials obtenga credenciales de los metadatos de la instancia.
Para más información sobre los metadatos de la instancia, consulte Instance metadata.
Para más información sobre cómo asociar un rol de RAM a una instancia de ECS o ECI, consulte Step 1: Create a RAM role y Attach an instance RAM role to an ECI instance.
Para obtener credenciales de identidad temporales en el modo de seguridad reforzada, utilice
alibabacloud_credentials0.3.6 o una versión posterior.
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étodo 6: ARN de rol de OIDC
Si utiliza el protocolo de autenticación OIDC y cuenta con created a RAM role for an OIDC identity provider, puede pasar a la herramienta Credentials el ARN del IdP de OIDC, el token OIDC y el ARN del rol de RAM. La herramienta llama automáticamente a la operación AssumeRoleWithOIDC de STS para obtener el token de STS del rol de RAM y lo emplea como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh mechanism of session credentials.
Por ejemplo, si su aplicación se ejecuta en un clúster de Container Service for Kubernetes (ACK) que tiene habilitado RRSA, la herramienta Credentials lee la configuración de OIDC desde las variables de entorno del pod y llama a la operación AssumeRoleWithOIDC para obtener el token de STS del rol de servicio. Luego, su aplicación utiliza ese token para acceder a los servicios de 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étodo 7: Credenciales por URI
Puede encapsular el servicio STS y exponer un URI para que los servicios externos obtengan un token de STS a través de él. Este enfoque reduce el riesgo de exponer información confidencial, como un par de AccessKey. La herramienta Credentials accede al URI que usted proporciona para obtener un token de STS y lo utiliza como credencial de acceso. Las credenciales obtenidas de esta manera admiten la actualización automática. Para más información, consulte Automatic refresh mechanism of session credentials.
El URI debe cumplir las siguientes condiciones:
Debe admitir solicitudes GET.
El código de estado de la respuesta debe ser 200.
El cuerpo de la respuesta debe tener la siguiente estructura:
{
"Code": "Success",
"AccessKeySecret": "yourAccessKeySecret",
"AccessKeyId": "STS.****************",
"Expiration": "2021-09-26T03:46:38Z",
"SecurityToken": "yourSecurityToken"
}
A continuación se muestra un ejemplo de cómo obtener credenciales desde un 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étodo 8: Token de portador (bearer token)
Actualmente, solo Alibaba Cloud Call Center (CCC) admite la autenticación mediante bearer token.
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.
Cadena de proveedores de credenciales predeterminada
La cadena de proveedores de credenciales predeterminada es un mecanismo alternativo que busca una credencial al revisar una secuencia predefinida de ubicaciones. La búsqueda continúa hasta encontrar una credencial. Si después de revisar todas las ubicaciones no se encuentra ninguna, se lanza una CredentialException. El orden de búsqueda es el siguiente:
1. Obtención de la información de credenciales desde variables de entorno
Si no se encuentra ninguna credencial en las propiedades del sistema, la cadena de proveedores revisa las variables de entorno.
Si ALIBABA_CLOUD_ACCESS_KEY_ID y ALIBABA_CLOUD_ACCESS_KEY_SECRET están presentes y no están vacías, la cadena de proveedores las utiliza como credencial predeterminada.
Si también se definen ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET y ALIBABA_CLOUD_SECURITY_TOKEN, la cadena de proveedores emplea un token de STS como credencial predeterminada.
2. Obtención de la información de credenciales mediante el rol de RAM de un IdP de OIDC
Si aún no se ha encontrado ninguna credencial, la cadena de proveedores comprueba las siguientes variables de entorno relacionadas con un rol de RAM de OIDC:
ALIBABA_CLOUD_ROLE_ARN: el ARN del rol de RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: el ARN del proveedor de OIDC.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: la ruta del archivo del token OIDC.
Si las tres variables de entorno están presentes y no están vacías, la cadena de proveedores utiliza estos valores para llamar a la API AssumeRoleWithOIDC de Security Token Service (STS) y obtener un token de STS.
3. Obtención de la información de credenciales desde un archivo de configuración
Esta función requiere alibabacloud_credentials 1.0rc3 o una versión posterior.
Si todavía no se ha encontrado ninguna credencial, la cadena de proveedores intenta cargar el archivo de credenciales compartido, config.json, desde su ubicación predeterminada y utiliza la credencial especificada en dicho archivo.
Linux/macOS:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Para configurar una credencial de esta manera, puede utilizar Alibaba Cloud CLI o crear manualmente un archivo config.json en la ruta correspondiente. A continuación se muestra el formato del contenido:
{
"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
}
]
}
|
Parámetro |
Descripción |
|
current |
Especifique el nombre de la credencial para recuperar la configuración correspondiente. El nombre de la credencial es el valor del parámetro |
|
profiles |
Contiene una colección de configuraciones de credenciales. El parámetro
|
4. Obtención de la información de credenciales mediante el rol de RAM de una instancia de ECS
Si no se ha encontrado ninguna credencial, la cadena de proveedores intenta recuperar un token de STS del rol de RAM de la instancia desde los metadatos de dicha instancia. Este token se utiliza entonces como credencial predeterminada. Para lograrlo, la cadena primero recupera el nombre del rol de RAM asignado a la instancia y luego emplea ese rol para obtener el token de STS correspondiente. Para reducir el tiempo de recuperación de credenciales y mejorar la eficiencia, puede especificar directamente el nombre del rol de RAM mediante la variable de entorno ALIBABA_CLOUD_ECS_METADATA.
De forma predeterminada, la cadena de proveedores accede a los metadatos de la instancia en el modo de seguridad reforzada (IMDSv2). Si ocurre una excepción en este modo, puede utilizar la variable de entorno ALIBABA_CLOUD_IMDSV1_DISABLED para controlar el comportamiento alternativo:
Cuando el valor es
false(valor predeterminado), el sistema intenta cambiar al modo heredado para recuperar la credencial.Cuando el valor es
true, se impone el modo de seguridad reforzada. Si el acceso falla en este modo, se lanza una excepción.
Además, puede evitar que la cadena de proveedores acceda a los metadatos de la instancia para obtener credenciales si establece la variable de entorno ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
Para más información sobre los metadatos de la instancia, consulte Instance metadata.
Para más información sobre cómo asociar un rol de RAM a una instancia de ECS o ECI, consulte Step 1: Create a RAM role y Attach an instance RAM role to an ECI instance.
Para obtener credenciales de identidad temporales en el modo de seguridad reforzada, utilice
alibabacloud_credentials0.3.6 o una versión posterior.
5. Obtención de la información de credenciales a partir de un URI
Si no se ha encontrado ninguna credencial, la cadena de proveedores comprueba la variable de entorno ALIBABA_CLOUD_CREDENTIALS_URI. Si esta variable está definida y apunta a un URI válido, la cadena accede a dicho URI para recuperar un token de STS.
Mecanismo de actualización automática de credenciales de sesión
Los tipos de credenciales de sesión, como ram_role_arn, ecs_ram_role, oidc_role_arn y credentials_uri, admiten la actualización automática mediante un mecanismo integrado en el proveedor de credenciales. Cuando un cliente de credenciales obtiene una por primera vez, el proveedor la almacena en una caché. En las operaciones posteriores, la misma instancia del cliente recupera automáticamente la credencial desde esta caché. Si la credencial almacenada caducó, la instancia del cliente obtiene una nueva y actualiza la caché en consecuencia.
Para las credenciales ecs_ram_role, el proveedor de credenciales las actualiza de forma proactiva 15 minutos antes de que caduquen.
A continuación se muestra un ejemplo que utiliza el patrón singleton para crear un cliente de credenciales. Este ejemplo demuestra el mecanismo de actualización al obtener una credencial en distintos intervalos de tiempo y llamar a una operación de OpenAPI para comprobar que la credencial es válida.
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
Análisis basado en la salida del registro:
En la primera llamada, la caché está vacía. El sistema obtiene una credencial según su configuración y luego la almacena en la caché.
La segunda llamada usa la misma credencial que la primera, lo cual indica que se recuperó de la caché.
En la tercera llamada, la credencial almacenada ya caducó. Su tiempo de expiración (
RoleSessionExpiration) es de 3,600 segundos, pero esta llamada se ejecuta 4,200 segundos después de la primera. Por lo tanto, el mecanismo de actualización automática del SDK obtiene una credencial nueva y actualiza la caché.La cuarta llamada usa la misma credencial que la tercera, lo que confirma que la caché se actualizó.
Documentos relacionados
Para consultar la descripción general de los conceptos básicos de RAM, consulte Basic concepts.
Para crear una AccessKey, consulte Create an AccessKey.
Para crear usuarios de RAM, AccessKeys y roles de RAM mediante programación, definir políticas de permisos y otorgar permisos, consulte RAM SDK overview.
Para asumir un rol mediante programación, consulte STS SDK overview.
Para obtener más información sobre las API de RAM y STS, consulte API reference.
Best practices for using access credentials to call Alibaba Cloud OpenAPI