All Products
Search
Document Center

Alibaba Cloud SDK:Mengelola kredensial akses

Last Updated:Jun 22, 2026

Alibaba Cloud SDK menggunakan tool Credentials untuk mengelola kredensial secara terpusat, seperti AccessKey dan STS Token. Topik ini menjelaskan jenis kredensial yang didukung beserta metode konfigurasinya.

Latar Belakang

Kredensial adalah sekumpulan informasi yang memverifikasi identitas pengguna. Untuk masuk ke sistem, pengguna harus memberikan kredensial yang valid. Jenis kredensial umum meliputi:

  1. AccessKey adalah kredensial jangka panjang untuk Akun Alibaba Cloud atau Pengguna RAM, berupa pasangan kunci yang terdiri dari ID AccessKey dan Rahasia AccessKey.

  2. Token STS adalah kredensial akses sementara untuk peran RAM, mencakup periode validitas yang dapat dikonfigurasi dan izin akses. Untuk informasi lebih lanjut, lihat Apa itu STS.

  3. Bearer token adalah kredensial yang digunakan untuk autentikasi dan otorisasi.

Prasyarat

  • Tool kredensial memerlukan Go 1.10.x atau versi yang lebih baru.

  • Anda harus menggunakan Alibaba Cloud SDK versi 2.0. Untuk informasi lebih lanjut, lihat Gunakan Alibaba Cloud Go SDK dengan IDE.

Instal Alibaba Cloud Credentials

Jika Alibaba Cloud Credentials sudah terinstal, Anda dapat melewati langkah ini. Disarankan menggunakan dependensi Alibaba Cloud Credentials versi terbaru untuk memastikan dukungan penuh terhadap semua jenis kredensial. Informasi selengkapnya mengenai semua versi yang telah dirilis tersedia di Alibaba Cloud Credentials.

Anda dapat menginstal Alibaba Cloud Credentials menggunakan salah satu metode berikut:

  • Metode 1: Gunakan go get untuk menginstal Alibaba Cloud Credentials:

    $ go get -u github.com/aliyun/credentials-go
  • Metode 2: Jika Anda menggunakan dep untuk mengelola dependensi, jalankan perintah berikut:

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

Tool kredensial: Parameter

Struktur Config dalam paket github.com/aliyun/credentials-go/credentials mendefinisikan parameter konfigurasi untuk tool kredensial. Gunakan parameter type yang diperlukan untuk menentukan jenis kredensial, lalu konfigurasikan parameter sesuai jenis tersebut. Tabel berikut mencantumkan nilai yang valid untuk parameter type dan parameter yang didukung oleh masing-masing jenis kredensial. Dalam tabel ini, menunjukkan parameter yang diperlukan, - menunjukkan parameter opsional, dan × berarti parameter tidak didukung.

Catatan

Hindari penggunaan jenis kredensial atau parameter yang tidak tercantum dalam tabel di bawah ini.

Type

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

AccessKeyId: ID AccessKey.

×

×

×

×

AccessKeySecret: Rahasia AccessKey.

×

×

×

×

SecurityToken: Token STS.

×

-

×

×

×

×

RoleArn: Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM.

×

×

×

×

×

RoleSessionName: Nama sesi kustom. Format defaultnya adalah credentials-go-<timestamp>.

×

×

-

×

-

×

×

RoleName: Nama peran RAM.

×

×

×

-

×

×

×

DisableIMDSv1: Atur ke true untuk menerapkan mode penguatan keamanan. Nilai defaultnya adalah false.

×

×

×

-

×

×

×

BearerToken: Bearer token.

×

×

×

×

×

×

Policy: Kebijakan kustom.

×

×

-

×

-

×

×

RoleSessionExpiration: Waktu kedaluwarsa sesi, dalam detik. Nilai defaultnya adalah 3.600.

×

×

-

×

-

×

×

OIDCProviderArn: Nama Sumber Daya Alibaba Cloud (ARN) dari penyedia identitas OpenID Connect (OIDC).

×

×

×

×

×

×

OIDCTokenFilePath: Jalur ke file token OIDC.

×

×

×

×

×

×

ExternalId: ID eksternal dari peran. ID ini membantu mencegah masalah confused deputy. Untuk informasi lebih lanjut, lihat Gunakan ExternalId untuk mencegah masalah confused deputy.

