Todos os produtos
Search
Central de documentação

Alibaba Cloud SDK:Gerencie credenciais de acesso

Última atualização: Aug 28, 2026

O Alibaba Cloud SDK usa a ferramenta Credentials para gerenciar credenciais centralmente, como AccessKey e STS Token. Este tópico descreve os tipos de credencial compatíveis e seus métodos de configuração.

Pré-requisitos

Instale a ferramenta Credentials

Recomendamos usar o pip para instalar a ferramenta Credentials:

pip install alibabacloud_credentials

Para verificar a versão mais recente da biblioteca alibabacloud_credentials, consulte a página do pacote alibabacloud-credentials no PyPI ou o log de alterações no GitHub. Use sempre a versão mais recente para garantir compatibilidade com todos os recursos.

Tipos de credencial e parâmetros

A classe Config no módulo alibabacloud_credentials.models define os tipos de credencial compatíveis com a ferramenta Credentials e os parâmetros de configuração de cada tipo. O parâmetro type especifica o tipo de credencial; cada tipo exige um conjunto diferente de parâmetros de configuração. Na tabela a seguir, cada coluna corresponde a um valor válido de type e cada linha corresponde a um parâmetro de configuração. Supported indica um parâmetro obrigatório, - indica um parâmetro opcional e Unsupported indica que o parâmetro não é compatível.

Recomendamos usar apenas os tipos de credencial e parâmetros listados na tabela a seguir.

Parâmetro

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

access_key_id: o AccessKey ID.

Supported

Supported

Supported

Unsupported

Unsupported

Unsupported

Unsupported

access_key_secret: o segredo do AccessKey.

Supported

Supported

Supported

Unsupported

Unsupported

Unsupported

Unsupported

security_token: o token do Security Token Service (STS).

Unsupported

Supported

-

Unsupported

Unsupported

Unsupported

Unsupported

role_arn: o Alibaba Cloud Resource Name (ARN) da função do Resource Access Management (RAM).

Unsupported

Unsupported

Supported

Unsupported

Supported

Unsupported

Unsupported

role_session_name: o nome da sessão personalizada. O formato padrão é credentials-python-The current timestamp.

Unsupported

Unsupported

-

Unsupported

-

Unsupported

Unsupported

role_name: o nome da função RAM.

Unsupported

Unsupported

Unsupported

-

Unsupported

Unsupported

Unsupported

disable_imds_v1: especifica se deve forçar o uso do modo de segurança reforçada (IMDSv2). Valor padrão: False.

Unsupported

Unsupported

Unsupported

-

Unsupported

Unsupported

Unsupported

bearer_token: um token bearer.

Unsupported

Unsupported

Unsupported

Unsupported

Unsupported

Unsupported

Supported

policy: uma política personalizada.

Unsupported

Unsupported

-

Unsupported

-

Unsupported

Unsupported

role_session_expiration: o tempo de expiração da sessão. Valor padrão: 3600. Unidade: segundos.

Unsupported

Unsupported

-

Unsupported

-

Unsupported

Unsupported

oidc_provider_arn: o ARN do provedor de identidade OpenID Connect (OIDC).

Unsupported

Unsupported

Unsupported

Unsupported

Supported

Unsupported

Unsupported

oidc_token_file_path: o caminho para o arquivo de token OIDC.

Unsupported

Unsupported

Unsupported

Unsupported

Supported

Unsupported

Unsupported

external_id: o ID externo da função, usado principalmente para evitar o problema de "confused deputy". Para mais informações, consulte Prevent the confused deputy problem with external IDs.

Unsupported

Unsupported

-

Unsupported

Unsupported

Unsupported

Unsupported

credentials_uri: a URI das credenciais.

Unsupported

Unsupported

Unsupported

Unsupported

Unsupported

Supported

Unsupported

sts_endpoint: o endpoint do STS. Endpoints de VPC e endpoints de Internet são compatíveis. Para valores válidos, consulte STS endpoints. Valor padrão: sts.aliyuncs.com.

