Tous les produits
Search
Centre de documentation

Alibaba Cloud SDK:Gérer les identifiants d'accès

Dernière mise à jour :Aug 11, 2026

Le SDK Alibaba Cloud utilise l'outil Credentials pour gérer centralisément les identifiants, tels que votre AccessKey et votre STS Token. Cette rubrique décrit les types d'identifiants pris en charge et leurs méthodes de configuration.

Contexte

Un identifiant est un ensemble d'informations permettant de vérifier l'identité d'un utilisateur. Pour se connecter à un système, l'utilisateur doit fournir des identifiants valides. Les types d'identifiants courants sont les suivants :

  1. L'AccessKey est un identifiant à long terme associé à un compte Alibaba Cloud ou à un utilisateur RAM. Il s'agit d'une paire de clés composée d'un AccessKey ID et d'un AccessKey secret.

  2. Le STS token est un identifiant d'accès temporaire attribué à un rôle RAM. Il inclut une période de validité configurable et des autorisations d'accès spécifiques. Pour plus d'informations, consultez Qu'est-ce que STS.

  3. Le bearer token est un identifiant utilisé pour l'authentification et l'autorisation.

Prérequis

Installer Alibaba Cloud Credentials

Si Alibaba Cloud Credentials est déjà installé, ignorez cette étape. Nous vous recommandons d'utiliser la dernière dépendance d'Alibaba Cloud Credentials afin de garantir la prise en charge complète de tous les types d'identifiants. Pour obtenir la liste de toutes les versions publiées, consultez Alibaba Cloud Credentials.

Installez Alibaba Cloud Credentials selon l'une des méthodes suivantes :

  • Méthode 1 : Utilisez go get pour installer Alibaba Cloud Credentials :

    $ go get -u github.com/aliyun/credentials-go
  • Méthode 2 : Si vous utilisez dep pour gérer les dépendances, exécutez la commande suivante :

    dep ensure -add github.com/aliyun/credentials-go

Outil Credentials : Paramètres

La structure Config du package github.com/aliyun/credentials-go/credentials définit les paramètres de configuration de l'outil Credentials. Utilisez le paramètre obligatoire type pour spécifier le type d'identifiant, puis configurez les paramètres correspondants. Le tableau suivant répertorie les valeurs valides pour le paramètre type ainsi que les paramètres pris en charge par chaque type d'identifiant. Dans ce tableau, √ indique un paramètre obligatoire, - indique un paramètre facultatif, et × signifie que le paramètre n'est pas pris en charge.

Remarque

Évitez d'utiliser des types d'identifiants ou des paramètres non répertoriés dans le tableau ci-dessous.

Type

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

AccessKeyId : L'AccessKey ID.

√

√

√

×

×

×

×

AccessKeySecret : L'AccessKey secret.

√

√

√

×

×

×

×

SecurityToken : Le STS token.

×

√

-

×

×

×

×

RoleArn : L'Alibaba Cloud Resource Name (ARN) du rôle RAM.

×

×

√

×

√

×

×

RoleSessionName : Le nom de session personnalisé. Le format par défaut est credentials-go-<timestamp>.

×

×

-

×

-

×

×

RoleName : Le nom du rôle RAM.

×

×

×

-

×

×

×

DisableIMDSv1 : Définissez sur true pour activer le mode de renforcement de la sécurité. La valeur par défaut est false.

×

×

×

-

×

×

×

BearerToken : Le bearer token.

×

×

×

×

×

×

√

Policy : La politique personnalisée.

×

×

-

×

-

×

×

RoleSessionExpiration : La durée d'expiration de la session, en secondes. La valeur par défaut est 3 600.

×

×

-

×

-

×

×

OIDCProviderArn : L'Alibaba Cloud Resource Name (ARN) du fournisseur d'identité OpenID Connect (OIDC) (IdP).

×

×

×

×

√

×

×

OIDCTokenFilePath : Le chemin vers le fichier de jeton OIDC.

×

×

×

×

√

×

×

ExternalId : L'ID externe du rôle. Cet ID permet d'éviter le problème du « confused deputy ». Pour plus d'informations, consultez Utiliser ExternalId pour éviter le problème du confused deputy.

×

×

-

×

×

×

×

Url : L'URI de l'identifiant. Cette valeur est définie via la méthode SetURLCredential(v string).

×

×

×

×

×

√

×

STSEndpoint : L'endpoint STS. Ce paramètre prend en charge les endpoints VPC et publics. Pour la liste des valeurs valides, consultez Endpoints. La valeur par défaut est sts.aliyuncs.com.

×

×

-

×

-

×

×

Timeout : Le délai d'attente de lecture HTTP, en millisecondes. La valeur par défaut est 5 000.

