Todos los productos
Search
Centro de documentos

Alibaba Cloud SDK:Gestión de credenciales de acceso

Última actualización: Sep 05, 2026

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

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. Compatible indica un parámetro obligatorio, - señala un parámetro opcional y No compatible 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.

Compatible

Compatible

Compatible

No compatible

No compatible

No compatible

No compatible

access_key_secret: el secreto de AccessKey.

Compatible

Compatible

Compatible

No compatible

No compatible

No compatible

No compatible

security_token: el token de Security Token Service (STS).

No compatible

Compatible

-

No compatible

No compatible

No compatible

No compatible

role_arn: el nombre de recurso de Alibaba Cloud (ARN) del rol de Resource Access Management (RAM).

No compatible

No compatible

Compatible

No compatible

Compatible

No compatible

No compatible

role_session_name: el nombre de la sesión personalizada. El formato predeterminado es credentials-python-The current timestamp.

No compatible

No compatible

-

No compatible

-

No compatible

No compatible

role_name: el nombre del rol de RAM.

No compatible

No compatible

No compatible

-

No compatible

No compatible

No compatible

disable_imds_v1: especifica si se debe forzar el uso del modo de seguridad reforzada (IMDSv2). Valor predeterminado: False.

No compatible

No compatible

No compatible

-

No compatible

No compatible

No compatible

bearer_token: un token de portador (bearer token).

No compatible

No compatible

No compatible

No compatible

No compatible

No compatible

Compatible

policy: una política personalizada.

No compatible

No compatible

-

No compatible

-

No compatible

No compatible

role_session_expiration: el tiempo de expiración de la sesión. Valor predeterminado: 3600. Unidad: segundos.

No compatible

No compatible

-

No compatible

-

No compatible

No compatible

oidc_provider_arn: el ARN del proveedor de identidades (IdP) de OpenID Connect (OIDC).

No compatible

No compatible

No compatible

No compatible

Compatible

No compatible

No compatible

oidc_token_file_path: la ruta al archivo del token OIDC.

No compatible

No compatible

No compatible

No compatible

Compatible

No compatible

No compatible

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.

No compatible

No compatible

-

No compatible

No compatible

No compatible

No compatible

credentials_uri: el URI de las credenciales.

No compatible

No compatible

No compatible

No compatible

No compatible

Compatible

No compatible

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: sts.aliyuncs.com.

No compatible

No compatible

-

No compatible

-

No compatible

No compatible

timeout: el periodo de tiempo de espera de lectura de las solicitudes HTTP. Valor predeterminado: 5000. Unidad: milisegundos.

No compatible

No compatible

-

-

-

-

No compatible

connect_timeout: el periodo de tiempo de espera de conexión de las solicitudes HTTP. Valor predeterminado: 10000. Unidad: milisegundos.

No compatible

No compatible

-

-

-

-

No compatible

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.

Importante
  • 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

Nota

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.

Aviso

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.

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.json

  • Windows: 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 name dentro de profiles. De forma predeterminada, el sistema da prioridad al nombre de credencial definido por la variable de entorno ALIBABA_CLOUD_PROFILE . Si esta variable no está configurada, el sistema utiliza el nombre indicado en current.

profiles

Contiene una colección de configuraciones de credenciales. El parámetro mode especifica el tipo de credencial:

  • AK: utiliza el AccessKey de un usuario de RAM como credencial.

  • StsToken: emplea un token de STS como credencial.

  • RamRoleArn: asume un rol de RAM mediante las credenciales de un usuario de RAM para obtener una credencial temporal.

  • EcsRamRole: obtiene una credencial desde los metadatos de la instancia.

  • OIDC: obtiene una credencial mediante un ARN de proveedor de OIDC, un token OIDC y un ARN de rol de RAM.

  • ChainableRamRoleArn: utiliza el encadenamiento de roles para obtener una nueva credencial, partiendo de una credencial inicial definida en profiles e indicada por el parámetro source_profile.

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.

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.

Nota

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