全部产品
Search
文档中心

Alibaba Cloud SDK:Mengelola kredensial akses

更新时间:Dec 19, 2025

Saat menggunakan Alibaba Cloud SDK, informasi kredensial seperti pasangan AccessKey dan token Security Token Service (STS) dikelola oleh tool Credentials. Topik ini menjelaskan jenis kredensial yang didukung oleh tool Credentials serta cara mengonfigurasinya.

Informasi latar belakang

Kredensial adalah sekumpulan informasi yang disediakan pengguna untuk membuktikan identitasnya. Saat login ke sistem, pengguna harus memberikan kredensial yang valid agar dapat diautentikasi. Jenis kredensial umum meliputi:

  1. AccessKey (AK) permanen untuk Akun Alibaba Cloud atau Pengguna Resource Access Management (RAM). AK merupakan pasangan kunci yang terdiri dari ID AccessKey dan Rahasia AccessKey.

  2. Token Security Token Service (STS) sementara untuk peran RAM Alibaba Cloud. Ini adalah kredensial identitas sementara dengan Waktu hidup (TTL) dan izin akses yang dapat dikustomisasi. Untuk informasi selengkapnya, lihat Apa itu STS?.

  3. Bearer Token, yaitu jenis token untuk autentikasi dan otorisasi.

Prasyarat

Instal tool Credentials

Jika Anda telah menginstal tool Credentials, langkah ini dapat dilewati. Disarankan menggunakan versi terbaru dari paket dependensi Credentials untuk memastikan semua jenis kredensial didukung. Informasi tentang semua versi yang telah dirilis tersedia di Credentials.

Anda dapat menginstal tool Credentials dengan salah satu cara berikut:

  • Metode 1: Jalankan perintah go get untuk mengunduh dan menginstal tool tersebut.

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

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

Parameter konfigurasi tool Credentials

Parameter konfigurasi untuk tool Credentials didefinisikan dalam struct Config dari paket github.com/aliyun/credentials-go/credentials. Jenis kredensial ditentukan oleh parameter wajib type. Setelah jenis kredensial ditentukan, Anda dapat memilih parameter yang sesuai untuk jenis tersebut. Tabel berikut menjelaskan nilai yang valid untuk type serta parameter yang didukung oleh masing-masing jenis kredensial. Dalam tabel ini, menunjukkan parameter wajib, - menunjukkan parameter opsional, dan × menunjukkan parameter yang tidak didukung.

Catatan

Jenis kredensial dan parameter yang tidak tercantum dalam tabel berikut tidak lagi direkomendasikan untuk digunakan.

Type

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

AccessKeyId: ID kredensial akses.

×

×

×

×

AccessKeySecret: Rahasia kredensial akses.

×

×

×

×

SecurityToken: Token STS.

×

-

×

×

×

×

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

×

×

×

×

×

RoleSessionName: Nama sesi kustom. Format default adalah credentials-go-current_timestamp.

×

×

-

×

-

×

×

RoleName: Nama peran RAM.

×

×

×

-

×

×

×

DisableIMDSv1: Menentukan apakah akan menerapkan mode aman. Nilai default adalah false.

×

×

×

-

×

×

×

BearerToken: Token bearer.

×

×

×

×

×

×

Policy: Kebijakan izin kustom.

×

×

-

×

-

×

×

RoleSessionExpiration: Waktu kedaluwarsa sesi. Nilai default adalah 3600 detik.

×

×

-

×

-

×

×

OIDCProviderArn: ARN dari Penyedia Identitas OIDC.

×

×

×

×

×

×

OIDCTokenFilePath: Jalur file token OIDC.

×

×

×

×

×

×

ExternalId: ID eksternal dari peran. Parameter ini digunakan untuk mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Menggunakan ID eksternal untuk mencegah masalah confused deputy.

×

×

-

×

×

×

×

Url: URI kredensial. Parameter ini harus diberi nilai menggunakan SetURLCredential(v string).

×

×

×

×

×

×