×

×

-

×

×

×

×

Url: URI kredensial. Nilai ini diatur dengan menggunakan metode SetURLCredential(v string).

×

×

×

×

×

×

STSEndpoint: Titik akhir STS. Parameter ini mendukung titik akhir VPC maupun titik akhir publik. Untuk daftar nilai yang valid, lihat Titik Akhir. Nilai defaultnya adalah sts.aliyuncs.com.

×

×

-

×

-

×

×

Timeout: Timeout baca HTTP, dalam milidetik. Nilai defaultnya adalah 5.000.

×

×

-

-

-

-

×

ConnectTimeout: Timeout koneksi HTTP, dalam milidetik. Nilai defaultnya adalah 10.000.

×

×

-

-

-

-

×

Inisialisasi klien kredensial

Bagian sebelumnya menjelaskan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Bagian berikut menyediakan contoh kode yang menunjukkan cara menggunakan tool tersebut. Pilih metode yang paling sesuai dengan skenario Anda.

Penting
  • Menyematkan AccessKey secara langsung dalam proyek Anda menimbulkan risiko keamanan. Izin repositori yang tidak dikelola dengan baik dapat mengekspos seluruh sumber daya dalam akun Anda. Disarankan menyimpan AccessKey dalam variabel lingkungan atau file konfigurasi.

  • Gunakan pola singleton dengan tool Credentials. Pola ini memungkinkan caching kredensial bawaan tool untuk mencegah pembatasan laju akibat panggilan API yang sering dan menghindari pemborosan sumber daya dari pembuatan banyak instans. Untuk informasi lebih lanjut, lihat Refresh otomatis kredensial sesi.

Metode 1: menggunakan rantai penyedia kredensial default

B{Credential file exists?}; B -- Yes --> C(Read credential file); B -- No --> D{Environment variables configured?}; C --> E{Valid credential obtained?}; D -- Yes --> F(Read environment variables); D -- No --> G{ECS instance used?}; F --> E; G -- Yes --> H(Read instance RAM role); G -- No --> I(Error returned); H --> E; E -- Yes --> J(Valid credential obtained); E -- No --> I; J --> K(END); I --> L(END); ]]>

Jika Anda menginisialisasi klien Credentials tanpa parameter, Credentials akan menggunakan rantai penyedia kredensial default. Untuk mempelajari lebih lanjut tentang cara memuat kredensial default, lihat Rantai penyedia kredensial default.

package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func main() {
	// Berikan nil untuk menggunakan rantai penyedia kredensial default.
	credential, err := credentials.NewCredential(nil)
	config := &openapi.Config{}
        config.Credential = credential
        // Kode untuk menginisialisasi klien produk cloud dihilangkan. Lihat contoh panggilan API untuk detailnya.
}

Contoh panggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan contoh ini, instal ECS SDK untuk 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() {
	// Buat kredensial dari rantai penyedia default.
	credentialClient, _err := credentials.NewCredential(nil)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Atur titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Atur kredensial.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi opsi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan respons.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 2: AccessKey

Tool Credentials menggunakan AccessKey yang Anda berikan sebagai kredensial akses.

Peringatan

Akun Alibaba Cloud (akun root) memiliki hak istimewa penuh atas semua sumber dayanya, sehingga AK yang terekspos menimbulkan risiko keamanan signifikan. Jangan gunakan AK dari akun root.

Gunakan AK dari Pengguna RAM dengan izin prinsip hak akses minimal (least-privilege).

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
	// Kode untuk menginisialisasi klien produk cloud dihilangkan. Lihat contoh panggilan API untuk detailnya.
}

Contoh API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan contoh ini, Anda harus terlebih dahulu menginstal ECS SDK.

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() {
	// Inisialisasi klien kredensial dengan pasangan AccessKey.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("access_key").
		// Atur ID AccessKey Anda.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Atur rahasia AccessKey Anda.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Konfigurasi titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasi kredensial.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi opsi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 3: Token STS

Tool Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.

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").
		// Dapatkan ID AccessKey dari variabel lingkungan.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Dapatkan rahasia AccessKey dari variabel lingkungan.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// Dapatkan token keamanan dari variabel lingkungan.
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))
	stsCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = stsCredential
        // Kode inisialisasi untuk klien produk cloud dihilangkan. Untuk detailnya, lihat contoh panggilan API.
}

Panggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan contoh ini, instal ECS SDK dan STS SDK.

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() {
	// Buat klien STS dan panggil operasi AssumeRole untuk mendapatkan token STS.
	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{}
	// ARN dari peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur RoleArn dengan menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
	assumeRoleRequest.SetRoleArn("<RoleArn>")
	// Nama sesi peran. Anda dapat mengatur RoleSessionName dengan menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
	assumeRoleRequest.SetRoleSessionName("<RoleSessionName>")
	assumeRoleRequest.SetDurationSeconds(3600)
	result, _err := client.AssumeRole(assumeRoleRequest)
	if _err != nil {
		panic(_err)
	}
	assumeRoleResponseBodyCredentials := result.Body.Credentials
	// Gunakan token STS untuk menginisialisasi klien Credentials.
	credentialsConfig := new(credentials.Config).
		// Tentukan jenis kredensial.
		SetType("sts").
		SetAccessKeyId(*assumeRoleResponseBodyCredentials.AccessKeyId).
		SetAccessKeySecret(*assumeRoleResponseBodyCredentials.AccessKeySecret).
		SetSecurityToken(*assumeRoleResponseBodyCredentials.SecurityToken)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Konfigurasi titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
	// Konfigurasi kredensial.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi opsi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan ambil respons.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 4: AK dan RamRoleArn

Metode ini menggunakan token STS secara internal. Dengan menentukan ARN (Nama Sumber Daya Alibaba Cloud) dari peran RAM, tool kredensial memperoleh token STS dari STS. Anda juga dapat menggunakan SetPolicy untuk membatasi peran RAM ke set izin yang lebih kecil.

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")).
		// Menentukan ARN dari peran RAM yang akan diasumsikan, seperti `acs:ram::123456789012****:role/adminrole`. Anda juga dapat mengatur ini dengan variabel lingkungan `ALIBABA_CLOUD_ROLE_ARN`.
		SetRoleArn("<RoleArn>").
		// Nama kustom untuk sesi peran. Anda juga dapat mengatur ini dengan variabel lingkungan `ALIBABA_CLOUD_ROLE_SESSION_NAME`.
		SetRoleSessionName("<RoleSessionName>").
		// Opsional. Kebijakan inline yang lebih membatasi izin kredensial sementara. Contoh: `{"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}`
		SetPolicy("<Policy>").
		// Opsional. Waktu kedaluwarsa sesi dalam detik.
		SetRoleSessionExpiration(3600).
		// Opsional. ID eksternal yang digunakan untuk mencegah masalah confused deputy.
		SetExternalId("ExternalId").
		// Opsional. Titik akhir STS. Defaultnya adalah sts.aliyuncs.com. Untuk kinerja jaringan yang lebih baik, gunakan titik akhir spesifik wilayah yang lebih dekat dengan aplikasi Anda.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	arnCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = arnCredential
        // Contoh ini menghilangkan kode inisialisasi klien. Untuk informasi lebih lanjut, lihat contoh panggilan API.
}
Catatan

Untuk mempelajari lebih lanjut tentang ID eksternal, lihat Mencegah masalah confused deputy dengan ID eksternal.