×

×

-

-

-

-

×

ConnectTimeout : Le délai d'attente de connexion HTTP, en millisecondes. La valeur par défaut est 10 000.

×

×

-

-

-

-

×

Initialiser un client d'identifiants

La section précédente décrit les types d'identifiants et les paramètres de configuration pris en charge par l'outil Credentials. Les sections suivantes fournissent des exemples de code illustrant l'utilisation de cet outil. Sélectionnez la méthode la plus adaptée à votre scénario.

Important
  • Coder en dur un AccessKey dans votre projet engendre des risques de sécurité. Une gestion inadéquate des autorisations du dépôt peut exposer toutes les ressources de votre compte. Il est recommandé de stocker l'AccessKey dans des variables d'environnement ou des fichiers de configuration.

  • Adoptez le modèle singleton avec l'outil Credentials. Ce modèle active la mise en cache intégrée des identifiants, évitant ainsi la limitation de débit due à des appels API fréquents et prévenant le gaspillage de ressources lié à la création de multiples instances. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.

Méthode 1 : Utilisation de la chaîne de fournisseurs d'identifiants par défaut

Si vous initialisez le client Credentials sans paramètres, celui-ci utilise la chaîne de fournisseurs d'identifiants par défaut. Pour comprendre comment les identifiants par défaut sont chargés, consultez Chaîne de fournisseurs d'identifiants par défaut.

package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Pass nil to use the default credential provider chain.
	credential, err := credentials.NewCredential(nil)
	config := &openapi.Config{}
        config.Credential = credential
        // The code to initialize a cloud product client is omitted. See the API call example for details.
}

Exemple d'appel API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Pour exécuter cet exemple, installez le SDK ECS pour Go.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Create a credential from the default provider chain.
	credentialClient, _err := credentials.NewCredential(nil)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Set the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Set the credential.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize runtime options.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation and get the response.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 2 : AccessKey

L'outil Credentials utilise l'AccessKey que vous fournissez comme identifiant d'accès.

Avertissement

Un compte Alibaba Cloud (compte racine) dispose d'autorisations complètes sur toutes ses ressources ; par conséquent, un AK exposé représente un risque de sécurité majeur. N'utilisez pas l'AK d'un compte racine.

Privilégiez l'AK d'un utilisateur RAM doté d'autorisations minimales (principe du moindre privilège).

package main
import (
	"os"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("access_key").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	akCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = akCredential
	// Code to initialize a cloud product client is omitted. See the API call example for details.
}

Exemple d'API

Cet exemple illustre l'appel de l'opération DescribeRegions d'ECS. Pour l'exécuter, vous devez d'abord installer le SDK ECS.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)
func main() {
	// Initialize the credential client with an AccessKey pair.
	credentialsConfig := new(credentials.Config).
		// The credential type.
		SetType("access_key").
		// Set your AccessKey ID.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Set your AccessKey secret.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Configure the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Configure the credential.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize a DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize runtime options.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 3 : STS token

L'outil Credentials utilise le STS token statique que vous fournissez comme identifiant d'accès.

package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("sts").
		// Get the AccessKey ID from the environment variable.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Get the AccessKey secret from the environment variable.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// Get the security token from the environment variable.
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
	stsCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = stsCredential
        // The initialization code for the cloud product client is omitted. For details, see the API call examples.
}

Appel API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Pour l'exécuter, installez le SDK ECS ainsi que le SDK STS.