STSEndpoint: Titik akhir STS. Titik akhir VPC dan titik akhir jaringan publik didukung. Untuk daftar nilai yang valid, lihat Titik akhir. Nilai default adalah sts.aliyuncs.com.

×

×

-

×

-

×

×

Timeout: Timeout baca untuk permintaan HTTP. Nilai default adalah 5000 milidetik.

×

×

-

-

-

-

×

ConnectTimeout: Timeout koneksi untuk permintaan HTTP. Nilai default adalah 10000 milidetik.

×

×

-

-

-

-

×

Inisialisasi klien kredensial

Bagian berikut menyediakan contoh kode untuk menunjukkan cara menggunakan tool Credentials. Anda dapat memilih metode berdasarkan kebutuhan Anda.

Penting
  • Disarankan menyimpan pasangan AccessKey dalam variabel lingkungan atau file konfigurasi.

  • Disarankan menggunakan pola singleton saat menggunakan tool Credentials. Praktik ini memungkinkan fitur cache kredensial bawaan, mencegah masalah pembatasan kecepatan akibat banyak panggilan API, serta menghindari pemborosan sumber daya karena pembuatan banyak instans. Untuk informasi selengkapnya, lihat Mekanisme auto-refresh untuk kredensial sesi.

Metode 1: Gunakan rantai penyedia kredensial default

Saat menginisialisasi klien kredensial tanpa meneruskan parameter apa pun, tool Credentials akan menginisialisasi klien menggunakan rantai penyedia kredensial default. Untuk informasi selengkapnya tentang logika pembacaan 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() {
	// Jangan tentukan parameter atau teruskan nil.
	credential, err := credentials.NewCredential(nil)
	
	config := &openapi.Config{}
        config.Credential = credential
        // Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari Elastic Compute Service (ECS). 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"
)