Contoh API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan contoh ini, instal ECS SDK.

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() {
	// Inisialisasi konfigurasi kredensial dengan ARN peran RAM.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("ram_role_arn").
		// ID AccessKey.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Rahasia AccessKey.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// ARN dari peran RAM yang akan diasumsikan. Ini dapat diatur dengan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
		SetRoleArn("<RoleArn>").
		// Nama kustom untuk sesi peran. Ini dapat diatur dengan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName("<RoleSessionName>").
		// Opsional. Kebijakan inline untuk lebih membatasi izin. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Opsional. Waktu kedaluwarsa sesi dalam detik.
		SetRoleSessionExpiration(3600).
		// Opsional. Titik akhir STS. Defaultnya adalah sts.aliyuncs.com. Untuk kinerja jaringan yang lebih baik, gunakan titik akhir spesifik wilayah yang lebih dekat dengan aplikasi Anda.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Konfigurasi titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Tetapkan kredensial yang dibuat ke konfigurasi ECS.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi opsi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan ambil respons.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 5: Peran RAM instans ECS

Anda dapat menyambungkan peran RAM instans ke instans ECS dan ECI. Aplikasi pada instans ini kemudian dapat menggunakan tool kredensial untuk secara otomatis memperoleh token STS guna menginisialisasi klien kredensial.

Secara default, tool kredensial mengakses server metadata ECS dalam mode penguatan keamanan (IMDSv2). Jika terjadi kesalahan, tool secara otomatis kembali ke mode normal untuk memperoleh kredensial akses. Anda dapat mengontrol perilaku fallback ini dengan mengatur parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE:

  • Jika diatur ke false (default), tool kembali ke mode normal.

  • Jika diatur ke true, tool hanya menggunakan mode penguatan keamanan dan melemparkan pengecualian jika gagal.

Dukungan IMDSv2 bergantung pada konfigurasi server.

Selain itu, Anda dapat menonaktifkan akses kredensial melalui metadata instans ECS dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Catatan
package main
import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)
func _main(args []*string) {
	// Inisialisasi klien kredensial menggunakan peran RAM ECS.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("ecs_ram_role").
		// Opsional. Nama peran RAM ECS. Jika dibiarkan kosong, nama akan diambil secara otomatis. Mengatur parameter ini direkomendasikan untuk mengurangi panggilan API. Anda juga dapat mengaturnya menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
		SetRoleName("<RoleName>")
	// Opsional, defaultnya false. Nilai `true` menerapkan mode penguatan keamanan (IMDSv2). Ketika diatur ke `false`, SDK pertama-tama mencoba mengambil kredensial dalam mode penguatan keamanan dan kembali ke mode normal (IMDSv1) jika upaya tersebut gagal.
	// credentialsConfig.SetDisableIMDSv1(true)
	credentialClient, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = credentialClient
        // Kode untuk menginisialisasi klien produk cloud dengan objek konfigurasi ini dihilangkan. Untuk detailnya, lihat contoh panggilan API.
}

