Saat menggunakan Alibaba Cloud SDK, informasi kredensial seperti pasangan AccessKey dan token Security Token Service (STS) dikelola oleh alat Credentials. Topik ini menjelaskan jenis-jenis kredensial yang didukung oleh alat Credentials serta cara mengonfigurasinya.
Informasi latar belakang
Kredensial adalah sekumpulan informasi yang digunakan pengguna untuk membuktikan identitasnya. Saat masuk ke sistem, pengguna harus memberikan kredensial yang valid untuk verifikasi identitas. Jenis kredensial umum meliputi hal-hal berikut:
AccessKey (AK) permanen dari Akun Alibaba Cloud atau Pengguna Resource Access Management (RAM). AccessKey merupakan pasangan kunci yang terdiri dari ID AccessKey dan Rahasia AccessKey.
Token STS sementara dari peran RAM Alibaba Cloud. Ini adalah kredensial identitas sementara dengan periode validitas dan izin akses yang dapat dikustomisasi. Untuk informasi selengkapnya, lihat Apa itu STS?.
Token Bearer, yaitu jenis token untuk verifikasi identitas dan otorisasi.
Prasyarat
Diperlukan Go versi 1.10.x atau lebih baru untuk menggunakan alat Credentials.
Diperlukan Alibaba Cloud SDK untuk Go V2. Untuk informasi selengkapnya, lihat Gunakan Alibaba Cloud SDK untuk Go di IDE.
Instal alat Credentials
Anda dapat menggunakan
go getuntuk mengunduh dan menginstal alat tersebut.$ go get -u github.com/aliyun/credentials-goJika Anda menggunakan
depuntuk mengelola paket dependensi, jalankan perintah berikut.dep ensure -add github.com/aliyun/credentials-go
Gunakan versi terbaru dari paket dependensi Credentials untuk memastikan semua jenis kredensial didukung.
Konfigurasi parameter alat Credentials
Parameter konfigurasi untuk alat 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 harus menyediakan parameter yang sesuai. Tabel berikut menjelaskan nilai yang valid untuk type serta parameter yang didukung oleh masing-masing jenis kredensial. Tanda √ menunjukkan parameter wajib, tanda - menunjukkan parameter opsional, dan tanda × menunjukkan parameter yang tidak didukung.
Jenis kredensial dan parameter yang tidak tercantum dalam tabel berikut tidak disarankan.
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 Gunakan ExternalId untuk mencegah masalah confused deputy. | × | × | - | × | × | × | × |
Url: URI kredensial. Anda harus memberikan nilai untuk parameter ini dengan memanggil SetURLCredential(v string). | × | × | × | × | × | √ | × |
STSEndpoint: Endpoint STS. Mendukung Endpoint VPC dan Internet. Untuk informasi selengkapnya tentang nilai yang valid, lihat Endpoint. Nilai default adalah | × | × | - | × | - | × | × |
Timeout: Batas waktu baca untuk permintaan HTTP. Nilai default adalah 5000 milidetik. | × | × | - | - | - | - | × |
ConnectTimeout: Batas waktu koneksi untuk permintaan HTTP. Nilai default adalah 10000 milidetik. | × | × | - | - | - | - | × |
Inisialisasi klien kredensial
Bagian-bagian berikut menyediakan contoh kode untuk menunjukkan cara menggunakan alat Credentials. Anda dapat memilih metode berdasarkan kebutuhan Anda.
Kami menyarankan agar Anda menyimpan pasangan AccessKey dalam variabel lingkungan atau file konfigurasi.
Kami menyarankan agar Anda menerapkan pola singleton saat menggunakan alat Credentials. Praktik ini mengaktifkan fitur caching kredensial bawaan, mencegah masalah throttling akibat banyak panggilan API, serta menghindari pemborosan sumber daya karena pembuatan banyak instans. Untuk informasi selengkapnya, lihat Mekanisme penyegaran otomatis untuk kredensial sesi.
Metode 1: Gunakan rantai penyedia kredensial default
Saat Anda menginisialisasi klien kredensial tanpa meneruskan parameter apa pun, Credentials menginisialisasi klien menggunakan rantai penyedia kredensial default. Untuk informasi selengkapnya tentang cara membaca 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
Alat Credentials menggunakan AccessKey Anda sebagai kredensial akses.
Akun Alibaba Cloud memiliki izin penuh atas semua sumber daya. Jika pasangan AccessKey dari Akun Alibaba Cloud bocor, hal ini menimbulkan ancaman keamanan serius bagi sistem Anda. Kami tidak merekomendasikan penggunaan pasangan AccessKey dari Akun Alibaba Cloud.
Kami menyarankan agar Anda menggunakan pasangan AccessKey dari 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
Alat 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 berdasarkan token STS. Saat Anda menentukan ARN dari peran RAM, alat Credentials mendapatkan token STS dari STS. Anda juga dapat memberikan nilai ke SetPolicy untuk membatasi peran RAM pada seperangkat 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. Tetapkan kebijakan izin yang lebih ketat. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// Opsional. Tetapkan waktu kedaluwarsa sesi.
SetRoleSessionExpiration(3600).
// Opsional. ID eksternal dari peran. Parameter ini disediakan oleh pihak eksternal untuk mengidentifikasi peran dan digunakan untuk mencegah masalah confused deputy.
SetExternalId("ExternalId").
// Opsional. Nilai default adalah sts.aliyuncs.com. Kami menyarankan agar Anda menggunakan nama domain STS spesifik wilayah. Pilih wilayah yang 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 Gunakan ExternalId untuk mencegah masalah confused deputy.
Contoh pemanggilan API
Metode 5: Gunakan peran RAM instans ECS
Instans ECS dan ECI dapat memiliki peran RAM instans yang dilampirkan. Program yang berjalan pada instans tersebut dapat secara otomatis mengambil token STS untuk peran tersebut melalui alat Credentials guna menginisialisasi klien kredensial.
Secara default, alat Credentials mengakses Instance Metadata Service (IMDS) dari ECS dalam mode aman (IMDSv2). Jika terjadi pengecualian dalam mode aman, alat tersebut menggunakan mode normal sebagai cadangan untuk mengambil kredensial akses. Anda juga dapat mengatur parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menentukan logika penanganan pengecualian:
Jika nilainya false (default), alat tersebut melanjutkan pengambilan kredensial akses dalam mode normal.
Jika nilainya true, alat tersebut hanya dapat mengambil kredensial akses dalam mode aman. Pengecualian dilemparkan jika upaya tersebut gagal.
Dukungan server terhadap IMDSv2 bergantung pada konfigurasi server Anda.
Anda juga dapat menonaktifkan akses kredensial ke 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 lebih baru.
Untuk informasi selengkapnya tentang metadata instans ECS, lihat Metadata instans.
Untuk informasi selengkapnya tentang cara memberikan peran RAM kepada instans ECS dan 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 diambil secara otomatis. Kami menyarankan agar Anda menentukan parameter ini untuk mengurangi jumlah permintaan. Anda dapat mengatur RoleName menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
SetRoleName("<RoleName>")
// Opsional. Nilai default: 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 alat 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 penyegaran otomatis. Untuk informasi selengkapnya, lihat Mekanisme penyegaran otomatis untuk kredensial sesi. Sebagai contoh, jika aplikasi Anda berjalan di kluster ACK tempat fitur RRSA diaktifkan, alat 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. Tetapkan kebijakan izin yang lebih ketat. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
SetPolicy("<Policy>").
// Opsional. Tetapkan waktu kedaluwarsa sesi.
SetRoleSessionExpiration(3600).
// Opsional. Nilai default adalah sts.aliyuncs.com. Kami menyarankan agar Anda menggunakan nama domain STS spesifik wilayah. Pilih wilayah yang 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 terpaparnya informasi sensitif, seperti pasangan AccessKey. Alat Credentials memperoleh token STS dengan mengakses URI yang Anda berikan dan menggunakan token ini sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung penyegaran otomatis. Untuk informasi selengkapnya, lihat Mekanisme penyegaran otomatis 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 persyaratan berikut:
Mendukung permintaan GET.
Badan respons memiliki struktur berikut:
{ "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Contoh pemanggilan API
Metode 8: Gunakan Token Bearer
Saat ini, hanya Cloud Call Center (CCC) yang mendukung inisialisasi kredensial dengan Token Bearer.
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 Token Bearer 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
Metode ini 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().
// Nama kredensial. Parameter ini opsional. Anda dapat mengonfigurasi parameter ini dengan beberapa cara. Prioritasnya diurutkan dari yang tertinggi ke terendah: profileName yang ditentukan secara eksplisit -> profileName yang ditentukan oleh variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE -> profil saat ini dalam file config.json.
WithProfileName("<PROFILE_NAME>").
// Jalur file konfigurasi. File tersebut harus berupa file .json. Parameter ini opsional. Anda dapat mengonfigurasi parameter ini dengan beberapa cara. Prioritasnya diurutkan dari yang tertinggi ke terendah: profileFile yang ditentukan secara eksplisit -> profileFile yang ditentukan oleh variabel lingkungan ALIBABA_CLOUD_CONFIG_FILE -> file 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 membuat file konfigurasi config.json secara manual di jalur berikut:
Linux:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Berikut ini format file tersebut:
{
"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 konfigurasi config.json, Anda dapat menggunakan 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. Ini menentukan nama kredensial lain dalam file
config.jsonmelaluisource_profileuntuk memperoleh kredensial baru.CloudSSO: Kredensial yang diperoleh oleh Pengguna CloudSSO menggunakan Alibaba Cloud CLI.
CatatanKredensial CloudSSO memerlukan versi 1.4.7 atau lebih baru dari
github.com/aliyun/credentials-go. Konfigurasi hanya dapat diperoleh melalui Alibaba Cloud CLI. Untuk informasi selengkapnya, lihat Gunakan CLI untuk masuk ke CloudSSO dan mengakses sumber daya Alibaba Cloud.
Setelah konfigurasi selesai, Credentials menginisialisasi klien kredensial dengan kredensial yang sesuai dengan nama kredensial yang ditentukan.
Contoh pemanggilan API
Rantai penyedia kredensial default
Jika jenis kredensial yang digunakan di lingkungan pengembangan dan produksi berbeda, Anda biasanya menulis kode cabang untuk mengambil kredensial berbeda berdasarkan lingkungan saat ini. Rantai penyedia kredensial default dari alat Credentials memungkinkan Anda menggunakan kode yang sama dan mengontrol cara pengambilan kredensial di lingkungan berbeda melalui konfigurasi di luar program. Saat Anda menggunakan NewCredential() untuk menginisialisasi klien kredensial tanpa meneruskan parameter apa pun, Alibaba Cloud SDK mencoba mengambil informasi kredensial terkait dalam urutan berikut.
1. Variabel lingkungan
Jika tidak ditemukan informasi kredensial dalam properti sistem, alat 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, alat 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, alat Credentials menggunakan nilai variabel lingkungan tersebut untuk memanggil operasi AssumeRoleWithOIDC dari STS dan memperoleh token STS sebagai kredensial default.
3. File konfigurasi config.json
Jika tidak ditemukan informasi kredensial dengan prioritas lebih tinggi, alat 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 konfigurasi 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 konfigurasi config.json secara manual di jalur yang sesuai. Kode berikut memberikan contoh format file tersebut:
{
"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 konfigurasi config.json, Anda dapat menggunakan 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. Ini menentukan nama kredensial lain dalam file
config.jsonmelaluisource_profileuntuk memperoleh kredensial baru.OAuth: Kredensial yang diperoleh menggunakan CLI melalui login OAuth.
CloudSSO: Kredensial yang diperoleh oleh Pengguna CloudSSO menggunakan Alibaba Cloud CLI.
Kredensial OAuth memerlukan versi 1.4.8 atau lebih baru dari
github.com/aliyun/credentials-go. Konfigurasi hanya dapat diperoleh melalui Alibaba Cloud CLI. Untuk informasi selengkapnya, lihat Gunakan CLI untuk memperoleh kredensial OAuth.Kredensial CloudSSO memerlukan versi 1.4.7 atau lebih baru dari
github.com/aliyun/credentials-go. Konfigurasi hanya dapat diperoleh melalui Alibaba Cloud CLI. Untuk informasi selengkapnya, lihat Gunakan CLI untuk masuk ke CloudSSO dan mengakses sumber daya Alibaba Cloud.
Setelah konfigurasi selesai, Credentials menginisialisasi klien kredensial dengan kredensial yang ditentukan oleh current dalam file konfigurasi. Anda juga dapat menentukan nama kredensial menggunakan variabel lingkungan ALIBABA_CLOUD_PROFILE . Misalnya, atur nilai ALIBABA_CLOUD_PROFILE menjadi client1.
4. Peran RAM instans ECS
Jika tidak ditemukan informasi kredensial dengan prioritas lebih tinggi, Credentials mencoba mengambil kredensial menggunakan peran RAM yang dilampirkan ke instans ECS. Secara default, Credentials mengakses IMDS dari ECS dalam mode aman (IMDSv2) untuk mengambil token STS dari peran RAM instans ECS sebagai kredensial default. Program secara otomatis mengakses IMDS dari ECS untuk mendapatkan informasi RoleName, lalu mengambil kredensial. Proses ini melibatkan dua permintaan. Untuk mengurangi jumlah permintaan, Anda dapat menentukan nama peran RAM instans dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA . Jika terjadi pengecualian dalam mode aman, alat tersebut menggunakan mode normal sebagai cadangan untuk mengambil kredensial akses. Anda juga dapat mengatur variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menentukan logika penanganan pengecualian:
Jika nilainya false, alat tersebut melanjutkan pengambilan kredensial akses dalam mode normal.
Jika nilainya true, alat tersebut hanya dapat mengambil kredensial akses dalam mode aman. Pengecualian dilemparkan jika upaya tersebut gagal.
Dukungan server terhadap IMDSv2 bergantung pada konfigurasi server Anda.
Anda juga dapat menonaktifkan akses kredensial ke 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 kepada instans ECS dan ECI, lihat Buat peran RAM dan berikan ke instans ECS dan Berikan peran RAM instans ke instans ECI.
5. URI alat Credentials
Jika tidak ditemukan informasi kredensial, alat Credentials memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini ada dan mengarah ke URI yang valid, alat Credentials mengakses URI ini untuk memperoleh token STS sebagai kredensial default.
Mekanisme penyegaran otomatis untuk kredensial berbasis sesi
Kredensial sesi mencakup ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri. Jenis kredensial ini memiliki mekanisme penyegaran otomatis bawaan dalam alat Credentials. Setelah klien kredensial memperoleh kredensial untuk pertama kalinya, alat 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`, alat Credentials menyegarkan cache 15 menit sebelum kredensial kedaluwarsa.
Contoh berikut membuat klien kredensial dalam pola singleton. Klien tersebut memperoleh kredensial pada titik waktu yang berbeda untuk memverifikasi mekanisme penyegaran otomatis dan memanggil operasi OpenAPI untuk memastikan bahwa 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("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} // 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. Hal 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 penyegaran otomatis dan menyimpan kredensial baru ke cache.
Kredensial yang digunakan dalam pemanggilan keempat sama dengan kredensial baru yang diperoleh dalam pemanggilan ketiga. Hal ini menunjukkan bahwa kredensial dalam cache telah diperbarui setelah kedaluwarsa.
Referensi
Untuk informasi selengkapnya tentang RAM, lihat Istilah.
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