Unsupported

Unsupported

-

Unsupported

-

Unsupported

Unsupported

timeout: o período de tempo limite de leitura para solicitações HTTP. Valor padrão: 5000. Unidade: milissegundos.

Unsupported

Unsupported

-

-

-

-

Unsupported

connect_timeout: o período de tempo limite de conexão para solicitações HTTP. Valor padrão: 10000. Unidade: milissegundos.

Unsupported

Unsupported

-

-

-

-

Unsupported

Uso da ferramenta Credentials

A seção anterior descreveu os tipos de credencial e os parâmetros de configuração compatíveis com a ferramenta Credentials. As seções a seguir apresentam exemplos de código sobre como usar a ferramenta. Selecione o método mais adequado ao seu cenário.

Importante
  • Codificar um AccessKey diretamente no projeto gera riscos de segurança. Permissões de repositório mal gerenciadas podem expor todos os recursos da sua conta. Armazene o AccessKey em variáveis de ambiente ou arquivos de configuração.

  • Adote o padrão singleton com a ferramenta Credentials. Esse padrão permite que o cache interno de credenciais da ferramenta evite limitações de taxa devido a chamadas frequentes de API e previna desperdício de recursos causado pela criação de múltiplas instâncias. Para mais informações, consulte Automatic refresh of session credentials.

Método 1: Cadeia de credenciais padrão

Nota

Este é o método padrão usado nos códigos de exemplo no Portal OpenAPI.

Ao usar a ferramenta Credentials sem passar nenhum parâmetro de configuração, ela obtém as credenciais da default credential chain. Antes de usar este método, certifique-se de que o ambiente de execução da sua aplicação esteja configurado com uma das fontes de credencial compatíveis com a 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

A ferramenta Credentials usa o AccessKey fornecido por você como credencial de acesso.

Aviso

Uma conta Alibaba Cloud (conta raiz) possui permissões totais sobre todos os seus recursos; portanto, um AK exposto representa um risco significativo de segurança. Não use o AK de uma conta raiz.

Use o AK de um usuário RAM com permissões de privilégio mínimo.

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 STS

A ferramenta Credentials usa o STS token estático fornecido por você como credencial de acesso.

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 e ARN de função RAM

A ferramenta Credentials usa o par de AccessKey e o ARN da função RAM fornecidos para chamar a operação AssumeRole e obter um token STS. Em seguida, a ferramenta usa esse token STS como credencial de acesso. Credenciais obtidas dessa forma oferecem suporte à atualização automática. Para mais informações, 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: Função RAM de instância ECS

Se sua aplicação for executada em uma instância Elastic Compute Service (ECS) ou Elastic Container Instance (ECI) com uma função RAM anexada, a ferramenta Credentials poderá obter o token STS dessa função a partir dos metadados da instância e usá-lo como credencial de acesso. Credenciais obtidas dessa forma oferecem suporte à atualização automática. Para mais informações, consulte Automatic refresh mechanism of session credentials.

Por padrão, a ferramenta Credentials usa o modo de segurança reforçada (IMDSv2) para acessar os metadados da instância ECS. Caso ocorra um erro nesse modo, use o parâmetro disable_imds_v1 ou a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar como a ferramenta lida com o erro:

  • Se o valor for False (padrão), a ferramenta Credentials tenta alternar para o modo normal (IMDSv1) para continuar obtendo credenciais.

  • Se o valor for True, a ferramenta Credentials obtém credenciais apenas no modo de segurança reforçada. Se o acesso falhar nesse modo, uma exceção será lançada. A compatibilidade da instância com o modo de segurança reforçada depende da configuração dela.

Você também pode definir a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true para impedir que a ferramenta Credentials obtenha credenciais dos metadados da instância.

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 função OIDC