Contoh panggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Anda harus menginstal ECS SDK sebelum menjalankan contoh.

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() {
	// Inisialisasi klien Credentials dengan menggunakan peran RAM ECS.
	credentialsConfig := new(credentials.Config).
		// Menentukan jenis kredensial.
		SetType("ecs_ram_role").
		// Opsional. Nama peran. Jika dihilangkan, nama akan diambil secara otomatis. Menentukan parameter ini direkomendasikan untuk mengurangi permintaan. Anda juga dapat mengatur nama peran dengan menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
		SetRoleName("<RoleName>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Mengatur titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Mengatur kredensial klien.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi runtime.
	runtime := &util.RuntimeOptions{}
	// Memanggil operasi DescribeRegions dan mengambil respons.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 6: Gunakan OIDCRoleArn

Jika Anda menggunakan OIDC untuk autentikasi dan telah membuat peran RAM untuk penyedia identitas OIDC, Anda dapat memberikan ARN penyedia OIDC, jalur file token OIDC, dan ARN peran RAM ke tool Credentials. Tool tersebut kemudian secara otomatis memanggil API AssumeRoleWithOIDC untuk memperoleh token STS untuk peran RAM, yang digunakan sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi lebih lanjut, lihat Refresh otomatis kredensial sesi. Sebagai contoh, jika aplikasi Anda berjalan di kluster Container Service for Kubernetes (ACK) dengan RRSA diaktifkan, tool Credentials dapat membaca konfigurasi OIDC dari variabel lingkungan pod dan memanggil API AssumeRoleWithOIDC untuk memperoleh token STS. Anda kemudian dapat menggunakan token STS ini untuk mengakses layanan 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").
		// ARN penyedia OIDC. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// Jalur file token OIDC. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ARN peran RAM. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// Nama sesi peran. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Opsional. Menentukan kebijakan inline untuk lebih membatasi izin. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Opsional. Menentukan durasi sesi dalam detik.
		SetRoleSessionExpiration(3600).
		// Opsional. Titik akhir STS. Defaultnya adalah sts.aliyuncs.com. Untuk konektivitas jaringan yang lebih baik, gunakan titik akhir spesifik wilayah.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	oidcCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = oidcCredential
	// Kode untuk menginisialisasi klien produk cloud dengan objek konfigurasi dihilangkan. Untuk informasi lebih lanjut, lihat contoh panggilan API.
}

Contoh API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan kode ini, Anda harus menginstal ECS SDK untuk 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() {
	// Inisialisasi klien Credentials dengan menggunakan ARN Peran OIDC.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("oidc_role_arn").
		// ARN dari penyedia identitas OIDC. Atur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// Jalur file token OIDC. Atur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ARN dari peran RAM. Atur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// Nama sesi peran. Atur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Opsional. Kebijakan inline yang lebih membatasi izin. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Durasi sesi dalam detik.
		SetRoleSessionExpiration(3600)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Konfigurasi titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Tetapkan kredensial ke konfigurasi klien.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 7: Gunakan kredensial URI

Anda dapat mengenkapsulasi Security Token Service (STS) di balik URI layanan, memungkinkan layanan eksternal memperoleh token STS tanpa mengekspos informasi sensitif seperti AK. Tool Credentials kemudian dapat menggunakan URI ini untuk mengambil token STS sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi lebih lanjut, lihat Refresh otomatis kredensial sesi.

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").
                // URI kredensial. Format: http://local_or_remote_uri/. Anda juga dapat mengatur ini dengan menggunakan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
		SetURLCredential("<CredentialsUri>")
	uriCredential, err := credentials.NewCredential(credentialsConfig)
	config := &openapi.Config{}
	config.Credential = uriCredential
	// Kode inisialisasi klien untuk produk cloud dihilangkan demi singkatnya. Untuk informasi lebih lanjut, lihat contoh panggilan API.
}

URI harus memenuhi ketentuan berikut:

  • Mendukung permintaan GET.

  • Badan respons memiliki struktur berikut:

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

Contoh API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Menjalankan contoh ini memerlukan ECS SDK untuk 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").
		// URI kredensial, misalnya, http://local_or_remote_uri/. Atau, atur variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
		SetURLCredential("<CredentialsUri>")
	uriCredential, _err := credentials.NewCredential(config)
	if _err != nil {
		panic(_err)
	}
	ecsConfig := &openapi.Config{}
	// Konfigurasi titik akhir layanan.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasi kredensial.
	ecsConfig.Credential = uriCredential
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi runtime.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 8: Gunakan bearer token

Hanya Cloud Call Center (CCC) yang mendukung inisialisasi kredensial dengan 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").
		// Masukkan bearer token Anda.
		SetBearerToken("<BearerToken>")
	bearerCredential, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = bearerCredential
	// Contoh ini menghilangkan kode inisialisasi klien. Lihat contoh panggilan API untuk implementasi lengkapnya.
}

Contoh API

Contoh ini menunjukkan cara memanggil operasi GetInstance Cloud Call Center. Untuk menjalankan contoh ini, pertama-tama instal CCC SDK.

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) {
	// Inisialisasi klien kredensial dengan menggunakan bearer token.
	credentialsConfig := new(credentials.Config).
		// Tentukan jenis kredensial.
		SetType("bearer").
		SetBearerToken("<BearerToken>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		return _err
	}
	// Inisialisasi klien CCC dengan klien kredensial.
	config := &openapi.Config{}
	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // Tentukan titik akhir layanan.
	config.Credential = credentialClient                         // Konfigurasi kredensial.
	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)
	}
}

Metode 9: Gunakan CLIProfileCredentialsProvider

Mengambil kredensial akses dari file konfigurasi kredensial Alibaba Cloud CLI, 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().
	        // Opsional. Menentukan nama profil. Urutan resolusi: profileName eksplisit > variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE > profil 'current' dalam config.json.
		WithProfileName("<PROFILE_NAME>"). 
		// Opsional. Menentukan jalur ke file konfigurasi (harus berupa file .json). Urutan resolusi: profileFile yang ditentukan > variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE > jalur default ~/.aliyun/config.json.
		WithProfileFile("<PROFILE_FILE_PATH>"). 
		Build()
	if err != nil {
		return
	}
	credential := credentials.FromCredentialsProvider("cli_profile", provider)
	config := &openapi.Config{}
	config.Credential = credential
	// Kode untuk menginisialisasi klien produk cloud dengan objek konfigurasi dihilangkan demi singkatnya.
}

Anda dapat mengonfigurasi kredensial dengan menggunakan Alibaba Cloud CLI, atau membuat file konfigurasi config.json secara manual di jalur berikut:

  • Linux: ~/.aliyun/config.json

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