package main
import (
	"os"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	sts20150401 "github.com/alibabacloud-go/sts-20150401/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Create an STS client and call the AssumeRole operation to obtain an STS token.
	stsConfig := &openapi.Config{}
	stsConfig.SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"))
	stsConfig.SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	stsConfig.SetEndpoint("sts.cn-hangzhou.aliyuncs.com")
	client, _err := sts20150401.NewClient(stsConfig)
	if _err != nil {
		panic(_err)
	}
	assumeRoleRequest := &sts20150401.AssumeRoleRequest{}
	// The ARN of the RAM role to assume. Example: acs:ram::123456789012****:role/adminrole. You can set RoleArn by using the ALIBABA_CLOUD_ROLE_ARN environment variable.
	assumeRoleRequest.SetRoleArn("<RoleArn>")
	// The role session name. You can set RoleSessionName by using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
	assumeRoleRequest.SetRoleSessionName("<RoleSessionName>")
	assumeRoleRequest.SetDurationSeconds(3600)
	result, _err := client.AssumeRole(assumeRoleRequest)
	if _err != nil {
		panic(_err)
	}
	assumeRoleResponseBodyCredentials := result.Body.Credentials
	// Use an STS token to initialize the Credentials client.
	credentialsConfig := new(credentials.Config).
		// Specify the credential type.
		SetType("sts").
		SetAccessKeyId(*assumeRoleResponseBodyCredentials.AccessKeyId).
		SetAccessKeySecret(*assumeRoleResponseBodyCredentials.AccessKeySecret).
		SetSecurityToken(*assumeRoleResponseBodyCredentials.SecurityToken)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Configure the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
	// Configure the credential.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize runtime options.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation and retrieve the response.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 4 : AK et RamRoleArn

Cette méthode utilise un STS token en interne. En spécifiant l'ARN (Alibaba Cloud Resource Name) d'un rôle RAM, l'outil Credentials obtient un STS token auprès du service STS. Vous pouvez également utiliser SetPolicy pour restreindre le rôle RAM à un ensemble d'autorisations plus limité.

package main
import (
	"fmt"
	"os"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("ram_role_arn").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// Specifies the ARN of the RAM role to assume, such as `acs:ram::123456789012****:role/adminrole`. You can also set this with the `ALIBABA_CLOUD_ROLE_ARN` environment variable.
		SetRoleArn("<RoleArn>").
		// A custom name for the role session. You can also set this with the `ALIBABA_CLOUD_ROLE_SESSION_NAME` environment variable.
		SetRoleSessionName("<RoleSessionName>").
		// Optional. An inline policy that further restricts the permissions of the temporary credentials. For example, `{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}`
		SetPolicy("<Policy>").
		// Optional. The session expiration time in seconds.
		SetRoleSessionExpiration(3600).
		// Optional. The external ID used to prevent the confused deputy problem.
		SetExternalId("ExternalId").
		// Optional. The STS endpoint. The default is sts.aliyuncs.com. For better network performance, use a region-specific endpoint closer to your application.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	arnCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = arnCredential
        // This example omits the client initialization code. For more information, see the API call example.
}
Remarque

Pour en savoir plus sur l'ID externe, consultez Éviter le problème du confused deputy avec les ID externes.

Exemple d'API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Pour l'exécuter, installez le SDK ECS.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)
func main() {
	// Initialize the credential configuration with a RAM role ARN.
	credentialsConfig := new(credentials.Config).
		// The credential type.
		SetType("ram_role_arn").
		// The AccessKey ID.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// The AccessKey Secret.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// The ARN of the RAM role to assume. This can be set with the ALIBABA_CLOUD_ROLE_ARN environment variable. Example: acs:ram::123456789012****:role/adminrole.
		SetRoleArn("<RoleArn>").
		// A custom name for the role session. This can be set with the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
		SetRoleSessionName("<RoleSessionName>").
		// Optional. An inline policy to further restrict permissions. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Optional. The session expiration time in seconds.
		SetRoleSessionExpiration(3600).
		// Optional. The STS endpoint. The default is sts.aliyuncs.com. For better network performance, use a region-specific endpoint closer to your application.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Configure the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Assign the created credential to the ECS configuration.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize runtime options.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation and retrieve the response.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 5 : Rôle RAM d'instance ECS

Vous pouvez attacher un rôle RAM d'instance aux instances ECS et ECI. Les applications s'exécutant sur ces instances peuvent alors utiliser l'outil Credentials pour obtenir automatiquement un STS token et initialiser le client d'identifiants.

Par défaut, l'outil Credentials accède au serveur de métadonnées ECS en mode de renforcement de la sécurité (IMDSv2). En cas d'erreur, l'outil bascule automatiquement en mode normal pour obtenir l'identifiant d'accès. Vous pouvez contrôler ce comportement de basculement en définissant le paramètre disableIMDSv1 ou la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLE :

  • Si la valeur est false (par défaut), l'outil bascule en mode normal.

  • Si la valeur est true, l'outil utilise exclusivement le mode de renforcement de la sécurité et lève une exception en cas d'échec.

La prise en charge d'IMDSv2 dépend de la configuration du serveur.

De plus, vous pouvez désactiver l'accès aux identifiants via les métadonnées d'instance ECS en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Remarque
package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func _main(args []*string) {
	// Initialize a credentials client using an ECS RAM role.
	credentialsConfig := new(credentials.Config).
		// The credential type.
		SetType("ecs_ram_role").
		// Optional. The name of the ECS RAM role. If left empty, the name is automatically retrieved. Set this parameter to reduce API calls. You can also set it using the ALIBABA_CLOUD_ECS_METADATA environment variable.
		SetRoleName("<RoleName>")
	// Optional, defaults to false. A value of `true` enforces security hardening mode (IMDSv2). When set to `false`, the SDK first attempts to retrieve credentials in security hardening mode and falls back to normal mode (IMDSv1) if the attempt fails.
	// credentialsConfig.SetDisableIMDSv1(true)
	credentialClient, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = credentialClient
        // The code to initialize a cloud product client with this config object is omitted. For details, see the API call example.
}

Exemple d'appel API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Vous devez installer le SDK ECS avant d'exécuter l'exemple.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Initialize the Credentials client by using an ECS RAM role.
	credentialsConfig := new(credentials.Config).
		// Specifies the credential type.
		SetType("ecs_ram_role").
		// Optional. The role name. If omitted, the name is automatically retrieved. Specifying this parameter is recommended to reduce requests. You can also set the role name by using the ALIBABA_CLOUD_ECS_METADATA environment variable.
		SetRoleName("<RoleName>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Sets the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Sets the client credential.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize the runtime configuration.
	runtime := &util.RuntimeOptions{}
	// Calls the DescribeRegions operation and retrieves the response.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 6 : Utilisation d'OIDCRoleArn

Si vous utilisez OIDC pour l'authentification et que vous avez créé un rôle RAM pour un fournisseur d'identité OIDC, vous pouvez fournir l'ARN du fournisseur OIDC, le chemin du fichier de jeton OIDC et l'ARN du rôle RAM à l'outil Credentials. L'outil appelle alors automatiquement l'API AssumeRoleWithOIDC pour obtenir un STS token pour le rôle RAM, qui sert ensuite d'identifiant d'accès. Les identifiants obtenus ainsi prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session. Par exemple, si votre application s'exécute dans un cluster Container Service for Kubernetes (ACK) avec RRSA activé, l'outil Credentials peut lire la configuration OIDC depuis les variables d'environnement du pod et appeler l'API AssumeRoleWithOIDC pour obtenir un STS token. Vous pouvez ensuite utiliser ce STS token pour accéder aux services Alibaba Cloud.

package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.comcom/aliyun/credentials-go/credentials"
	"os"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("oidc_role_arn").
		// The OIDC provider ARN. You can set this using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// The OIDC token file path. You can set this using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// The RAM role ARN. You can set this using the ALIBABA_CLOUD_ROLE_ARN environment variable.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// The role session name. You can set this using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Optional. Specifies an inline policy to further restrict permissions. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Optional. Specifies the session expiration in seconds.
		SetRoleSessionExpiration(3600).
		// Optional. The STS endpoint. The default is sts.aliyuncs.com. For improved network connectivity, use a region-specific endpoint.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	oidcCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = oidcCredential
	// Code for initializing a cloud product client with the config object is omitted. For more information, see the API call example.
}

Exemple d'API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Pour exécuter ce code, vous devez installer le SDK ECS pour Go.

package main
import (
	"os"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Initialize the Credentials client by using an OIDC Role ARN.
	credentialsConfig := new(credentials.Config).
		// The credential type.
		SetType("oidc_role_arn").
		// The ARN of the OIDC identity provider. Set this using the ALIBABA_CLOUD_OIDC_PROVIDER_ARN environment variable.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// The file path of the OIDC token. Set this using the ALIBABA_CLOUD_OIDC_TOKEN_FILE environment variable.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// The ARN of the RAM role. Set this using the ALIBABA_CLOUD_ROLE_ARN environment variable.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// The role session name. Set this using the ALIBABA_CLOUD_ROLE_SESSION_NAME environment variable.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Optional. An inline policy that further restricts permissions. Example: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// The session duration in seconds.
		SetRoleSessionExpiration(3600)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Configure the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Assign the credential to the client configuration.
	ecsConfig.Credential = credentialClient
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize the runtime configuration.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 7 : Utilisation d'un identifiant URI

Vous pouvez encapsuler le Security Token Service (STS) derrière une URI de service, permettant ainsi à des services externes d'obtenir un STS token sans exposer d'informations sensibles comme les AK. L'outil Credentials peut ensuite utiliser cette URI pour récupérer un STS token servant d'identifiant d'accès. Les identifiants obtenus ainsi prennent en charge l'actualisation automatique. Pour plus d'informations, consultez Actualisation automatique des identifiants de session.

package main
import (
	"github.com/aliyun/credentials-go/credentials"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("credentials_uri").
                // The credential URI. Format: http://local_or_remote_uri/. You can also set this by using the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
		SetURLCredential("<CredentialsUri>")
	uriCredential, err := credentials.NewCredential(credentialsConfig)
	config := &openapi.Config{}
	config.Credential = uriCredential
	// The client initialization code for the cloud product is omitted for brevity. For more information, see the API call example.
}

L'URI doit respecter les conditions suivantes :

  • Prendre en charge les requêtes GET.

  • Le corps de la réponse doit avoir la structure suivante :

    {
      "AccessKeySecret": "AccessKeySecret",
      "AccessKeyId": "AccessKeyId",
      "Expiration": "2021-09-26T03:46:38Z",
      "SecurityToken": "SecurityToken"
    }

Exemple d'API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. L'exécution de cet exemple nécessite le SDK ECS pour Go.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)
func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
		// The credential URI, for example, http://local_or_remote_uri/. Alternatively, set the ALIBABA_CLOUD_CREDENTIALS_URI environment variable.
		SetURLCredential("<CredentialsUri>")
	uriCredential, _err := credentials.NewCredential(config)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Configure the service endpoint.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Configure the credential.
	ecsConfig.Credential = uriCredential
	// Initialize the ECS client.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Initialize the DescribeRegions request.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Initialize the runtime configuration.
	runtime := &util.RuntimeOptions{}
	// Call the DescribeRegions operation.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Méthode 8 : Utilisation d'un bearer token

Seul Cloud Call Center (CCC) prend en charge l'initialisation des identifiants avec un bearer token.

package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	credentialsConfig := new(credentials.Config).
		SetType("bearer").
		// Enter your bearer token.
		SetBearerToken("<BearerToken>")
	bearerCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = bearerCredential
	// This example omits the client initialization code. See the API call example for the complete implementation.
}

