Nous vous recommandons d'utiliser la version plus récente OSS Go SDK V2 (alibabacloud-oss-go-sdk-v2). Celle-ci apporte des améliorations architecturales majeures par rapport à la V1 (aliyun-oss-go-sdk). La V2 simplifie la vérification d'identité, les nouvelles tentatives de requête et la gestion des erreurs. Elle introduit également des interfaces avancées telles que les paginateurs, les gestionnaires de transfert et des interfaces de type fichier. Pour mettre à niveau votre environnement, consultez le Guide de migration de Go SDK V1 vers V2.
Intégration rapide
Suivez les étapes ci-dessous pour intégrer OSS Go SDK V1.
Préparer l'environnement
Téléchargez et installez l'environnement de compilation et d'exécution Go. Pour plus d'informations, consultez Install Go. Utilisez Go 1.13 ou une version ultérieure.
À partir de Go 1.13, le mode module est activé par défaut pour gérer les dépendances de paquets. Il n'est donc pas nécessaire de définir manuellement
GOPATH.Pour Go 1.12 et les versions antérieures, définissez la variable d'environnement système
GOPATHet faites-la pointer vers votre répertoire de code.
Exécutez la commande go version pour vérifier la version de Go installée.
Installer le SDK
Choisissez une méthode d'installation adaptée à votre environnement de développement. Nous vous recommandons d'utiliser la dernière version du SDK.
go mod (Recommended)
Ajoutez la dépendance suivante au fichier go.mod. Cet exemple utilise la version 3.0.2. Remplacez-la par la version souhaitée.
require (
github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible
)
From source code
Exécutez la commande suivante pour installer le SDK :
go get github.com/aliyun/aliyun-oss-go-sdk/oss
Le processus d'installation n'affiche aucun message. Si l'installation expire, réexécutez la commande.
Configurer les identifiants d'accès
Configurez les identifiants d'accès à l'aide de la paire AccessKey d'un utilisateur RAM.
Dans la console RAM, créez un utilisateur RAM avec une Permanent AccessKey Pair. Enregistrez la paire AccessKey et accordez l'autorisation
AliyunOSSFullAccessà cet utilisateur.-
Utilisez la paire AccessKey de l'utilisateur RAM pour configurer les variables d'environnement.
Linux
-
Exécutez les commandes suivantes dans l'interface en ligne de commande pour ajouter les paramètres de variables d'environnement au fichier
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bashrc -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Exécutez la commande suivante dans le terminal pour identifier le shell par défaut.
echo $SHELL -
Effectuez les opérations suivantes selon le type de shell par défaut.
Zsh
-
Exécutez les commandes suivantes pour ajouter les paramètres de variables d'environnement au fichier
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.zshrc -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Exécutez les commandes suivantes pour ajouter les paramètres de variables d'environnement au fichier
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bash_profile -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Exécutez les commandes suivantes dans CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Exécutez les commandes suivantes dans PowerShell.
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User) -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
-
Initialiser le client
L'exemple de code suivant initialise un client en utilisant l'endpoint public de la région Chine (Hangzhou) et liste les buckets du compte actuel. Pour obtenir la liste complète des régions et des endpoints, consultez Régions et endpoints.
package main
// Sample code for initializing a client in OSS Go SDK V1
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Load access credentials from environment variables. You must set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
// List all buckets.
buckets, err := client.ListBuckets()
if err != nil {
fmt.Printf("Failed to list buckets: %v\n", err)
return
}
// Print the bucket list.
fmt.Printf("Found %d buckets:\n", len(buckets.Buckets))
for _, bucket := range buckets.Buckets {
fmt.Printf("%s\n", bucket.Name)
}
}
Configuration du client
Lors de l'initialisation du client, personnalisez divers paramètres tels que le type d'endpoint, le délai d'expiration et la taille du pool de connexions afin de répondre à vos exigences réseau et de performance.
Utiliser un endpoint interne
Pour accéder à OSS via un réseau interne, spécifiez un endpoint interne lors de l'initialisation du client OSS.
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou-internal.aliyuncs.com", // The internal endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
Utiliser un nom de domaine personnalisé
Pour accéder à OSS à l'aide d'un nom de domaine personnalisé, spécifiez-le comme endpoint et activez l'option CNAME avec oss.UseCname(true) lors de l'initialisation du client.
Avant d'utiliser un nom de domaine personnalisé, assurez-vous d'avoir mappé ce nom de domaine à un bucket. Pour plus d'informations, consultez Accéder à OSS via un nom de domaine personnalisé .
// Specify whether to use a custom domain name as the endpoint. The default value is false.
cname := oss.UseCname(true)
// Create an OSS client instance.
client, _ := oss.New(
"http://kitkat-cloud.cn", // A custom domain name.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
cname,
)
Contrôle des délais d'expiration
Utilisez le paramètre oss.Timeout pour définir le délai d'expiration de la connexion HTTP ainsi que le délai d'expiration de lecture/écriture en secondes.
// Set the HTTP connection timeout period to 20 seconds and the HTTP read or write timeout period to 60 seconds.
time := oss.Timeout(20, 60)
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
time,
)
Définir la taille du pool de connexions
Utilisez le paramètre oss.MaxConns pour ajuster la taille du pool de connexions.
// Set the maximum number of idle connections (MaxIdleConns) to 10. The default value is 100.
// Set the maximum number of idle connections per host (MaxIdleConnsPerHost) to 20. The default value is 100.
// Set the maximum number of connections per host (MaxConnsPerHost) to 50. The default value is empty.
conn := oss.MaxConns(10, 20, 50)
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
conn,
)
Désactiver la validation des données CRC
Définissez oss.EnableCRC(false) pour désactiver la validation des données CRC.
Nous vous recommandons vivement de maintenir la validation des données CRC activée. Si vous désactivez cette fonctionnalité, OSS ne peut plus garantir l'intégrité des données lors des téléchargements et des envois.
// Disable CRC data validation.
crc := oss.EnableCRC(false)
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
crc,
)
Version de signature
Les signatures V1 d'Alibaba Cloud Object Storage Service seront dépréciées selon le calendrier suivant. Passez aux signatures V4 dès que possible pour éviter toute interruption de service.
À partir du 1er mars 2025, les nouveaux utilisateurs ne pourront plus utiliser les signatures V1.
À partir du 1er septembre 2025, la maintenance et les mises à jour des signatures V1 seront progressivement interrompues, et les buckets nouvellement créés ne pourront plus utiliser les signatures V1.
L'exemple de code suivant initialise un client avec une signature V1. Pour l'initialisation avec une signature V4, consultez Initialiser le client.
package main
// Sample code for initializing a client with a V1 signature in OSS Go SDK V1
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Load access credentials from environment variables. You must set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
)
// List all buckets.
buckets, err := client.ListBuckets()
if err != nil {
fmt.Printf("Failed to list buckets: %v\n", err)
return
}
// Print the bucket list.
fmt.Printf("Found %d buckets:\n", len(buckets.Buckets))
for _, bucket := range buckets.Buckets {
fmt.Printf("%s\n", bucket.Name)
}
}
Définir le contexte de requête
Utilisez le contexte de requête pour contrôler le cycle de vie des requêtes.
Seul OSS Go SDK 2.2.9 et les versions ultérieures prennent en charge la définition du contexte de requête.
package main
// Sample code for setting the request context in OSS Go SDK V1
import (
"context"
"fmt"
"time"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// Load access credentials from environment variables. You must set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Create an OSS client instance.
client, _ := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
// Get the bucket object.
bucket, _ := client.Bucket("example-bucket-hz")
// Configure object information.
key := "oss-browser2-mac-arm64-2.1.0.dmg" // The path of the object in OSS.
file_path := "oss-browser2-mac-arm64-2.1.0.dmg" // The local path to save the object.
// Set the request context.
ctx := context.Background()
// Specify that the request context expires in 5 seconds.
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
// Download the object from OSS to the specified local path and set the request context.
err := bucket.GetObjectToFile(key, file_path, oss.WithContext(ctx))
if err != nil {
select {
case <-ctx.Done():
fmt.Printf("Request canceled or timed out: %v\n", err)
default:
fmt.Printf("Download failed: %v\n", err)
}
return
}
fmt.Printf("Object downloaded: %s -> %s\n", key, file_path)
}
Gestion des erreurs
Lorsqu'une erreur survient lors de l'accès à OSS, le SDK retourne des détails incluant le code d'état HTTP, le message d'erreur, l'ID de requête et le code d'erreur EC. Ce code EC identifie la cause spécifique et vous aide à résoudre rapidement le problème. Par exemple, si vous tentez de télécharger un objet inexistant, le message d'erreur suivant s'affiche :
oss: service returned error: StatusCode=404, ErrorCode=NoSuchKey, ErrorMessage="The specified key does not exist.", RequestId=69030EDB2E5F223030953167, Ec=0026-00000001
Dans ce message d'erreur, 'EC': '0026-00000001' correspond au code d'erreur EC. Utilisez ce code pour identifier la cause du problème et trouver la solution appropriée.
Exemples de code
OSS Go SDK V1 fournit des exemples de code couvrant les fonctionnalités principales telles que la gestion des buckets, les opérations sur les objets, le contrôle d'accès et le transfert chiffré. Le tableau suivant liste les exemples disponibles :
|
Code d'exemple GitHub |
Code d'exemple de la documentation officielle |
|
Hébergement de site web statique (back-to-origin basé sur la mise en miroir) (Go SDK V1) |
|
|
Envoyer des objets, y compris envoi simple (Go SDK V1) et envoi récupérable (Go SDK V1) |
|
|
Télécharger des objets, y compris téléchargement en streaming (Go SDK V1) et téléchargement conditionnel (Go SDK V1) |
|
Interroger les informations d'endpoint
OSS Go SDK V1 permet d'interroger les informations d'endpoint pour toutes les régions ou pour des régions spécifiques, y compris les endpoints publics (IPv4), les endpoints internes (réseau classique ou VPC) et les endpoints d'accélération.
Go SDK 2.2.8 et les versions ultérieures prennent en charge l'interrogation des informations d'endpoint.
package main
// Sample code for querying endpoint information in OSS Go SDK V1
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
fmt.Println("=== Query endpoint information for all supported regions ===\n")
// Load access credentials from environment variables. You must set OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET.
provider, _ := oss.NewEnvironmentVariableCredentialsProvider()
// Create an OSS client instance.
client, err := oss.New(
"oss-cn-hangzhou.aliyuncs.com", // The public endpoint of China (Hangzhou) is used as an example.
"",
"",
oss.SetCredentialsProvider(&provider),
oss.AuthVersion(oss.AuthV4),
oss.Region("cn-hangzhou"),
)
if err != nil {
fmt.Printf("Failed to create client: %v\n", err)
return
}
// Query endpoint information for all supported regions.
result, err := client.DescribeRegions()
if err != nil {
fmt.Printf("Failed to query endpoint information: %v\n", err)
return
}
// Traverse all region information.
for _, region := range result.Regions {
fmt.Printf("Region: %s\n", region.Region)
fmt.Printf(" Public endpoint (IPv4): %s\n", region.InternetEndpoint)
fmt.Printf(" Internal endpoint (classic network or VPC): %s\n", region.InternalEndpoint)
fmt.Printf(" Acceleration endpoint (global upload and download acceleration): %s\n", region.AccelerateEndpoint)
fmt.Println("--------------------------------------------------------------------------------")
}
// Print statistics.
fmt.Printf("\nFound endpoint information for %d regions\n", len(result.Regions))
}
Pour interroger les informations d'endpoint d'une région spécifique, indiquez l'ID de région spécifique à OSS dans la méthode DescribeRegions.
result, err := client.DescribeRegions(oss.AddParam("regions", "oss-cn-hangzhou"))
Configuration des identifiants d'accès
OSS prend en charge plusieurs méthodes d'initialisation des identifiants. Choisissez celle qui correspond le mieux à vos besoins en matière d'authentification et d'autorisation.
Utiliser la paire AccessKey d'un utilisateur RAM
Cette méthode convient aux applications déployées dans un environnement sécurisé qui nécessitent un accès OSS à long terme sans rotation fréquente des identifiants. Initialisez le fournisseur d'identifiants avec la paire AccessKey (AccessKey ID et AccessKey secret) d'un compte Alibaba Cloud ou d'un utilisateur RAM. Cette approche nécessite une maintenance manuelle de la paire AccessKey, ce qui peut introduire des risques de sécurité.
Un compte Alibaba Cloud dispose de toutes les permissions sur les ressources. En cas de fuite de la paire AccessKey, votre système est exposé à un risque majeur. Nous vous déconseillons d'utiliser la paire AccessKey d'un compte Alibaba Cloud. Privilégiez plutôt la paire AccessKey d'un utilisateur RAM doté des permissions minimales requises.
Pour créer une paire AccessKey pour un utilisateur RAM, consultez Créer une paire AccessKey. L'AccessKey ID et l'AccessKey secret d'un utilisateur RAM ne s'affichent qu'au moment de la création de la paire. Si vous les oubliez, créez une nouvelle paire AccessKey pour remplacer l'ancienne.
Environment variables
-
Configurez les variables d'environnement à l'aide de la paire AccessKey d'un utilisateur RAM.
Linux
-
Exécutez les commandes suivantes dans l'interface en ligne de commande pour ajouter les paramètres de variables d'environnement au fichier
~/.bashrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bashrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bashrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bashrc -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
macOS
-
Exécutez la commande suivante dans le terminal pour identifier le shell par défaut.
echo $SHELL -
Effectuez les opérations suivantes selon le type de shell par défaut.
Zsh
-
Exécutez les commandes suivantes pour ajouter les paramètres de variables d'environnement au fichier
~/.zshrc.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.zshrc echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.zshrc -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.zshrc -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
Bash
-
Exécutez les commandes suivantes pour ajouter les paramètres de variables d'environnement au fichier
~/.bash_profile.echo "export OSS_ACCESS_KEY_ID='YOUR_ACCESS_KEY_ID'" >> ~/.bash_profile echo "export OSS_ACCESS_KEY_SECRET='YOUR_ACCESS_KEY_SECRET'" >> ~/.bash_profile -
Exécutez la commande suivante pour appliquer les modifications.
source ~/.bash_profile -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo $OSS_ACCESS_KEY_ID echo $OSS_ACCESS_KEY_SECRET
-
Windows
CMD
-
Exécutez les commandes suivantes dans CMD.
setx OSS_ACCESS_KEY_ID "YOUR_ACCESS_KEY_ID" setx OSS_ACCESS_KEY_SECRET "YOUR_ACCESS_KEY_SECRET" -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
echo %OSS_ACCESS_KEY_ID% echo %OSS_ACCESS_KEY_SECRET%
PowerShell
-
Exécutez les commandes suivantes dans PowerShell.
[Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::SetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", "YOUR_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User) -
Exécutez les commandes suivantes pour vérifier la configuration des variables d'environnement.
[Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_ID", [EnvironmentVariableTarget]::User) [Environment]::GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET", [EnvironmentVariableTarget]::User)
-
Après avoir modifié les variables d'environnement système, redémarrez ou actualisez l'environnement de compilation et d'exécution. Cela inclut les IDE, les interfaces en ligne de commande, les autres applications de bureau et les services backend afin de garantir le chargement des dernières variables d'environnement système.
-
Utilisez les variables d'environnement pour transmettre les informations d'identification.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Static credentials
Pour éviter d'inscrire en dur les identifiants dans le code source, référencez-les via des variables qui lisent les variables d'environnement, les fichiers de configuration ou d'autres sources externes au moment de l'exécution. L'exemple suivant utilise un fichier de configuration :
-
Installez la bibliothèque go-ini.
go get -u github.com/go-ini/ini -
Créez un fichier de configuration nommé
config.ini.[credentials] alibaba_cloud_access_key_id = <ALIBABA_CLOUD_ACCESS_KEY_ID> alibaba_cloud_access_key_secret = <ALIBABA_CLOUD_ACCESS_KEY_SECRET> -
Écrivez le code permettant de lire les informations d'identification depuis le fichier de configuration et d'initialiser le client OSS.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "gopkg.in/ini.v1" ) type defaultCredentials struct { config *oss.Config } func (defCre *defaultCredentials) GetAccessKeyID() string { return defCre.config.AccessKeyID } func (defCre *defaultCredentials) GetAccessKeySecret() string { return defCre.config.AccessKeySecret } func (defCre *defaultCredentials) GetSecurityToken() string { return defCre.config.SecurityToken } type defaultCredentialsProvider struct { config *oss.Config } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { return &defaultCredentials{config: defBuild.config} } func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) { var provider defaultCredentialsProvider if accessID == "" { return provider, fmt.Errorf("access key id is empty!") } if accessKey == "" { return provider, fmt.Errorf("access key secret is empty!") } config := &oss.Config{ AccessKeyID: accessID, AccessKeySecret: accessKey, SecurityToken: token, } return defaultCredentialsProvider{ config, }, nil } func main() { cfg, err := ini.Load("config.ini") if err != nil { fmt.Println("Error loading config file:", err) return } accessKeyID := cfg.Section("credentials").Key("alibaba_cloud_access_key_id").String() accessKeySecret := cfg.Section("credentials").Key("alibaba_cloud_access_key_secret").String() provider, err := NewDefaultCredentialsProvider(accessKeyID, accessKeySecret, "") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser des identifiants d'accès temporaires STS
Cette option est destinée aux applications nécessitant un accès temporaire à OSS. Initialisez le fournisseur d'identifiants avec des identifiants temporaires (AccessKey ID, AccessKey secret et Security Token) obtenus via STS. Cette méthode requiert une maintenance manuelle du jeton STS. Pour accéder plusieurs fois à OSS, actualisez manuellement le jeton avant son expiration.
Pour obtenir rapidement un jeton STS via OpenAPI, consultez AssumeRole - Obtenir des identifiants d'identité temporaires pour un rôle RAM.
Pour obtenir un jeton STS à l'aide d'un SDK, consultez Utiliser un jeton STS pour accéder à OSS.
Lorsque vous générez un jeton STS, spécifiez une date d'expiration. Le jeton devient invalide après cette date et ne peut plus être utilisé.
Pour obtenir la liste des endpoints STS, consultez Endpoints.
-
Définissez les variables d'environnement à l'aide des identifiants d'identité temporaires.
Mac OS/Linux/Unix
ImportantUtilisez les identifiants d'identité temporaires (AccessKey ID, AccessKey secret et Security Token) obtenus via STS, et non la paire AccessKey (AccessKey ID et AccessKey secret) d'un utilisateur RAM.
L'AccessKey ID obtenu via STS commence par « STS. », par exemple « STS. ».
export OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> export OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> export OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN>Windows
ImportantUtilisez les identifiants d'identité temporaires (AccessKey ID, AccessKey secret et Security Token) obtenus via STS, et non la paire AccessKey (AccessKey ID et AccessKey secret) d'un utilisateur RAM.
L'AccessKey ID obtenu via STS commence par « STS. », par exemple « STS. ».
set OSS_ACCESS_KEY_ID=<STS_ACCESS_KEY_ID> set OSS_ACCESS_KEY_SECRET=<STS_ACCESS_KEY_SECRET> set OSS_SESSION_TOKEN=<STS_SECURITY_TOKEN> -
Transmettez les informations d'identification via les variables d'environnement.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET, and OSS_SESSION_TOKEN environment variables are set. provider, err := oss.NewEnvironmentVariableCredentialsProvider() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Create an OSSClient instance. // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser un ARN de rôle RAM
Recommandé pour les applications nécessitant un accès autorisé à OSS, tel que l'accès inter-comptes. Initialisez le fournisseur d'identifiants en spécifiant l'ARN d'un rôle RAM. L'outil Credentials obtient automatiquement les jetons STS et les actualise avant leur expiration en appelant l'opération AssumeRole. Vous pouvez également attribuer une policy pour restreindre le rôle à un ensemble de permissions plus limité.
Un compte Alibaba Cloud dispose de toutes les permissions sur les ressources. En cas de fuite de la paire AccessKey, votre système est exposé à un risque majeur. Nous vous déconseillons d'utiliser la paire AccessKey d'un compte Alibaba Cloud. Privilégiez plutôt la paire AccessKey d'un utilisateur RAM doté des permissions minimales requises.
Pour créer une paire AccessKey pour un utilisateur RAM, consultez Créer une paire AccessKey. L'AccessKey ID et l'AccessKey secret d'un utilisateur RAM ne s'affichent qu'au moment de la création de la paire. Enregistrez-les immédiatement. Si vous les oubliez, créez une nouvelle paire AccessKey pour remplacer l'ancienne.
Pour obtenir un ARN de rôle RAM, consultez Créer un rôle RAM.
-
Ajoutez la dépendance credentials.
go get github.com/aliyun/credentials-go/credentials -
Configurez la paire AccessKey et l'ARN du rôle RAM comme identifiants d'accès.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type defaultCredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewRamRoleArnCredentialsProvider(credential credentials.Credential) defaultCredentialsProvider { return defaultCredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // The credential type. Set the value to ram_role_arn. SetType("ram_role_arn"). // The AccessKey ID and AccessKey secret of the RAM user. The values are obtained from environment variables. SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")). SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")). // The following operations directly use parameter values. You can also add environment variables and use os.Getenv("<variable_name>") to set the corresponding parameters. // The ARN of the RAM role to assume. The value is obtained from an environment variable. Format: acs:ram::$accountID:role/$roleName. SetRoleArn("ALIBABA_CLOUD_ROLE_ARN"). // The standard environment variable name for RoleArn is ALIBABA_CLOUD_ROLE_ARN. // A custom name for the role session to distinguish different tokens. SetRoleSessionName("ALIBABA_CLOUD_ROLE_SESSION_NAME"). // The standard environment variable name for RoleSessionName is ALIBABA_CLOUD_ROLE_SESSION_NAME. // (Optional) Restrict the permissions of the STS token. SetPolicy(""). // (Optional) Limit the validity period of the STS token. SetRoleSessionExpiration(3600) arnCredential, err := credentials.NewCredential(config) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } provider := NewRamRoleArnCredentialsProvider(arnCredential) // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser un rôle RAM d'instance ECS
Méthode recommandée pour les applications s'exécutant sur des instances ECS, des instances ECI ou des nœuds worker de Container Service for Kubernetes. Un rôle RAM d'instance ECS associe un rôle à l'instance, permettant l'actualisation automatique du jeton STS sans fournir de paire AccessKey ni de jeton STS. Pour savoir comment obtenir un rôle RAM d'instance ECS, consultez Créer un rôle RAM. Pour savoir comment associer un rôle à une instance ECS, consultez Rôles RAM d'instance.
-
Ajoutez la dépendance credentials.
go get github.com/aliyun/credentials-go/credentials -
Configurez le rôle RAM d'instance ECS comme identifiant d'accès.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewEcsCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // The credential type. Set the value to ecs_ram_role. SetType("ecs_ram_role"). // (Optional) The role name. If you do not specify this parameter, OSS automatically obtains the role. We recommend that you specify the role name to reduce the number of requests. SetRoleName("RoleName") ecsCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewEcsCredentialsProvider(ecsCredential) // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser un ARN de rôle OIDC
Pour les applications non approuvées déployées sur des nœuds worker de Container Service for Kubernetes, la fonctionnalité RAM Roles for Service Accounts (RRSA) offre une isolation des identifiants au niveau du pod. Au lieu de partager le rôle RAM d'instance du nœud worker via le service méta global, RRSA monte un fichier de jeton OIDC de compte de service dans chaque pod et injecte la configuration dans les variables d'environnement. L'outil Credentials appelle ensuite l'opération AssumeRoleWithOIDC pour échanger le jeton OIDC contre un jeton STS. Aucune paire AccessKey ni jeton STS n'est requis. Pour plus d'informations, consultez Configurer les permissions RAM pour un ServiceAccount à l'aide de RRSA pour réaliser une isolation des permissions au niveau du pod.
-
Ajoutez la dépendance credentials.
go get github.com/aliyun/credentials-go/credentials -
Configurez le rôle RAM OIDC comme identifiant d'accès.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewOIDCRoleARNCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // The file path of the OIDC token. SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")). // The following operations directly use parameter values. You can also add environment variables and use os.Getenv("<variable_name>") to set the corresponding parameters. // The credential type. Set the value to oidc_role_arn. SetType("oidc_role_arn"). // The ARN of the OIDC provider. Format: acs:ram::account-id:oidc-provider/provider-name. SetOIDCProviderArn("acs:ram::113511544585****:oidc-provider/TestOidcProvider"). // The standard environment variable name for OIDCProviderArn is ALIBABA_CLOUD_OIDC_PROVIDER_ARN. // A custom name for the role session to distinguish different tokens. SetRoleSessionName("role_session_name"). // The standard environment variable name for RoleSessionName is ALIBABA_CLOUD_ROLE_SESSION_NAME. // The ARN of the role to assume. Format: acs:ram::113511544585****:oidc-provider/TestOidcProvider SetRoleArn("acs:ram::113511544585****:role/testoidc"). // The standard environment variable name for RoleArn is ALIBABA_CLOUD_ROLE_ARN. // (Optional) The policy to use when assuming the role. SetPolicy(""). SetSessionExpiration(3600) oidcCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewOIDCRoleARNCredentialsProvider(oidcCredential) // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser les identifiants du contexte Function Compute
Convient aux fonctions d'applications déployées dans Function Compute. Function Compute obtient un jeton STS en assumant le rôle de service configuré pour la fonction et le transmet via le paramètre Credentials dans le contexte. Ce jeton STS est valide pendant 36 heures et n'expire pas durant l'exécution de la fonction (maximum 24 heures), aucune actualisation n'est donc nécessaire. Aucune paire AccessKey ni jeton STS n'est requis. Pour savoir comment accorder à Function Compute les permissions d'accès à OSS, consultez Utiliser un rôle de fonction pour accorder à Function Compute les permissions d'accès à d'autres services Alibaba Cloud.
-
Ajoutez les dépendances du contexte Function Compute.
go get github.com/aliyun/fc-runtime-go-sdk/fc go get github.com/aliyun/fc-runtime-go-sdk/fccontext -
Initialisez le fournisseur d'identifiants en utilisant les identifiants du contexte Function Compute.
package main import ( "context" "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/fc-runtime-go-sdk/fc" "github.com/aliyun/fc-runtime-go-sdk/fccontext" ) type GetObjectContext struct { OutputRoute string `json:"outputRoute"` OutputToken string `json:"outputToken"` InputOssUrl string `json:"inputOssUrl"` } type StructEvent struct { GetObjectContext GetObjectContext `json:"getObjectContext"` } func HandleRequest(ctx context.Context, event StructEvent) error { endpoint := event.GetObjectContext.OutputRoute fctx, _ := fccontext.FromContext(ctx) client, err := oss.New(endpoint, fctx.Credentials.AccessKeyId, fctx.Credentials.AccessKeySecret, oss.SecurityToken(fctx.Credentials.SecurityToken)) if err != nil { return fmt.Errorf("client new error: %v", err) } fmt.Printf("client:%#v\n", client) return nil } func main() { fc.Start(HandleRequest) }
Utiliser un CredentialsURI
Destiné aux applications qui obtiennent leurs identifiants depuis un système externe. L'outil Credentials récupère les jetons STS à partir de l'URI spécifiée et les actualise automatiquement. Aucune paire AccessKey ni jeton STS n'est requis.
Le CredentialsURI est l'adresse du serveur à partir de laquelle le jeton STS est obtenu.
Le service backend fournissant la réponse CredentialsURI doit implémenter la logique d'actualisation automatique du jeton STS afin de garantir que l'application puisse toujours obtenir des identifiants valides.
-
Pour que l'outil Credentials puisse analyser et utiliser correctement le jeton STS, l'URI doit respecter le protocole de réponse suivant :
Code d'état de la réponse : 200
-
Structure du corps de la réponse :
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
-
Ajoutez la dépendance credentials.
go get github.com/aliyun/credentials-go/credentials -
Configurez le CredentialsURI comme identifiant d'accès.
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/credentials-go/credentials" ) type Credentials struct { AccessKeyId string AccessKeySecret string SecurityToken string } type CredentialsProvider struct { cred credentials.Credential } func (credentials *Credentials) GetAccessKeyID() string { return credentials.AccessKeyId } func (credentials *Credentials) GetAccessKeySecret() string { return credentials.AccessKeySecret } func (credentials *Credentials) GetSecurityToken() string { return credentials.SecurityToken } func (defBuild CredentialsProvider) GetCredentials() oss.Credentials { cred, _ := defBuild.cred.GetCredential() return &Credentials{ AccessKeyId: *cred.AccessKeyId, AccessKeySecret: *cred.AccessKeySecret, SecurityToken: *cred.SecurityToken, } } func NewCredentialsUriCredentialsProvider(credential credentials.Credential) CredentialsProvider { return CredentialsProvider{ cred: credential, } } func main() { config := new(credentials.Config). // The credential type. Set the value to credentials_uri. SetType("credentials_uri"). // Specify the URL address. You can also set an environment variable and use os.Getenv("<variable_name>") to pass the parameter. // The standard environment variable name for URLCredential is ALIBABA_CLOUD_CREDENTIALS_URI. SetURLCredential("http://127.0.0.1") uriCredential, err := credentials.NewCredential(config) if err != nil { return } provider := NewCredentialsUriCredentialsProvider(uriCredential) // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) client, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", client) }
Utiliser une paire AccessKey à rotation automatique
Convient aux applications nécessitant un accès OSS à long terme mais déployées dans des environnements où le risque de fuite de paire AccessKey existe. Initialisez le fournisseur d'identifiants avec une ClientKey. Key Management Service (KMS) fait tourner automatiquement la paire AccessKey de l'utilisateur RAM géré selon un calendrier périodique, transformant ainsi un identifiant statique en identifiant dynamique. KMS prend également en charge la rotation immédiate pour un remplacement rapide en cas de fuite. Pour savoir comment obtenir une ClientKey, consultez Créer un point d'accès d'application.
-
Ajoutez la dépendance du client d'identifiants.
go get -u github.com/aliyun/aliyun-secretsmanager-client-go -
Créez un fichier de configuration nommé
secretsmanager.properties.# Access credential type credentials_type=client_key # The password used to decrypt the client key. The password can be read from an environment variable or a file. client_key_password_from_env_variable=#your client key private key password environment variable name# client_key_password_from_file_path=#your client key private key password file path# # The path of the client key's private key file. client_key_private_key_path=#your client key private key file path# # The region of the associated KMS service. cache_client_region_id=[{"regionId":"#regionId#"}] -
Utilisez le fichier de configuration pour transmettre les informations d'identification.
package main import ( "encoding/json" "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-secretsmanager-client-go/sdk" ) type defaultCredentials struct { config *oss.Config } func (defCre *defaultCredentials) GetAccessKeyID() string { return defCre.config.AccessKeyID } func (defCre *defaultCredentials) GetAccessKeySecret() string { return defCre.config.AccessKeySecret } func (defCre *defaultCredentials) GetSecurityToken() string { return defCre.config.SecurityToken } type defaultCredentialsProvider struct { config *oss.Config } func (defBuild *defaultCredentialsProvider) GetCredentials() oss.Credentials { return &defaultCredentials{config: defBuild.config} } func NewDefaultCredentialsProvider(accessID, accessKey, token string) (defaultCredentialsProvider, error) { var provider defaultCredentialsProvider if accessID == "" { return provider, fmt.Errorf("access key id is empty!") } if accessKey == "" { return provider, fmt.Errorf("access key secret is empty!") } config := &oss.Config{ AccessKeyID: accessID, AccessKeySecret: accessKey, SecurityToken: token, } return defaultCredentialsProvider{ config, }, nil } func main() { client, err := sdk.NewClient() if err != nil { fmt.Println("Error:", err) os.Exit(-1) } secretInfo, err := client.GetSecretInfo("#secretName#") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("SecretValue:%s\n", secretInfo.SecretValue) var m map[string]string err = json.Unmarshal([]byte(secretInfo.SecretValue), &m) if err != nil { fmt.Println("Error decoding JSON:", err) os.Exit(-1) } accessKeyId := m["AccessKeyId"] accessKeySecret := m["AccessKeySecret"] provider, err := NewDefaultCredentialsProvider(accessKeyId, accessKeySecret, "") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed. // Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed. clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)} clientOptions = append(clientOptions, oss.Region("yourRegion")) // Set the signature version. clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4)) ossClient, err := oss.New("yourEndpoint", "", "", clientOptions...) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Printf("client:%#v\n", ossClient) }
Utiliser des identifiants d'accès personnalisés
Si aucune des méthodes précédentes ne répond à vos besoins, implémentez un fournisseur d'identifiants personnalisé à l'aide de l'interface Credential Providers. Si les identifiants sous-jacents sont basés sur STS, gérez l'actualisation du jeton.
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
type CustomerCredentialsProvider struct {
config *oss.Config
}
func NewCustomerCredentialsProvider() CustomerCredentialsProvider {
return CustomerCredentialsProvider{}
}
func (s CustomerCredentialsProvider) GetCredentials() oss.Credentials {
// Return long-term credentials.
config := &oss.Config{
AccessKeyID: "id",
AccessKeySecret: "secret",
}
return &CustomerCredentialsProvider{
config,
}
// Return temporary credentials.
//config := &oss.Config{
// AccessKeyID: "id",
// AccessKeySecret: "secret",
// SecurityToken: "token",
//}
//return &CustomerCredentialsProvider{
// config,
//}
}
func (s *CustomerCredentialsProvider) GetAccessKeyID() string {
return s.config.AccessKeyID
}
func (s *CustomerCredentialsProvider) GetAccessKeySecret() string {
return s.config.AccessKeySecret
}
func (s *CustomerCredentialsProvider) GetSecurityToken() string {
return s.config.SecurityToken
}
func main() {
provider := NewCustomerCredentialsProvider()
// Set yourEndpoint to the endpoint of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the endpoint to https://oss-cn-hangzhou.aliyuncs.com. For other regions, set the endpoint as needed.
// Set yourRegion to the region of the bucket. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. For other regions, set the region as needed.
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// Set the signature version.
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("client:%#v\n", client)
}
FAQ
Comment résoudre l'erreur AccessDenied lors de l'utilisation du SDK ?
L'erreur AccessDenied indique généralement des permissions insuffisantes. Suivez ces étapes pour la résoudre :
Vérifiez l'AccessKey ID et l'AccessKey secret : assurez-vous d'utiliser les bons identifiants.
Contrôlez les permissions de l'utilisateur RAM : confirmez que l'utilisateur RAM dispose des permissions nécessaires pour les opérations sur les buckets ou les objets.
Examinez la politique de bucket : si le message d'erreur mentionne « Access denied by bucket policy », cela signifie que l'accès a été refusé par une politique de bucket.
Pour plus d'informations sur la façon d'identifier d'autres types d'erreurs et de résoudre les erreurs courantes de contrôle d'accès, consultez Gestion des erreurs.