Konten file harus dalam format berikut:

{
  "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******"
    }
  ]
}

Dalam file config.json, gunakan parameter mode untuk menentukan jenis kredensial:

  • AK: Menggunakan Access Key.

  • StsToken: Menggunakan token STS.

  • RamRoleArn: Mengasumsikan peran RAM dengan menggunakan ARN-nya untuk memperoleh kredensial.

  • EcsRamRole: Mengasumsikan peran RAM yang dilampirkan ke instans ECS untuk memperoleh kredensial.

  • OIDC: Menggunakan ARN penyedia OIDC dan token OIDC untuk memperoleh kredensial.

  • ChainableRamRoleArn: Menggunakan rantai peran, di mana source_profile digunakan untuk menentukan nama kredensial lain dalam file konfigurasi config.json guna mengambil kredensial baru.

  • CloudSSO: Menggunakan kredensial yang diperoleh oleh Pengguna Cloud SSO melalui Alibaba Cloud CLI.

    Catatan

    Kredensial CloudSSO memerlukan versi 1.4.7 atau yang lebih baru dari github.com/aliyun/credentials-go, dan konfigurasi hanya dapat diperoleh dengan menggunakan Alibaba Cloud CLI. Untuk informasi lebih lanjut, lihat Gunakan CLI untuk login ke CloudSSO dan mengakses sumber daya Alibaba Cloud.

Setelah konfigurasi selesai, penyedia menginisialisasi kredensial berdasarkan nama profil yang ditentukan.

Contoh panggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions ECS. Untuk menjalankan contoh ini, Anda harus terlebih dahulu menginstal ECS SDK.

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"). // Opsional. Default ke 'current' dalam config.json.
		// WithProfileFile("/path/to/config.json"). // Opsional. Default ke ~/.aliyun/config.json.
		Build()
	if err != nil {
		return
	}
	credentialClient := credentials.FromCredentialsProvider("cli_profile", provider)
	// Gunakan kredensial untuk menginisialisasi klien ECS.
	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())
}

Rantai penyedia kredensial default

Ketika lingkungan pengembangan dan produksi memerlukan jenis kredensial yang berbeda, umumnya menulis kode kondisional untuk mengambil kredensial berdasarkan lingkungan saat ini. Rantai penyedia kredensial default menyederhanakan proses ini, memungkinkan Anda menggunakan basis kode tunggal dan mengontrol pengambilan kredensial melalui konfigurasi eksternal. Saat Anda menginisialisasi klien kredensial dengan memanggil NewCredential() tanpa parameter apa pun, Alibaba Cloud SDK mencari kredensial dalam urutan berikut.

1. Variabel lingkungan

Jika tidak ditemukan kredensial dalam properti sistem, rantai penyedia kemudian memeriksa variabel lingkungan.

  • Jika ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET keduanya ada dan tidak kosong, rantai penyedia menggunakannya sebagai kredensial default.

  • Jika ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN juga diatur, rantai penyedia menggunakan token STS sebagai kredensial default.

2. Peran RAM OIDC

Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan berikut yang terkait dengan peran RAM OIDC:

  • ALIBABA_CLOUD_ROLE_ARN: ARN dari peran RAM.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.

Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, rantai penyedia menggunakan nilai-nilai ini untuk memanggil API AssumeRoleWithOIDC dari Security Token Service (STS) untuk memperoleh token STS.

3. file config.json

Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, tool Credentials memuat file config.json. Jalur default untuk file ini adalah sebagai berikut:

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

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

Catatan

Mulai dari versi github.com/aliyun/credentials-go@1.4.4, Anda dapat menyesuaikan jalur ke file config.json dengan menggunakan variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE. Variabel lingkungan ini memiliki prioritas lebih tinggi daripada jalur default.

Untuk mengonfigurasi kredensial dengan metode ini, Anda dapat menggunakan Alibaba Cloud CLI atau membuat file config.json secara manual di jalur yang sesuai. Contoh berikut menunjukkan format file:

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