Exemple d'API

Cet exemple montre comment appeler l'opération GetInstance de Cloud Call Center. Pour l'exécuter, installez d'abord le SDK CCC.

package main
import (
	ccc20200701 "github.com/alibabacloud-go/ccc-20200701/v2/client"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	credentials "github.com/aliyun/credentials-go/credentials"
)
func _main() (_err error) {
	// Initialize the credential client by using a bearer token.
	credentialsConfig := new(credentials.Config).
		// Specify the credential type.
		SetType("bearer").
		SetBearerToken("<BearerToken>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		return _err
	}
	// Initialize the CCC client with the credential client.
	config := &openapi.Config{}
	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // Specify the service endpoint.
	config.Credential = credentialClient                         // Configure the credential.
	cccClient, _err := ccc20200701.NewClient(config)
	if _err != nil {
		return _err
	}
	getInstanceRequest := &ccc20200701.GetInstanceRequest{
		InstanceId: tea.String("ccc-test"),
	}
	runtime := &util.RuntimeOptions{}
	response, _err := cccClient.GetInstanceWithOptions(getInstanceRequest, runtime)
	if _err != nil {
		return _err
	}
	panic(response.Body.String())
}
func main() {
	err := _main()
	if err != nil {
		panic(err)
	}
}

Méthode 9 : Utilisation de CLIProfileCredentialsProvider

