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:
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.
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?.
Bearer Token, yaitu jenis token untuk autentikasi dan otorisasi.
Prasyarat
Diperlukan Go versi 1.10.x atau yang lebih baru untuk menggunakan tool Credentials.
Gunakan Alibaba Cloud SDK untuk Go V2.0. Untuk informasi selengkapnya, lihat Menggunakan Alibaba Cloud SDK untuk Go di IDE.
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 getuntuk mengunduh dan menginstal tool tersebut.$ go get -u github.com/aliyun/credentials-goMetode 2: Jika Anda menggunakan
depuntuk 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.
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 | × | × | - | × | - | × | × |
RoleName: Nama peran RAM. | × | × | × | - | × | × | × |
DisableIMDSv1: Menentukan apakah akan menerapkan mode aman. Nilai default adalah | × | × | × | - | × | × | × |
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 | × | × | - | × | - | × | × |
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.
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
Metode 2: Gunakan AK
Tool Credentials menggunakan AccessKey Anda sebagai kredensial akses.
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
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
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.
}
Untuk informasi selengkapnya tentang ExternalId, lihat Menggunakan ID eksternal untuk mencegah masalah confused deputy.
Contoh pemanggilan API
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.
Untuk mendapatkan kredensial identitas sementara dalam mode aman, versi credentials-go harus 1.3.10 atau yang lebih baru.
Untuk informasi selengkapnya tentang metadata instans ECS, lihat Metadata instans.
Untuk informasi selengkapnya tentang cara memberikan peran RAM ke instans ECS atau ECI, lihat Buat peran RAM dan berikan ke instans ECS dan Berikan peran RAM instans ke instans ECI.
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
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
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
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
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.jsonWindows:
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.jsonmenggunakansource_profileuntuk memperoleh kredensial baru.CloudSSO: Kredensial yang diperoleh pengguna CloudSSO menggunakan Alibaba Cloud CLI.
CatatanKredensial 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
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.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
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.jsonmenggunakansource_profileuntuk memperoleh kredensial baru.OAuth: Kredensial yang diperoleh menggunakan CLI untuk login dengan OAuth.
CloudSSO: Kredensial yang diperoleh pengguna CloudSSO menggunakan Alibaba Cloud CLI.
Kredensial OAuth memerlukan versi 1.4.8 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 memperoleh kredensial OAuth.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 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:
Jika nilainya false, tool tersebut melanjutkan untuk memperoleh 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.
Untuk informasi selengkapnya tentang metadata instans ECS, lihat Metadata instans.
Untuk informasi selengkapnya tentang cara memberikan peran RAM ke instans ECS atau ECI, lihat Buat peran RAM dan berikan ke instans ECS dan Berikan peran RAM instans ke instans ECI.
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.
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...")
}

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
Untuk informasi selengkapnya tentang RAM, lihat Kata kunci.
Untuk informasi selengkapnya tentang cara membuat pasangan AccessKey, lihat Buat pasangan AccessKey.
Untuk informasi selengkapnya tentang cara membuat Pengguna RAM, pasangan AccessKey, peran RAM, dan kebijakan akses secara terprogram serta memberikan izin, lihat Ikhtisar SDK RAM.
Untuk informasi selengkapnya tentang cara mengasumsikan peran secara terprogram, lihat Ikhtisar SDK STS.
Untuk informasi selengkapnya tentang operasi API terkait RAM dan STS, lihat Referensi API.
Praktik terbaik untuk menggunakan kredensial akses untuk memanggil operasi API