Se você usa o protocolo de autenticação OIDC e já created a RAM role for an OIDC identity provider, pode passar o ARN do provedor de identidade OIDC, o token OIDC e o ARN da função RAM para a ferramenta Credentials. A ferramenta chama automaticamente a operação AssumeRoleWithOIDC do STS para obter o token STS da função RAM e o usa como credencial de acesso. Credenciais obtidas dessa forma oferecem suporte à atualização automática. Para mais informações, consulte Automatic refresh mechanism of session credentials.

Por exemplo, se sua aplicação for executada em um cluster Container Service for Kubernetes (ACK) com RRSA habilitado, a ferramenta Credentials lê a configuração OIDC das variáveis de ambiente do pod e chama a operação AssumeRoleWithOIDC para obter o token STS da função de serviço. Sua aplicação então usa esse token STS para acessar os serviços da 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: Credenciais via URI

É possível encapsular o service STS e expor uma URI para que serviços externos obtenham um token STS por meio dela. Essa abordagem reduz o risco de expor informações sensíveis, como um par de AccessKey. A ferramenta Credentials acessa a URI fornecida para obter um token STS e o usa como credencial de acesso. Credenciais obtidas dessa forma oferecem suporte à atualização automática. Para mais informações, consulte Automatic refresh mechanism of session credentials.

A URI deve atender às seguintes condições:

  • Compatibilidade com solicitações GET.

  • Código de status de resposta 200.

  • Corpo da resposta com a seguinte estrutura:

{
  "Code": "Success",
  "AccessKeySecret": "yourAccessKeySecret",
  "AccessKeyId": "STS.****************",
  "Expiration": "2021-09-26T03:46:38Z",
  "SecurityToken": "yourSecurityToken"
}

O exemplo a seguir mostra como obter credenciais a partir de uma 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 Bearer

Atualmente, apenas o Alibaba Cloud Call Center (CCC) oferece suporte à autenticação via token 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.

Cadeia de provedores de credenciais padrão

A cadeia de provedores de credenciais padrão é um mecanismo de fallback que busca uma credencial verificando uma sequência predefinida de locais. A pesquisa continua até que uma credencial seja encontrada. Se nenhuma credencial for localizada após a verificação de todos os locais, uma CredentialException será lançada. A ordem de pesquisa é a seguinte:

1. Obter as informações de credencial de variáveis de ambiente

Caso nenhuma credencial seja encontrada nas propriedades do sistema, a cadeia de provedores verifica as variáveis de ambiente.

  • Se ALIBABA_CLOUD_ACCESS_KEY_ID e ALIBABA_CLOUD_ACCESS_KEY_SECRET estiverem presentes e não vazias, a cadeia de provedores as usa como credencial padrão.

  • Se ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET e ALIBABA_CLOUD_SECURITY_TOKEN também estiverem definidas, a cadeia de provedores usa um token STS como credencial padrão.

2. Obter as informações de credencial usando a função RAM de um provedor de identidade OIDC

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica as seguintes variáveis de ambiente relacionadas a uma função RAM OIDC:

  • ALIBABA_CLOUD_ROLE_ARN: O ARN da função RAM.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: O ARN do provedor OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: O caminho do arquivo de token OIDC.

Se todas as três variáveis de ambiente estiverem presentes e não vazias, a cadeia de provedores usa esses valores para chamar a API AssumeRoleWithOIDC do Security Token Service (STS) e obter um token STS.

3. Obter as informações de credencial de um arquivo de configuração

Este recurso requer alibabacloud_credentials 1.0rc3 ou posterior.

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta carregar o arquivo de credenciais compartilhadas, config.json, de seu local padrão e usa a credencial especificada no arquivo.

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

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

Para configurar uma credencial dessa maneira, use o Alibaba Cloud CLI ou crie manualmente um arquivo config.json no caminho apropriado. O exemplo a seguir mostra o formato do conteúdo:

{
  "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

Descrição

current

Especifique o nome da credencial para recuperar a configuração correspondente. O nome da credencial é o valor do parâmetro name em profiles. Por padrão, o sistema prioriza o nome da credencial especificado pela variável de ambiente ALIBABA_CLOUD_PROFILE. Se essa variável não estiver configurada, o sistema usa o nome da credencial especificado por current.

profiles

Contém uma coleção de configurações de credencial. O parâmetro mode especifica o tipo de credencial:

  • AK: Usa o AccessKey de um usuário RAM como credencial.

  • StsToken: Usa um token STS como credencial.

  • RamRoleArn: Assume uma função RAM usando as credenciais de um usuário RAM para obter uma credencial temporária.

  • EcsRamRole: Obtém uma credencial dos metadados da instância.

  • OIDC: Obtém uma credencial usando um ARN de provedor OIDC, um token OIDC e um ARN de função RAM.

  • ChainableRamRoleArn: Usa encadeamento de funções para obter uma nova credencial, usando uma credencial inicial de profiles especificada pelo parâmetro source_profile.

4. Obter as informações de credencial usando a função RAM de uma instância ECS

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores tenta recuperar um token STS da função RAM da instância a partir dos metadados da instância. Esse token é então usado como credencial padrão. Para isso, a cadeia primeiro recupera o nome da função RAM atribuída à instância e depois usa essa função para obter o token STS correspondente. Para reduzir o tempo de recuperação de credenciais e melhorar a eficiência, especifique o nome da função RAM diretamente usando a variável de ambiente ALIBABA_CLOUD_ECS_METADATA.

Por padrão, a cadeia de provedores acessa os metadados da instância no modo de segurança reforçada (IMDSv2). Se ocorrer uma exceção nesse modo, use a variável de ambiente ALIBABA_CLOUD_IMDSV1_DISABLED para controlar o comportamento de fallback:

  • Quando o valor é false (padrão), o sistema tenta alternar para o modo legado para recuperar a credencial.

  • Quando o valor é true, o modo de segurança reforçada é imposto. Se o acesso falhar nesse modo, uma exceção será lançada.

Além disso, é possível impedir que a cadeia de provedores acesse os metadados da instância para obter credenciais definindo a variável de ambiente ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

5. Obter as informações de credencial com base em uma URI

Se nenhuma credencial tiver sido encontrada, a cadeia de provedores verifica a variável de ambiente ALIBABA_CLOUD_CREDENTIALS_URI. Se essa variável estiver definida e apontar para uma URI válida, a cadeia acessa a URI para recuperar um token STS.

Mecanismo de atualização automática de credenciais de sessão

Tipos de credencial de sessão, como ram_role_arn, ecs_ram_role, oidc_role_arn e credentials_uri, oferecem suporte à atualização automática por meio de um mecanismo integrado ao provedor de credenciais. Quando um cliente de credencial recupera uma credencial pela primeira vez, o provedor a armazena em cache. Nas operações subsequentes, a mesma instância do cliente recupera automaticamente a credencial desse cache. Se a credencial em cache tiver expirado, a instância do cliente busca uma nova e atualiza o cache adequadamente.

Nota

Para credenciais ecs_ram_role, o provedor de credenciais as atualiza proativamente 15 minutos antes da expiração.

O exemplo a seguir usa o padrão singleton para criar um cliente de credencial. Ele demonstra o mecanismo de atualização buscando uma credencial em intervalos de tempo diferentes e chamando uma operação OpenAPI para verificar se a credencial está utilizável.

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álise baseada na saída do log:

  • Na primeira chamada, o cache está vazio. O sistema recupera uma credencial com base na sua configuração e a armazena no cache.

  • A segunda chamada usa a mesma credencial da primeira, indicando que ela foi recuperada do cache.

  • Na terceira chamada, a credencial em cache expirou. Seu tempo de expiração (RoleSessionExpiration) é de 3.600 segundos, mas esta chamada ocorre 4.200 segundos após a primeira. Consequentemente, o mecanismo de atualização automática do SDK busca uma nova credencial e atualiza o cache.

  • A quarta chamada usa a mesma credencial da terceira, confirmando que o cache foi atualizado.

Documentos relacionados