Récupère les identifiants d'accès depuis le fichier de configuration des identifiants de l'CLI Alibaba Cloud, config.json.

package main
import (
	"github.com/aliyun/credentials-go/credentials"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials/providers"
)
func main() {
	// CLIProfileCredentialsProvider
	provider, err := providers.NewCLIProfileCredentialsProviderBuilder().
	        // Optional. Specifies the profile name. The resolution precedence is: explicit profileName > ALIBABA_CLOUD_CONFIG_FILE environment variable > 'current' profile in config.json.
		WithProfileName("<PROFILE_NAME>"). 
		// Optional. Specifies the path to the configuration file (which must be a .json file). The resolution precedence is: the specified profileFile > the ALIBABA_CLOUD_CONFIG_FILE environment variable > the default path ~/.aliyun/config.json.
		WithProfileFile("<PROFILE_FILE_PATH>"). 
		Build()
	if err != nil {
		return
	}
	credential := credentials.FromCredentialsProvider("cli_profile", provider)
	config := &openapi.Config{}
	config.Credential = credential
	// The code for initializing a cloud product client with the config object is omitted for brevity.
}

Vous pouvez configurer les identifiants via la CLI Alibaba Cloud, ou créer manuellement le fichier de configuration config.json au chemin suivant :

  • Linux : ~/.aliyun/config.json

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

Le contenu du fichier doit respecter le format suivant :

{
  "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
    },
    {
      "name": "<PROFILE_NAME6>",
      "mode": "CloudSSO",
      "cloud_sso_sign_in_url": "https://******/login",
      "access_token": "eyJraWQiOiJiYzViMzUwYy******",
      "cloud_sso_access_token_expire": 1754316142,
      "cloud_sso_access_config": "ac-00s1******",
      "cloud_sso_account_id": "151266******"
    }
  ]
}