Dalam file config.json, Anda dapat menggunakan parameter mode untuk menentukan jenis kredensial yang berbeda:

  • AK: Menggunakan access key pengguna sebagai kredensial.

  • StsToken: Menggunakan token STS sebagai kredensial.

  • RamRoleArn: Menggunakan ARN peran RAM untuk memperoleh kredensial.

  • EcsRamRole: Menggunakan peran RAM yang dilampirkan ke instans ECS untuk memperoleh kredensial.

  • OIDC: Menggunakan ARN penyedia OIDC dan token OIDC untuk memperoleh kredensial.

  • ChainableRamRoleArn: Menerapkan rantai peran. Gunakan parameter source_profile untuk menentukan profil lain dalam file config.json dari mana kredensial baru diperoleh.

  • OAuth: Menggunakan kredensial yang diperoleh dengan login melalui OAuth menggunakan Alibaba Cloud CLI.

  • CloudSSO: Menggunakan kredensial yang diperoleh oleh Pengguna CloudSSO melalui Alibaba Cloud CLI.

Catatan

Setelah konfigurasi, Credentials menginisialisasi klien dengan menggunakan profil yang ditentukan dalam bidang current file konfigurasi. Anda juga dapat menentukan profil dengan mengatur variabel lingkungan ALIBABA_CLOUD_PROFILE . Misalnya, atur nilai ALIBABA_CLOUD_PROFILE ke client1.

4. Peran RAM instans ECS

Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, Credentials memperolehnya dari peran RAM yang dilampirkan ke instans ECS. Secara default, Credentials menggunakan IMDSv2 untuk mengakses layanan metadata ECS dan mengambil token STS untuk peran RAM instans ECS. Proses ini melibatkan dua permintaan: yang pertama untuk mendapatkan nama peran dari layanan metadata, dan yang kedua untuk mengambil kredensial. Untuk menguranginya menjadi satu permintaan, Anda dapat menentukan nama peran RAM instans secara langsung dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika terjadi kesalahan saat menggunakan IMDSv2, Credentials secara otomatis kembali ke IMDSv1. Anda dapat mengontrol perilaku fallback ini dengan mengatur variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE:

  1. Ketika diatur ke false, tool kembali ke IMDSv1 untuk mengambil kredensial jika permintaan IMDSv2 gagal.

  2. Ketika diatur ke true, tool hanya menggunakan IMDSv2. Jika permintaan gagal, pengecualian dilemparkan.

Dukungan server terhadap IMDSv2 bergantung pada konfigurasi server Anda.

Anda juga dapat menonaktifkan akses kredensial dari layanan metadata ECS dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Catatan

5. URI Kredensial

Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini diatur dan mengarah ke URI yang valid, rantai mengakses URI tersebut untuk mengambil token STS.

Refresh otomatis kredensial sesi

Jenis kredensial sesi, seperti ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri, mendukung refresh otomatis melalui mekanisme bawaan dalam penyedia kredensial. Saat klien kredensial mengambil kredensial untuk pertama kalinya, penyedia menyimpannya dalam cache. Pada operasi berikutnya, instans klien yang sama secara otomatis mengambil kredensial dari cache ini. Jika kredensial yang di-cache telah kedaluwarsa, instans klien mengambil yang baru dan memperbarui cache sesuai.

Catatan

Untuk kredensial ecs_ram_role, penyedia kredensial secara proaktif merefresh-nya 15 menit sebelum kedaluwarsa.