func main() {
	// Inisialisasi klien Credentials dengan kredensial default.
	credentialClient, _err := credentials.NewCredential(nil)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 2: Gunakan AK

Tool Credentials menggunakan AccessKey Anda sebagai kredensial akses.

Peringatan

Akun Alibaba Cloud memiliki izin penuh atas semua resource. Jika pasangan AccessKey Akun Alibaba Cloud bocor, hal ini menimbulkan ancaman keamanan serius bagi sistem Anda. Penggunaan pasangan AccessKey Akun Alibaba Cloud tidak direkomendasikan.

Disarankan menggunakan pasangan AccessKey Pengguna RAM yang diberikan izin minimum yang diperlukan.

import (
	"fmt"
	"os"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := 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(config)
	if err != nil {
		return
	}
	
	config := &openapi.Config{}
        config.Credential = akCredential
        // Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. 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 Credentials dengan AK.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("access_key").
		// ID AccessKey.
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		// Rahasia AccessKey.
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 3: Gunakan 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() {
	config := 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 kredensial STS sementara dari variabel lingkungan.
		SetSecurityToken(os.Getenv("ALIBABA_CLOUD_SECURITY_TOKEN"))

	stsCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	
	config := &openapi.Config{}
        config.Credential = stsCredential
        // Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. Anda harus terlebih dahulu menginstal Elastic Compute Service SDK dan Security Token Service 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 menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
	assumeRoleRequest.SetRoleArn("<RoleArn>")
	// Nama sesi peran. Anda dapat mengatur RoleSessionName 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

	// Inisialisasi klien Credentials dengan token STS.
	credentialsConfig := new(credentials.Config).
		// 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{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-hangzhou.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 4: Gunakan AK dan RamRoleArn

Metode ini diimplementasikan menggunakan token STS. Dengan menentukan Nama Sumber Daya Amazon (ARN) dari peran RAM, tool Credentials dapat membantu pengembang mendapatkan token STS dari STS. Anda juga dapat memberikan nilai ke SetPolicy untuk membatasi peran RAM pada 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() {
	config := new(credentials.Config).
		SetType("ram_role_arn").
		SetAccessKeyId(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")).
		SetAccessKeySecret(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")).
		// ARN dari peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur RoleArn menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn("<RoleArn>").
		// Nama sesi peran. Anda dapat mengatur RoleSessionName menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName("<RoleSessionName>").
		// Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Opsional. Waktu kedaluwarsa sesi.
		SetRoleSessionExpiration(3600).
		// Opsional. ID eksternal dari peran. Parameter ini disediakan oleh pihak eksternal untuk merepresentasikan peran dan digunakan untuk mencegah masalah confused deputy.
		SetExternalId("ExternalId").
		// Opsional. Nilai default adalah sts.aliyuncs.com. Kami menyarankan Anda menggunakan nama domain STS spesifik wilayah. Pilih wilayah yang secara geografis lebih dekat dengan Anda untuk memastikan konektivitas jaringan.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")

	arnCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}

	config := &openapi.Config{}
        config.Credential = arnCredential
        // Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}
Catatan

Untuk informasi selengkapnya tentang ExternalId, lihat Menggunakan ID eksternal untuk mencegah masalah confused deputy.

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. 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 Credentials dengan RamRoleArn.
	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. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur RoleArn menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn("<RoleArn>").
		// Nama sesi peran. Anda dapat mengatur RoleSessionName menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName("<RoleSessionName>").
		// Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Opsional. Waktu kedaluwarsa sesi.
		SetRoleSessionExpiration(3600).
		// Opsional. Nilai default adalah sts.aliyuncs.com. Kami menyarankan Anda menggunakan nama domain STS spesifik wilayah. Pilih wilayah yang secara geografis lebih dekat dengan Anda untuk memastikan konektivitas jaringan.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 5: Gunakan peran RAM instans

Baik instans ECS maupun ECI mendukung penyambungan peran RAM instans. Program yang berjalan pada instans ini dapat menggunakan tool Credentials untuk secara otomatis mendapatkan token STS untuk peran tersebut guna menginisialisasi klien kredensial.

Secara default, tool Credentials menggunakan mode aman (IMDSv2) untuk mengakses layanan metadata ECS guna mendapatkan kredensial akses. Jika terjadi pengecualian dalam mode aman, tool tersebut akan kembali ke mode normal untuk mendapatkan kredensial. Anda juga dapat mengatur parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menjalankan logika penanganan pengecualian yang berbeda:

  • Jika nilainya false (default), tool tersebut melanjutkan untuk mendapatkan kredensial akses dalam mode normal.

  • Jika nilainya true, artinya kredensial akses hanya dapat diperoleh dalam mode aman, dan pengecualian akan dilemparkan.

Dukungan IMDSv2 di sisi server bergantung pada konfigurasi server Anda.

Selain itu, Anda dapat menonaktifkan akses kredensial dari metadata 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 Credentials dengan EcsRamRole.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("ecs_ram_role").
		// Opsional. Nama peran ECS. Jika Anda tidak menentukan parameter ini, nama peran akan diperoleh secara otomatis. Kami menyarankan Anda menentukan parameter ini untuk mengurangi jumlah permintaan. Anda dapat mengatur RoleName menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
		SetRoleName("<RoleName>")
	// Opsional. Nilai default adalah false. Jika Anda mengatur parameter ini ke true, mode aman diberlakukan. Jika Anda mengatur parameter ini ke false, sistem pertama-tama mencoba mendapatkan kredensial dalam mode aman. Jika upaya tersebut gagal, sistem beralih ke mode normal (IMDSv1).
	// credentialsConfig.SetDisableIMDSv1(true)
	credentialClient, err := credentials.NewCredential(credentialsConfig)
	if err != nil {
		return
	}
	config := &openapi.Config{}
        config.Credential = credentialClient
        // Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. 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"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func main() {
	// Inisialisasi klien Credentials dengan EcsRamRole.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("ecs_ram_role").
		// Opsional. Nama peran ECS. Jika Anda tidak menentukan parameter ini, nama peran akan diperoleh secara otomatis. Kami menyarankan Anda menentukan parameter ini untuk mengurangi jumlah permintaan. Anda dapat mengatur RoleName menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
		SetRoleName("<RoleName>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 6: Gunakan OIDCRoleArn

Jika Anda menggunakan protokol autentikasi OIDC dan telah membuat peran RAM untuk Penyedia Identitas OIDC, Anda dapat meneruskan ARN Penyedia Identitas OIDC, token OIDC, dan ARN peran RAM ke tool Credentials. Sistem kemudian secara otomatis memanggil operasi AssumeRoleWithOIDC untuk mendapatkan token STS untuk peran RAM dan menggunakan token ini sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung auto-refresh. Untuk informasi selengkapnya, lihat Mekanisme auto-refresh untuk kredensial sesi. Sebagai contoh, jika aplikasi Anda berjalan di kluster ACK tempat fitur RRSA diaktifkan, tool Credentials membaca informasi konfigurasi OIDC dari variabel lingkungan pod, memanggil operasi AssumeRoleWithOIDC untuk mendapatkan token STS untuk peran layanan, dan menggunakan token ini untuk mengakses layanan Alibaba Cloud terkait.

package main

import (
	"fmt"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/aliyun/credentials-go/credentials"
	"os"
)

func main() {
	config := new(credentials.Config).
		SetType("oidc_role_arn").
		// ARN dari Penyedia Identitas OIDC. Anda dapat mengatur OidcProviderArn menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// Jalur file token OIDC. Anda dapat mengatur OidcTokenFilePath menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ARN dari peran RAM. Anda dapat mengatur RoleArn menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// Nama sesi peran. Anda dapat mengatur RoleSessionName menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Opsional. Waktu kedaluwarsa sesi.
		SetRoleSessionExpiration(3600).
		// Opsional. Nilai default adalah sts.aliyuncs.com. Kami menyarankan Anda menggunakan nama domain STS spesifik wilayah. Pilih wilayah yang secara geografis lebih dekat dengan Anda untuk memastikan konektivitas jaringan.
		SetSTSEndpoint("sts.cn-hangzhou.aliyuncs.com")
	oidcCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	
	config := &openapi.Config{}
	config.Credential = oidcCredential
	// Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. Anda harus terlebih dahulu menginstal ECS SDK.

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 OIDCRoleArn.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("oidc_role_arn").
		// ARN dari Penyedia Identitas OIDC. Anda dapat mengatur OidcProviderArn menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
		SetOIDCProviderArn(os.Getenv("ALIBABA_CLOUD_OIDC_PROVIDER_ARN")).
		// Jalur file token OIDC. Anda dapat mengatur OidcTokenFilePath menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
		SetOIDCTokenFilePath(os.Getenv("ALIBABA_CLOUD_OIDC_TOKEN_FILE")).
		// ARN dari peran RAM. Anda dapat mengatur RoleArn menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
		SetRoleArn(os.Getenv("ALIBABA_CLOUD_ROLE_ARN")).
		// Nama sesi peran. Anda dapat mengatur RoleSessionName menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
		SetRoleSessionName(os.Getenv("ALIBABA_CLOUD_ROLE_SESSION_NAME")).
		// Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
		SetPolicy("<Policy>").
		// Waktu kedaluwarsa sesi.
		SetRoleSessionExpiration(3600)
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = credentialClient
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 7: Gunakan kredensial URI

Dengan mengenkapsulasi layanan STS dan mengekspos URI-nya, layanan eksternal dapat memperoleh token STS melalui URI tersebut. Hal ini mengurangi risiko mengekspos informasi sensitif, seperti pasangan AccessKey. Tool Credentials memperoleh token STS dengan mengakses URI yang Anda berikan dan menggunakan token ini sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung auto-refresh. Untuk informasi selengkapnya, lihat Mekanisme auto-refresh untuk kredensial sesi.

package main

import (
	"github.com/aliyun/credentials-go/credentials"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
                // URI kredensial. Formatnya adalah http://local_or_remote_uri/. Anda dapat mengatur CredentialsUri menggunakan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
		SetURLCredential("<CredentialsUri>")

	uriCredential, err := credentials.NewCredential(config)
	config := &openapi.Config{}
	config.Credential = uriCredential
	// Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Alamat tersebut harus memenuhi kondisi berikut:

  • Harus mendukung permintaan GET.

  • Badan respons harus memiliki struktur berikut:

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

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. 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"
	credentials "github.com/aliyun/credentials-go/credentials"
)

func main() {
	config := new(credentials.Config).
		SetType("credentials_uri").
		// URI kredensial. Formatnya adalah http://local_or_remote_uri/. Anda dapat mengatur CredentialsUri menggunakan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
		SetURLCredential("<CredentialsUri>")

	uriCredential, _err := credentials.NewCredential(config)
	if _err != nil {
		panic(_err)
	}

	ecsConfig := &openapi.Config{}
	// Konfigurasikan titik akhir produk cloud.
	ecsConfig.Endpoint = tea.String("ecs.cn-beijing.aliyuncs.com")
	// Konfigurasikan kredensial menggunakan Credentials.
	ecsConfig.Credential = uriCredential
	// Inisialisasi klien ECS.
	ecsClient, _err := ecs20140526.NewClient(ecsConfig)
	// Inisialisasi permintaan DescribeRegions.
	describeInstancesRequest := &ecs20140526.DescribeRegionsRequest{}
	// Inisialisasi konfigurasi waktu proses.
	runtime := &util.RuntimeOptions{}
	// Panggil operasi DescribeRegions dan dapatkan tanggapan.
	response, _err := ecsClient.DescribeRegionsWithOptions(describeInstancesRequest, runtime)
	if _err != nil {
		panic(_err)
	}
	panic(response.Body.String())
}

Metode 8: Gunakan Bearer Token

Saat ini, 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() {
	config := new(credentials.Config).
		SetType("bearer").
		// Masukkan Bearer Token Anda.
		SetBearerToken("<BearerToken>")
	bearerCredential, err := credentials.NewCredential(config)
	if err != nil {
		return
	}
	config := &openapi.Config{}
	config.Credential = bearerCredential
	// Kode untuk menginisialisasi klien produk cloud menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi GetInstance dari CCC. Anda harus terlebih dahulu menginstal 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 Credentials dengan Bearer Token.
	credentialsConfig := new(credentials.Config).
		// Jenis kredensial.
		SetType("bearer").
		SetBearerToken("<BearerToken>")
	credentialClient, _err := credentials.NewCredential(credentialsConfig)
	if _err != nil {
		return _err
	}

	// Inisialisasi klien CCC dengan klien Credentials.
	config := &openapi.Config{}
	config.Endpoint = tea.String("ccc.cn-shanghai.aliyuncs.com") // Konfigurasikan titik akhir produk cloud.
	config.Credential = credentialClient                         // Konfigurasikan kredensial menggunakan Credentials.
	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

Anda dapat memperoleh 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. Nama kredensial. Anda dapat mengonfigurasi parameter ini dengan beberapa cara. Prioritasnya sebagai berikut: profileName yang ditentukan secara eksplisit > profileName yang ditentukan oleh variabel lingkungan ALIBABA_CLOUD_PROFILE > profil saat ini di config.json.
		WithProfileName("<PROFILE_NAME>"). 
		// Opsional. Jalur file konfigurasi, yang harus berupa file .json. Anda dapat mengonfigurasi parameter ini dengan beberapa cara. Prioritasnya sebagai berikut: profileFile yang ditentukan secara eksplisit > profileFile yang ditentukan oleh 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 menggunakan konfigurasi dihilangkan. Untuk informasi selengkapnya, lihat contoh pemanggilan API.
}

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

  • Linux: ~/.aliyun/config.json

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

Format isinya sebagai 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, Anda dapat menggunakan parameter mode untuk menentukan kredensial yang berbeda:

  • AK: Menggunakan AccessKey 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 OIDC dan token OIDC untuk memperoleh kredensial.

  • ChainableRamRoleArn: Menggunakan rantai peran. Menentukan nama kredensial lain dalam file config.json menggunakan source_profile untuk memperoleh kredensial baru.

  • CloudSSO: Kredensial yang diperoleh pengguna CloudSSO menggunakan Alibaba Cloud CLI.

    Catatan

    Kredensial CloudSSO memerlukan versi 1.4.7 atau yang lebih baru dari github.com/aliyun/credentials-go. Konten konfigurasi hanya dapat diperoleh menggunakan Alibaba Cloud CLI. Untuk informasi selengkapnya, lihat Menggunakan CLI untuk login ke CloudSSO dan mengakses resource Alibaba Cloud.

Setelah konfigurasi selesai, tool Credentials menginisialisasi klien kredensial berdasarkan nama kredensial yang ditentukan oleh parameter `current`.

Contoh pemanggilan API

Contoh ini menunjukkan cara memanggil operasi DescribeRegions dari ECS. 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. Sistem membaca profil saat ini dari config.json secara default.
		// WithProfileFile("/path/to/config.json"). // Opsional. Sistem membaca dari ~/.aliyun/config.json secara default.
		Build()
	if err != nil {
		return
	}

	credentialClient := credentials.FromCredentialsProvider("cli_profile", provider)

	// Inisialisasi klien ECS dengan Credentials.
	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

Saat jenis kredensial yang digunakan di lingkungan pengembangan dan produksi berbeda, Anda biasanya menulis kode cabang untuk memperoleh kredensial yang berbeda berdasarkan lingkungan saat ini. Rantai penyedia kredensial default dari tool Credentials memungkinkan Anda menggunakan kode yang sama dan mengontrol cara memperoleh kredensial di lingkungan yang berbeda melalui konfigurasi eksternal. Saat menginisialisasi klien kredensial menggunakan NewCredential() tanpa meneruskan parameter apa pun, Alibaba Cloud SDK mencoba menemukan kredensial dalam urutan berikut.

1. Variabel lingkungan

Jika tidak ditemukan informasi kredensial dalam properti sistem, tool Credentials memeriksa variabel lingkungan.

  • Jika variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET ada dan tidak kosong, pasangan AccessKey digunakan sebagai kredensial default.

  • Jika variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN semuanya diatur, token STS digunakan sebagai kredensial default.

2. Peran RAM OIDC

Jika tidak ditemukan informasi kredensial, tool Credentials 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 Identitas OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.

Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, tool Credentials menggunakan nilai variabel lingkungan ini untuk memanggil operasi AssumeRoleWithOIDC dari STS dan memperoleh token STS sebagai kredensial default.

3. File konfigurasi config.json

Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, tool Credentials mencoba memuat file konfigurasi config.json. Jalur lengkap default file konfigurasi 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 menggunakan variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE untuk menyesuaikan jalur file config.json. Variabel lingkungan ini memiliki prioritas lebih tinggi daripada jalur default.

Untuk mengonfigurasi kredensial akses dengan cara ini, Anda dapat menggunakan Alibaba Cloud CLI untuk mengonfigurasi kredensial atau membuat file config.json secara manual di jalur yang sesuai. Berikut adalah contoh format isinya:

{
    "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 kredensial yang berbeda:

  • AK: Menggunakan AccessKey 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 OIDC dan token OIDC untuk memperoleh kredensial.

  • ChainableRamRoleArn: Menggunakan rantai peran. Menentukan nama kredensial lain dalam file config.json menggunakan source_profile untuk memperoleh kredensial baru.

  • OAuth: Kredensial yang diperoleh menggunakan CLI untuk login dengan OAuth.

  • CloudSSO: Kredensial yang diperoleh pengguna CloudSSO menggunakan Alibaba Cloud CLI.

Catatan

Setelah konfigurasi selesai, tool Credentials menginisialisasi klien kredensial berdasarkan nama kredensial yang ditentukan oleh parameter current dalam file konfigurasi. Anda juga dapat menentukan nama kredensial menggunakan variabel lingkungan ALIBABA_CLOUD_PROFILE. Misalnya, Anda dapat mengatur nilai ALIBABA_CLOUD_PROFILE menjadi client1.

4. Peran RAM instans

Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, tool Credentials mencoba memperoleh kredensial dari peran RAM yang dilampirkan ke instans ECS. Secara default, tool Credentials menggunakan mode aman (IMDSv2) untuk mengakses layanan metadata ECS guna memperoleh token STS dari peran RAM instans sebagai kredensial default. Program secara otomatis mengakses layanan metadata ECS untuk mengambil RoleName dan kemudian memperoleh kredensial, yang melibatkan dua permintaan. Untuk menguranginya menjadi satu permintaan, Anda dapat langsung mengonfigurasi variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk menentukan nama peran RAM instans. Jika terjadi pengecualian dalam mode aman, tool tersebut akan kembali ke mode normal untuk memperoleh kredensial akses. Anda juga dapat mengatur variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menjalankan logika penanganan pengecualian yang berbeda:

  1. Jika nilainya false, tool tersebut melanjutkan untuk memperoleh kredensial akses dalam mode normal.

  2. Jika nilainya true, artinya kredensial akses hanya dapat diperoleh dalam mode aman, dan pengecualian akan dilemparkan.

Dukungan IMDSv2 di sisi server bergantung pada konfigurasi server Anda.

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

Catatan

5. URI tool Credentials

Jika tidak ditemukan informasi kredensial, tool Credentials memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini ada dan mengarah ke URI yang valid, tool Credentials mengakses URI ini untuk memperoleh token STS sebagai kredensial default.

Mekanisme auto-refresh untuk kredensial berbasis sesi

Kredensial sesi mencakup ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri. Jenis kredensial ini memiliki mekanisme auto-refresh bawaan dalam tool Credentials. Setelah klien kredensial memperoleh kredensial untuk pertama kalinya, tool Credentials menyimpan informasi kredensial ke cache. Dalam permintaan berikutnya, instans klien kredensial yang sama secara otomatis mengambil kredensial dari cache. Jika kredensial dalam cache telah kedaluwarsa, instans klien kredensial tersebut memperoleh kembali kredensial dan memperbarui cache.

Catatan

Untuk kredensial `ecs_ram_role`, tool Credentials menyegarkan cache 15 menit sebelum kredensial kedaluwarsa.

Contoh berikut membuat klien kredensial dalam pola singleton. Klien memperoleh kredensial pada titik waktu yang berbeda untuk memverifikasi mekanisme auto-refresh dan memanggil operasi OpenAPI untuk memastikan kredensial yang diperoleh valid.

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.com/alibabacloud-go/tea-utils/v2/service"
	"github.com/alibabacloud-go/tea/tea"
	"github.com/aliyun/credentials-go/credentials"
)

// Credential adalah struct singleton yang digunakan untuk mengelola instans 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 adalah struct singleton yang digunakan untuk mengelola instans 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("Pemanggilan 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} // Waktu tunda 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...")
}

image

Bagian berikut menganalisis hasil log:

  • Pada pemanggilan pertama, tidak ada informasi kredensial yang di-cache. Oleh karena itu, sistem memperoleh kredensial berdasarkan konfigurasi. Setelah kredensial diperoleh, kredensial tersebut disimpan dalam cache.

  • Kredensial yang digunakan dalam pemanggilan kedua sama dengan yang pertama. Ini menunjukkan bahwa kredensial untuk pemanggilan kedua diambil dari cache.

  • Pada pemanggilan ketiga, kredensial dalam cache telah kedaluwarsa. Hal ini karena periode validitas kredensial (`RoleSessionExpiration`) diatur menjadi 3.600 detik, dan pemanggilan ketiga terjadi 4.200 detik setelah pemanggilan pertama. Oleh karena itu, SDK memperoleh kembali kredensial baru berdasarkan mekanisme auto-refresh dan menyimpan kredensial baru ke cache.

  • Kredensial yang digunakan dalam pemanggilan keempat sama dengan kredensial baru yang diperoleh dalam pemanggilan ketiga. Ini menunjukkan bahwa kredensial dalam cache telah diperbarui setelah kedaluwarsa.

Referensi