Dans le fichier config.json, utilisez le paramètre mode pour spécifier le type d'identifiant :

  • AK : Utilise une Access Key.

  • StsToken : Utilise un STS token.

  • RamRoleArn : Endosse un rôle RAM via son ARN pour obtenir l'identifiant.

  • EcsRamRole : Endosse le rôle RAM attaché à une instance ECS pour obtenir l'identifiant.

  • OIDC : Utilise un ARN de fournisseur OIDC et un jeton OIDC pour obtenir l'identifiant.

  • ChainableRamRoleArn : Utilise une chaîne de rôles, où source_profile spécifie le nom d'autres identifiants dans le fichier de configuration config.json afin de récupérer de nouveaux identifiants.

  • CloudSSO : Utilise l'identifiant obtenu par un utilisateur Cloud SSO via la CLI Alibaba Cloud.

    Remarque

    Les identifiants CloudSSO nécessitent la version 1.4.7 ou ultérieure de github.com/aliyun/credentials-go, et la configuration ne peut être obtenue que via la CLI Alibaba Cloud. Pour plus d'informations, consultez Utiliser la CLI pour se connecter à CloudSSO et accéder aux ressources Alibaba Cloud.

Une fois la configuration terminée, le fournisseur initialise un identifiant basé sur le nom de profil spécifié.

Exemple d'appel API

Cet exemple montre comment appeler l'opération DescribeRegions d'ECS. Pour l'exécuter, vous devez d'abord installer le SDK ECS.

package main
import (
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
	"github.com/aliyun/credentials-go/credentials/providers"
)
func main() {
	// CLIProfileCredentialsProvider
	provider, err := providers.NewCLIProfileCredentialsProviderBuilder().
		WithProfileName("SSOProfile"). // Optional. Defaults to 'current' in config.json.
		// WithProfileFile("/path/to/config.json"). // Optional. Defaults to ~/.aliyun/config.json.
		Build()
	if err != nil {
		return
	}
	credentialClient := credentials.FromCredentialsProvider("cli_profile", provider)
	// Use the credential to initialize the ECS client.
	ecsConfig := &openapi.Config{}
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	ecsConfig.Credential = credentialClient
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	runtime := &util.RuntimeOptions{}
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Chaîne de fournisseurs d'identifiants par défaut

Lorsque les environnements de développement et de production nécessitent différents types d'identifiants, il est courant d'écrire du code conditionnel pour récupérer les identifiants selon l'environnement actuel. La chaîne de fournisseurs d'identifiants par défaut simplifie ce processus, vous permettant d'utiliser une base de code unique et de contrôler la récupération des identifiants via une configuration externe. Lorsque vous initialisez un client d'identifiants en appelant NewCredential() sans aucun paramètre, le SDK Alibaba Cloud recherche les identifiants dans l'ordre suivant.

1. Variables d'environnement

Si aucun identifiant n'est trouvé dans les propriétés système, la chaîne de fournisseurs vérifie ensuite les variables d'environnement.

  • Si ALIBABA_CLOUD_ACCESS_KEY_ID et ALIBABA_CLOUD_ACCESS_KEY_SECRET sont présents et non vides, la chaîne de fournisseurs les utilise comme identifiant par défaut.

  • Si ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET et ALIBABA_CLOUD_SECURITY_TOKEN sont également définis, la chaîne de fournisseurs utilise un STS token comme identifiant par défaut.

2. Rôle RAM OIDC

Si aucun identifiant n'a été trouvé, la chaîne de fournisseurs vérifie les variables d'environnement suivantes liées à un rôle RAM OIDC :

  • ALIBABA_CLOUD_ROLE_ARN : L'ARN du rôle RAM.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN : L'ARN du fournisseur OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE : Le chemin du fichier de jeton OIDC.

Si ces trois variables d'environnement sont présentes et non vides, la chaîne de fournisseurs utilise ces valeurs pour appeler l'API AssumeRoleWithOIDC du Security Token Service (STS) afin d'obtenir un STS token.

3. Fichier config.json

Si aucun identifiant de priorité supérieure n'est trouvé, l'outil Credentials charge le fichier config.json. Les chemins par défaut pour ce fichier sont les suivants :

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

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

Remarque

À partir de la version github.com/aliyun/credentials-go@1.4.4, vous pouvez personnaliser le chemin du fichier config.json via la variable d'environnement ALIBABA_CLOUD_CONFIG_FILE. Cette variable d'environnement prévaut sur le chemin par défaut.

Pour configurer les identifiants avec cette méthode, vous pouvez utiliser la CLI Alibaba Cloud ou créer manuellement un fichier config.json au chemin approprié. L'exemple suivant montre le format du fichier :

{
    "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
        },
        {
            "name": "<PROFILE_NAME6>",
            "mode": "CloudSSO",
            "cloud_sso_sign_in_url": "https://******/login",
            "access_token": "eyJraWQiOiJiYzViMzUwYy******",
            "cloud_sso_access_token_expire": 1754316142,
            "cloud_sso_access_config": "ac-00s1******",
            "cloud_sso_account_id": "151266******"
        },
        {
            "name": "<PROFILE_NAME7>",
            "mode": "OAuth",
            "access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
            "access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
            "sts_token": "<SECURITY_TOKEN>",
            "region_id": "<REGION_ID>",
            "output_format": "json",
            "language": "<zh|en>",
            "sts_expiration": "<STS_EXPIRATION>",
            "oauth_access_token": "<OAUTH_ACCESS_TOKEN>",
            "oauth_refresh_token": "<OAUTH_REFRESH_TOKEN>",
            "oauth_access_token_expire": 1754316142,
            "oauth_site_type": "<CN|EN>"
        }
    ]
}