Contoh berikut menggunakan pola singleton untuk membuat klien kredensial. Ini menunjukkan mekanisme refresh dengan mengambil kredensial pada interval waktu berbeda dan memanggil operasi OpenAPI untuk memverifikasi bahwa kredensial tersebut dapat digunakan.

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 mengelola instans singleton kredensial Alibaba Cloud.
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("Inisialisasi kredensial gagal: %v", err)
		}
	})
	return credentialInstance.instance
}
// EcsClient mengelola instans singleton klien ECS.
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("Inisialisasi klien ECS gagal: %v", err)
		}
	})
	return ecsClientInstance.instance
}
// Jalankan tugas utama.
func runTask() {
	cred := GetCredentialInstance()
	credentialModel, err := cred.GetCredential()
	if err != nil {
		log.Printf("Gagal mendapatkan kredensial: %v", err)
		return
	}
	fmt.Println(time.Now())
	fmt.Printf("ID AK: %s, Rahasia AK: %s, Token STS: %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("Panggilan API ECS gagal: %v", err)
		return
	}
	fmt.Printf("Hasil pemanggilan: %d\n", *resp.StatusCode)
}
func main() {
	done := make(chan bool)
	// Mulai goroutine untuk menjalankan tugas terjadwal.
	go func() {
		tick := time.NewTicker(1 * time.Second)
		defer tick.Stop()
		executionCount := 0
		delays := []time.Duration{0, 600, 3600, 100} // Penundaan dalam detik.
		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("Semua tugas selesai. Keluar...")
}
2025-05-29 10:56:24.7142698 +0800 CST m=+1.418627901
ID AK: STS.NXFN xxx 33d7Da, Rahasia AK: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, Token STS:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Hasil pemanggilan: 200
2025-05-29 11:06:25.3225563 +0800 CST m=+602.026914401
ID AK: STS.NXFN xxx 33d7Da, Rahasia AK: 3QdoQASHSyt xxx UGNjZaHsEGXZXc, Token STS:
CAISxAJ1q6Ft5B2yfSjIr5vZBf3Biotj1o6MQGjFgTI2eLwfi/Lvgzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7VsDs194Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx m5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAvw3VhNiQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx D2hT+Bi3HLQztLtlrnMQdpz0agAFDeioHfrugVbFZyY9ggw28Pyx4ckcndsp1cWIU/kwT5HYClH6X7ArciY+H1V01Nh1W7dDFIiwn5htgzQkn1K2xXKA1SNzCjy076rXe7F+BNGES3mUPuTTk
irb467Kb6f3SHj7 xxx J6DPHSj/VzDSAA
Hasil pemanggilan: 200
2025-05-29 12:06:26.039859 +0800 CST m=+4202.744217101
ID AK: STS.NWDS xxx 73kVg5u, Rahasia AK: C3tJCLkszB3 xxx PHGcUroGruw8D, Token STS:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Hasil pemanggilan: 200
2025-05-29 12:08:06.3556621 +0800 CST m=+4303.060020201
ID AK: STS.NWDS xxx 73kVg5u, Rahasia AK: C3tJCLkszB3 xxx PHGcUroGruw8D, Token STS:
CAISxAJ1q6Ft5B2yfSjIr5TxGOKBjrYY1ZCEWmrFr2YUO7xHuaKelzz2IHhMeXZoA4YsPw2mmFW6/sdlqdJQpp/QkjJRNF20plM7Vtz5F96Ipbng4YfgbiJREKxaXeiruwDsz9SNTCAITPD3nPii50x5bjaDymRcbLGJaVi1lhHL91N0vCGlggPtp
NIRZ4o8I3LGbyMe xxx 5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWSMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif5I/DXQEIvUTYbreL6L9mNxRkY6UgHKpJvCxxBmi0fUW5fe3VvPUtVk9O0y3LAsQnUp9tQSHHGKYZGRWSp
XcU6Fux60PxycOS xxx 2hT+Bi3HLQztcMoybMQdpz0agAExoac2PSXrXSXyh4J+ekl0xNIztOFEAJJ2qTkuUgP1AKZIsZYdnX+yHJ1XJpD/yd6pKCEmUSzBwR+Q+S1BmhDANmVRzwUG8QJwxD6bTEvjUwhpGUOKLJL6b
FoBpJJ4WDZRliiw0 xxx y8sGj81a/iiAA
Hasil pemanggilan: 200
Semua tugas selesai. Keluar...

Analisis berdasarkan output log:

  • Pada pemanggilan pertama, cache kosong. Sistem mengambil kredensial berdasarkan konfigurasi Anda dan kemudian menyimpannya dalam cache.

  • Pemanggilan kedua menggunakan kredensial yang sama dengan yang pertama, menunjukkan bahwa kredensial tersebut diambil dari cache.

  • Pada pemanggilan ketiga, kredensial yang di-cache telah kedaluwarsa. Waktu kedaluwarsanya (RoleSessionExpiration) adalah 3.600 detik, tetapi pemanggilan ini dilakukan 4.200 detik setelah yang pertama. Akibatnya, mekanisme refresh otomatis SDK mengambil kredensial baru dan memperbarui cache.

  • Pemanggilan keempat menggunakan kredensial yang sama dengan yang ketiga, mengonfirmasi bahwa cache telah diperbarui.

Dokumen terkait