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:
-
AccessKey adalah kredensial jangka panjang untuk Akun Alibaba Cloud atau Pengguna RAM, berupa pasangan kunci yang terdiri dari ID AccessKey dan Rahasia AccessKey.
-
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.
-
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 getuntuk menginstal Alibaba Cloud Credentials:$ go get -u github.com/aliyun/credentials-go -
Metode 2: Jika Anda menggunakan
depuntuk 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.
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 |
× |
× |
- |
× |
- |
× |
× |
|
RoleName: Nama peran RAM. |
× |
× |
× |
- |
× |
× |
× |
|
DisableIMDSv1: Atur ke true untuk menerapkan mode penguatan keamanan. Nilai defaultnya adalah |
× |
× |
× |
- |
× |
× |
× |
|
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 |
× |
× |
- |
× |
- |
× |
× |
|
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.
-
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
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
Metode 2: AccessKey
Tool Credentials menggunakan AccessKey yang Anda berikan sebagai kredensial akses.
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
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
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.
}
Untuk mempelajari lebih lanjut tentang ID eksternal, lihat Mencegah masalah confused deputy dengan ID eksternal.
Contoh API
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.
-
Menggunakan mode penguatan keamanan untuk memperoleh token STS memerlukan
credentials-goversi 1.3.10 atau yang lebih baru. -
Untuk informasi lebih lanjut tentang metadata instans ECS, lihat Metadata instans.
-
Untuk memberikan peran RAM ke instans ECS atau ECI, lihat Langkah 1: Buat peran RAM 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 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
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
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
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
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_profiledigunakan untuk menentukan nama kredensial lain dalam file konfigurasiconfig.jsonguna mengambil kredensial baru. -
CloudSSO: Menggunakan kredensial yang diperoleh oleh Pengguna Cloud SSO melalui Alibaba Cloud CLI.
CatatanKredensial 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
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
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_profileuntuk menentukan profil lain dalam fileconfig.jsondari 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.
-
Kredensial OAuth memerlukan
github.com/aliyun/credentials-goversi 1.4.8 atau yang lebih baru. Konfigurasi hanya dapat diperoleh dengan menggunakan Alibaba Cloud CLI. Untuk informasi lebih lanjut, lihat Gunakan CLI untuk memperoleh kredensial OAuth. -
Kredensial CloudSSO memerlukan
github.com/aliyun/credentials-goversi 1.4.7 atau yang lebih baru. Konfigurasi hanya dapat diperoleh dengan menggunakan Alibaba Cloud CLI. Untuk informasi lebih lanjut, lihat Gunakan Alibaba Cloud CLI untuk login ke CloudSSO dan mengakses sumber daya Alibaba Cloud.
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:
-
Ketika diatur ke
false, tool kembali ke IMDSv1 untuk mengambil kredensial jika permintaan IMDSv2 gagal. -
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.
-
Untuk informasi lebih lanjut tentang metadata instans ECS, lihat Metadata instans.
-
Untuk petunjuk cara memberikan peran RAM ke instans ECS atau ECI, lihat Langkah 1: Buat peran RAM dan Berikan peran RAM instans ke instans ECI.
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.
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
-
Untuk ikhtisar konsep dasar RAM, lihat Konsep dasar.
-
Untuk membuat AccessKey, lihat Buat AccessKey.
-
Untuk membuat Pengguna RAM, AccessKey, dan peran RAM secara terprogram; mendefinisikan kebijakan izin; dan memberikan izin, lihat Ikhtisar SDK RAM.
-
Untuk mengasumsikan peran secara terprogram, lihat Ikhtisar SDK STS.
-
Untuk detail tentang API RAM dan STS, lihat Referensi API.
-
Praktik terbaik untuk menggunakan kredensial akses dalam memanggil Alibaba Cloud OpenAPI