Dans le fichier config.json, vous pouvez utiliser le paramètre mode pour spécifier différents types d'identifiants :

  • AK : Utilise la clé d'accès d'un utilisateur comme identifiant.

  • StsToken : Utilise un STS token comme identifiant.

  • RamRoleArn : Utilise un ARN de rôle RAM pour obtenir les identifiants.

  • EcsRamRole : Utilise le rôle RAM attaché à une instance ECS pour obtenir les identifiants.

  • OIDC : Utilise un ARN de fournisseur OIDC et un jeton OIDC pour obtenir les identifiants.

  • ChainableRamRoleArn : Implémente une chaîne de rôles. Utilisez le paramètre source_profile pour spécifier un autre profil dans le fichier config.json à partir duquel obtenir de nouveaux identifiants.

  • OAuth : Utilise les identifiants obtenus en se connectant via OAuth à l'aide de la CLI Alibaba Cloud.

  • CloudSSO : Utilise les identifiants obtenus par un utilisateur CloudSSO via la CLI Alibaba Cloud.

Remarque

Après la configuration, Credentials initialise le client en utilisant le profil spécifié dans le champ current du fichier de configuration. Vous pouvez également spécifier un profil en définissant la variable d'environnement ALIBABA_CLOUD_PROFILE. Par exemple, définissez la valeur de ALIBABA_CLOUD_PROFILE sur client1.

4. Rôle RAM d'instance ECS

Si aucun identifiant de priorité supérieure n'est trouvé, Credentials les obtient à partir du rôle RAM attaché à une instance ECS. Par défaut, Credentials utilise IMDSv2 pour accéder au service de métadonnées ECS et récupérer un STS token pour le rôle RAM d'instance ECS. Ce processus implique deux requêtes : la première pour obtenir le nom du rôle depuis le service de métadonnées, et la seconde pour récupérer les identifiants. Pour réduire cela à une seule requête, vous pouvez spécifier directement le nom du rôle RAM d'instance en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA. Si une erreur survient lors de l'utilisation d'IMDSv2, Credentials bascule automatiquement vers IMDSv1. Vous pouvez contrôler ce comportement de basculement en définissant la variable d'environnement ALIBABA_CLOUD_IMDSV1_DISABLE :

  1. Lorsque la valeur est false, l'outil bascule vers IMDSv1 pour récupérer les identifiants si la requête IMDSv2 échoue.

  2. Lorsque la valeur est true, l'outil utilise uniquement IMDSv2. Si la requête échoue, une exception est levée.

La prise en charge d'IMDSv2 par le serveur dépend de votre configuration serveur.

Vous pouvez également désactiver l'accès aux identifiants depuis le service de métadonnées ECS en définissant la variable d'environnement ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Remarque

5. URI d'identifiants

Si aucun identifiant n'a été trouvé, la chaîne de fournisseurs vérifie la variable d'environnement ALIBABA_CLOUD_CREDENTIALS_URI. Si cette variable est définie et pointe vers une URI valide, la chaîne accède à l'URI pour récupérer un STS token.

Actualisation automatique des identifiants de session

Les types d'identifiants de session, tels que ram_role_arn, ecs_ram_role, oidc_role_arn et credentials_uri, prennent en charge l'actualisation automatique grâce à un mécanisme intégré au fournisseur d'identifiants. Lorsqu'un client d'identifiants récupère un identifiant pour la première fois, le fournisseur le stocke dans un cache. Lors des opérations suivantes, la même instance de client récupère automatiquement l'identifiant depuis ce cache. Si l'identifiant mis en cache a expiré, l'instance de client en récupère un nouveau et met à jour le cache en conséquence.

Remarque

Pour les identifiants ecs_ram_role, le fournisseur d'identifiants les actualise de manière proactive 15 minutes avant leur expiration.

L'exemple suivant utilise le modèle singleton pour créer un client d'identifiants. Il démontre le mécanisme d'actualisation en récupérant un identifiant à différents intervalles de temps et en appelant une opération OpenAPI pour vérifier que l'identifiant est utilisable.

package main
import (
	"fmt"
	"log"
	"os"
	"sync"
	"time"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	ecs20140526 "github.com/alibabacloud-go/ecs-20140526/v7/client"
	util "github.comcom/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)
// Credential manages the singleton instance of Alibaba Cloud credentials.
type Credential struct {
	instance credentials.Credential
	once     sync.Once
}
var credentialInstance = &Credential{}
func GetCredentialInstance() credentials.Credential {
	credentialInstance.once.Do(func() {
		cfg := &credentials.Config{
			Type:                  tea.String("ram_role_arn"),
			AccessKeyId:           tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
			AccessKeySecret:       tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
			RoleArn:               tea.String(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")),
			RoleSessionName:       tea.String("RamRoleArnTest"),
			RoleSessionExpiration: tea.Int(3600),
		}
		var err error
		credentialInstance.instance, err = credentials.NewCredential(cfg)
		if err != nil {
			log.Fatalf("Credential initialization failed: %v", err)
		}
	})
	return credentialInstance.instance
}
// EcsClient manages the singleton instance of the ECS client.
type EcsClient struct {
	instance *ecs20140526.Client
	once     sync.Once
}
var ecsClientInstance = &EcsClient{}
func GetEcsClientInstance(cred credentials.Credential) *ecs20140526.Client {
	ecsClientInstance.once.Do(func() {
		cfg := &openapi.Config{
			Endpoint:   tea.String("ecs.cn-hangzhou.aliyuncs.com"),
			Credential: cred,
		}
		var err error
		ecsClientInstance.instance, err = ecs20140526.NewClient(cfg)
		if err != nil {
			log.Fatalf("ECS client initialization failed: %v", err)
		}
	})
	return ecsClientInstance.instance
}
// Run the main task.
func runTask() {
	cred := GetCredentialInstance()
	credentialModel, err := cred.GetCredential()
	if err != nil {
		log.Printf("Failed to get credential: %v", err)
		return
	}
	fmt.Println(time.Now())
	fmt.Printf("AK ID: %s, AK Secret: %s, STS Token: %s\n",
		*credentialModel.AccessKeyId,
		*credentialModel.AccessKeySecret,
		*credentialModel.SecurityToken)
	ecsClient := GetEcsClientInstance(cred)
	req := &ecs20140526.DescribeRegionsRequest{}
	runtime := &util.RuntimeOptions{}
	resp, err := ecsClient.DescribeRegionsWithOptions(req, runtime)
	if err != nil {
		log.Printf("ECS API call failed: %v", err)
		return
	}
	fmt.Printf("Invoke result: %d\n", *resp.StatusCode)
}
func main() {
	done := make(chan bool)
	// Start a goroutine to run scheduled tasks.
	go func() {
		tick := time.NewTicker(1 * time.Second)
		defer tick.Stop()
		executionCount := 0
		delays := []time.Duration{0, 600, 3600, 100} // Delay in seconds.
		for {
			select {
			case <-tick.C:
				if executionCount < len(delays) {
					delay := delays[executionCount]
					time.Sleep(delay * time.Second)
					runTask()
					executionCount++
				} else {
					close(done)
					return
				}
			}
		}
	}()
	<-done
	fmt.Println("All tasks completed. Exiting...")
}
2025-05-29 10:56:24.7142698 +0800 CST m=+1.418627901
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Invoke result: 200
2025-05-29 11:06:25.3225563 +0800 CST m=+602.026914401
AK ID: STS.NXFN xxx 33d7Da, AK Secret: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Invoke result: 200
2025-05-29 12:06:26.039859 +0800 CST m=+4202.744217101
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Invoke result: 200
2025-05-29 12:08:06.3556621 +0800 CST m=+4303.060020201
AK ID: STS.NWDS xxx 73kVg5u, AK Secret: C3tJCLkszB3 xxx PHGcUroGruw8D, STS Token:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Invoke result: 200
All tasks completed. Exiting...

Analyse basée sur la sortie des journaux :

  • Lors du premier appel, le cache est vide. Le système récupère un identifiant selon votre configuration, puis le stocke dans le cache.

  • Le deuxième appel utilise le même identifiant que le premier, indiquant qu'il a été récupéré depuis le cache.

  • Lors du troisième appel, l'identifiant mis en cache a expiré. Sa durée d'expiration (RoleSessionExpiration) est de 3 600 secondes, mais cet appel est effectué 4 200 secondes après le premier. Par conséquent, le mécanisme d'actualisation automatique du SDK récupère un nouvel identifiant et met à jour le cache.

  • Le quatrième appel utilise le même identifiant que le troisième, confirmant que le cache a bien été mis à jour.

Documents connexes