Untuk memanggil operasi API guna mengelola sumber daya cloud menggunakan Alibaba Cloud SDK, Anda harus mengonfigurasi informasi kredensial yang valid. Alat Kredensial dari Alibaba Cloud menyediakan fitur mudah digunakan dan mendukung berbagai jenis kredensial, termasuk kredensial default, pasangan AccessKey, serta token Layanan Token Keamanan (STS). Alat ini membantu Anda mendapatkan dan mengelola kredensial. Topik ini menjelaskan cara mengonfigurasi berbagai jenis kredensial dan urutan pengambilan kredensial default oleh Alat Kredensial. Dengan pemahaman menyeluruh tentang konfigurasi dan pengelolaan kredensial dalam SDK, Anda dapat melakukan operasi pada sumber daya cloud secara efisien dan aman.
Informasi latar belakang
Kredensial adalah sekumpulan informasi yang digunakan untuk membuktikan identitas pengguna saat masuk ke sistem. Jenis-jenis kredensial berikut umumnya digunakan:
Pasangan AccessKey dari akun Alibaba Cloud atau Pengguna Resource Access Management (RAM). Pasangan AccessKey permanen terdiri dari ID AccessKey dan Rahasia AccessKey.
Token STS dari Peran RAM. Token STS bersifat sementara, dengan periode validitas dan izin akses yang dapat ditentukan. Untuk informasi lebih lanjut, lihat Apa itu STS?
Token bearer, digunakan untuk otentikasi dan otorisasi identitas.
Prasyarat
Node.js versi 8.5.0 atau lebih baru telah diinstal.
Alibaba Cloud SDK V2.0 telah diinstal. Untuk detail lebih lanjut, lihat Gunakan Alibaba Cloud SDK untuk Node.js di IDE.
Instal Alat Kredensial
Jalankan perintah npm berikut untuk mengunduh dan menginstal Alibaba Cloud Credentials untuk Node.js:
npm install @alicloud/credentialsKami merekomendasikan penggunaan versi terbaru dari Alibaba Cloud Credentials untuk Node.js agar semua kredensial didukung. Untuk daftar versi, lihat Releases · aliyun/credentials-nodejs · GitHub.
Parameter dari Alat Kredensial
Parameter Alat Kredensial didefinisikan dalam konstruktor Config dari modul @alicloud/credentials. Jenis kredensial ditentukan oleh parameter type, yang wajib dalam konfigurasi. Setelah menentukan jenis kredensial, konfigurasikan parameter sesuai dengan jenis tersebut. Tabel berikut menjelaskan nilai-nilai valid dari type dan parameter yang didukung oleh setiap jenis kredensial. Dalam tabel, tanda centang (✓) menunjukkan parameter wajib, tanda hubung (-) menunjukkan opsional, dan tanda X (×) menunjukkan tidak didukung.
Hindari penggunaan parameter yang tidak terdaftar dalam tabel berikut.
type | access_key | sts | ram_role_arn | ecs_ram_role | oidc_role_arn | credentials_uri | bearer |
accessKeyId: ID AccessKey. | ✓ | ✓ | ✓ | × | × | × | × |
accessKeySecret: Rahasia AccessKey. | ✓ | ✓ | ✓ | × | × | × | × |
securityToken: Token Layanan Token Keamanan (STS). | × | ✓ | - | × | × | × | × |
roleArn: Nama Sumber Daya Alibaba Cloud (ARN) dari Peran Manajemen Akses Sumber Daya (RAM). | × | × | ✓ | × | ✓ | × | × |
roleSessionName: nama sesi kustom. Format default adalah | × | × | - | × | - | × | × |
roleName: menentukan nama Peran RAM. | × | × | × | - | × | × | × |
disableIMDSv1: menentukan apakah akan secara paksa menggunakan mode penguatan keamanan (IMDSv2). Jika Anda mengatur parameter ini ke true, mode penguatan keamanan (IMDSv2) digunakan. Nilai default: | × | × | × | - | × | × | × |
bearerToken: token bearer. | × | × | × | × | × | × | ✓ |
policy: kebijakan kustom. | × | × | - | × | - | × | × |
roleSessionExpiration: periode waktu habis sesi. Nilai default: 3600. Satuan: detik. | × | × | - | × | - | × | × |
oidcProviderArn: ARN dari penyedia identitas OpenID Connect (OIDC) (IdP). | × | × | × | × | ✓ | × | × |
oidcTokenFilePath: jalur absolut ke token OIDC. | × | × | × | × | ✓ | × | × |
externalId: ID eksternal dari peran, yang digunakan untuk mencegah masalah deputy yang bingung. Untuk informasi lebih lanjut, lihat Gunakan ID eksternal untuk mencegah masalah deputy yang bingung. | × | × | - | × | × | × | × |
credentialsURI: URI dari kredensial. | × | × | × | × | × | ✓ | × |
STSEndpoint: titik akhir STS. Titik akhir Virtual Private Cloud (VPC) dan Internet didukung. Nilai default: | × | × | - | × | - | × | × |
timeout: periode timeout permintaan pembacaan HTTP. Nilai default: 5000. Satuan: milidetik. | × | × | - | - | - | - | × |
connectTimeout: periode timeout permintaan koneksi HTTP. Nilai default: 10000. Satuan: milidetik. | × | × | - | - | - | - | × |
Inisialisasi Klien Kredensial
Anda dapat menggunakan salah satu metode berikut untuk menginisialisasi Klien Kredensial sesuai kebutuhan bisnis:
Menggunakan pasangan AccessKey teks biasa dalam proyek dapat menyebabkan kebocoran karena manajemen izin yang tidak tepat pada repositori kode, sehingga mengancam keamanan sumber daya akun. Kami merekomendasikan penyimpanan pasangan AccessKey dalam variabel lingkungan atau file konfigurasi.
Kami merekomendasikan inisialisasi Klien Kredensial dalam mode instans tunggal. Mode ini tidak hanya mengaktifkan fitur caching kredensial dari SDK tetapi juga mencegah masalah kontrol lalu lintas dan pemborosan sumber daya kinerja akibat beberapa panggilan API. Untuk informasi lebih lanjut, lihat bagian Mekanisme Pembaruan Otomatis Kredensial Sesi.
Metode 1: Gunakan rantai penyedia kredensial default
Jika tidak menentukan metode inisialisasi Klien Kredensial, rantai penyedia kredensial default akan digunakan. Untuk informasi lebih lanjut, lihat Rantai Penyedia Kredensial Default.
const Credential = require('@alicloud/credentials');
// Inisialisasi Klien Kredensial tanpa menentukan metode.
const credentialClient = new Credential.default();
const credential = credentialClient.getCredential();
credential.then(credential => {
console.log(credential);
});
import Credential from '@alicloud/credentials';
const credential = new Credential();
credential.getCredential().then(credential => {
console.log(credential);
});Contoh
Metode 2: Gunakan pasangan AccessKey
Metode ini memungkinkan Anda membuat pasangan AccessKey untuk menginisialisasi Klien Kredensial. Untuk informasi lebih lanjut, lihat Buat Pasangan AccessKey.
Akun Alibaba Cloud memiliki izin penuh atas sumber daya dalam akun tersebut. Kebocoran pasangan AccessKey dari akun Alibaba Cloud menimbulkan ancaman serius terhadap sistem.
Oleh karena itu, kami merekomendasikan penggunaan pasangan AccessKey dari pengguna RAM dengan prinsip hak istimewa minimal (PoLP) untuk menginisialisasi Klien Kredensial.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
// Tentukan jenis kredensial.
type: 'access_key',
// Tentukan ID AccessKey. Dalam contoh ini, ID AccessKey diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Tentukan Rahasia AccessKey. Dalam contoh ini, Rahasia AccessKey diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential.default(credentialsConfig);
import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
// Tentukan jenis kredensial.
type: 'access_key',
// Tentukan ID AccessKey. Dalam contoh ini, ID AccessKey diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Tentukan Rahasia AccessKey. Dalam contoh ini, Rahasia AccessKey diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential(credentialsConfig);
Contoh
Metode 3: Gunakan token STS
Metode ini memungkinkan Anda menggunakan token STS statis untuk menginisialisasi Klien Kredensial. Untuk informasi tentang cara mendapatkan token STS, lihat Apa itu STS? Contoh berikut menunjukkan cara menginisialisasi Klien Kredensial menggunakan token STS. Contoh ini tidak mencakup cara mendapatkan token STS.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'sts',
// Tentukan ID AccessKey. Dalam contoh ini, ID AccessKey diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Tentukan Rahasia AccessKey. Dalam contoh ini, Rahasia AccessKey diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Tentukan token keamanan. Dalam contoh ini, token keamanan diambil dari variabel lingkungan.
securityToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN,
});
const cred = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
// Tentukan jenis kredensial.
type: 'access_key',
// Tentukan ID AccessKey. Dalam contoh ini, ID AccessKey diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Tentukan Rahasia AccessKey. Dalam contoh ini, Rahasia AccessKey diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Tentukan token keamanan. Dalam contoh ini, token keamanan diambil dari variabel lingkungan.
securityToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN,
});
const credentialClient = new Credential(credentialsConfig);
Contoh
Metode 4: Gunakan pasangan AccessKey dan peran RAM
Logika dasar metode ini adalah menggunakan token STS untuk menginisialisasi Klien Kredensial. Setelah menentukan ARN dari peran RAM, Alat Kredensial mendapatkan token keamanan dari STS. Anda juga dapat menggunakan parameter policy untuk membatasi izin peran RAM.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'ram_role_arn',
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Tentukan ARN dari peran RAM yang ingin diasumsikan dengan menentukan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
roleArn: '<RoleArn>',
// Tentukan nama sesi peran. Anda dapat memperoleh nama sesi peran dari variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Tentukan izin terbatas untuk peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
policy: '<Policy>',
roleSessionExpiration: 3600,
});
const cred = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'ram_role_arn',
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Tentukan ARN dari peran RAM yang ingin diasumsikan dengan menentukan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
roleArn: '<RoleArn>',
// Tentukan nama sesi peran. Anda dapat memperoleh nama sesi peran dari variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Tentukan izin terbatas untuk peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
policy: '<Policy>',
roleSessionExpiration: 3600,
});
const credentialClient = new Credential(credentialsConfig);Contoh
Metode 5: Gunakan peran RAM dari instance ECS
Instance ECS dan instance kontainer elastis dapat diberi peran RAM. Program yang berjalan pada instance tersebut dapat menggunakan Alat Kredensial untuk mendapatkan token STS untuk peran RAM secara otomatis. Token STS tersebut dapat digunakan untuk menginisialisasi Klien Kredensial.
Secara default, Alat Kredensial mengakses server metadata ECS dalam mode penguatan keamanan (IMDSv2). Jika terjadi pengecualian, Alat Kredensial beralih ke mode normal (IMDSv1). Anda juga dapat mengonfigurasi parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menentukan logika penanganan pengecualian. Nilai valid:
false (default): Alat Kredensial terus mendapatkan kredensial akses dalam mode normal (IMDSv1).
true: Pengecualian dilemparkan dan Alat Kredensial terus mendapatkan kredensial akses dalam mode penguatan keamanan (IMDSv2).
Konfigurasi server metadata menentukan apakah server mendukung mode penguatan keamanan (IMDSv2).
Selain itu, Anda dapat menentukan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true untuk menonaktifkan akses dari Alat Kredensial ke server metadata ECS.
Jika Anda mendapatkan token STS dalam mode penguatan keamanan (IMDSv2), pastikan versi Alat Kredensial yang digunakan adalah 2.3.1 atau lebih baru.
Untuk informasi lebih lanjut tentang metadata instance ECS, lihat Dapatkan Metadata Instance.
Untuk informasi lebih lanjut tentang cara menempelkan peran RAM ke instance ECS, lihat bagian "Buat Peran RAM Instance dan Tempelkan Peran RAM Instance ke Instance ECS" dari topik Peran RAM Instance. Untuk informasi lebih lanjut tentang cara menempelkan peran RAM ke instance kontainer elastis, lihat bagian "Tetapkan Peran RAM Instance ke Instance Kontainer Elastis" dari topik Gunakan Peran RAM Instance dengan Memanggil Operasi API.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'ecs_ram_role',
// Opsional. Tentukan nama peran RAM dari instance ECS dengan menentukan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika Anda tidak menentukan parameter ini, nilainya akan diperoleh secara otomatis. Untuk mengurangi jumlah permintaan, kami merekomendasikan Anda menentukan parameter ini.
roleName: '<RoleName>',
# Nilai default: false. Parameter ini opsional. true: Mode penguatan keamanan (IMDSv2) digunakan secara paksa. false: Sistem mencoba mendapatkan kredensial akses terlebih dahulu dalam mode penguatan keamanan (IMDSv2). Jika upaya gagal, sistem beralih ke mode normal (IMDSv1) untuk mendapatkan kredensial akses.
// disableIMDSv1: true,
});
const cred = new Credential.default(credentialsConfig);
import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'ecs_ram_role',
// Opsional. Tentukan nama peran RAM dari instance ECS dengan menentukan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika Anda tidak menentukan parameter ini, nilainya akan diperoleh secara otomatis. Untuk mengurangi jumlah permintaan, kami merekomendasikan Anda menentukan parameter ini.
roleName: '<RoleName>',
# Nilai default: false. Parameter ini opsional. true: Mode penguatan keamanan (IMDSv2) digunakan secara paksa. false: Sistem mencoba mendapatkan kredensial akses terlebih dahulu dalam mode penguatan keamanan (IMDSv2). Jika upaya gagal, sistem beralih ke mode normal (IMDSv1) untuk mendapatkan kredensial akses.
// disableIMDSv1: true,
});
const credentialClient = new Credential(credentialsConfig);Contoh
Metode 6: Gunakan peran RAM dari OIDC IdP
Untuk memastikan keamanan sumber daya cloud dan memungkinkan aplikasi yang tidak tepercaya mendapatkan token STS secara aman, Anda dapat menggunakan fitur RAM Roles for Service Accounts (RRSA) untuk memberikan izin minimum yang diperlukan kepada aplikasi. ACK membuat dan memasang file token OpenID Connect (OIDC) yang sesuai untuk pod aplikasi yang berbeda, serta meneruskan informasi konfigurasi terkait ke variabel lingkungan. Alat Kredensial mendapatkan informasi konfigurasi dari variabel lingkungan dan memanggil operasi AssumeRoleWithOIDC dari STS untuk mendapatkan token STS untuk peran yang dilampirkan.
Variabel lingkungan berikut disuntikkan ke dalam pod:
ALIBABA_CLOUD_ROLE_ARN: ARN dari peran RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia identitas OIDC (IdP).
ALIBABA_CLOUD_OIDC_TOKEN_FILE: jalur file token OIDC.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'oidc_role_arn',
// Tentukan ARN dari peran RAM yang ingin diasumsikan dengan menentukan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
roleArn: '<RoleArn>',
// Tentukan ARN dari OIDC IdP dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
oidcProviderArn: '<OidcProviderArn>',
// Tentukan jalur file token OIDC dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
oidcTokenFilePath: '<OidcTokenFilePath>',
// Tentukan nama sesi peran. Anda dapat memperoleh nama sesi peran dari variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Tentukan izin terbatas untuk peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
policy: '<Policy>',
// Tentukan periode validitas sesi.
roleSessionExpiration: 3600,
});
const credentialClient = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'oidc_role_arn',
// Tentukan ARN dari peran RAM yang ingin diasumsikan dengan menentukan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
roleArn: '<RoleArn>',
// Tentukan ARN dari OIDC IdP dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
oidcProviderArn: '<OidcProviderArn>',
// Tentukan jalur file token OIDC dengan menentukan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
oidcTokenFilePath: '<OidcTokenFilePath>',
// Tentukan nama sesi peran. Anda dapat memperoleh nama sesi peran dari variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Tentukan izin terbatas untuk peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}.
policy: '<Policy>',
// Tentukan periode validitas sesi.
roleSessionExpiration: 3600,
});
const credentialClient = new Credential(credentialsConfig);Contoh
Metode 7: Gunakan URI kredensial
Metode ini memungkinkan Anda mengenkapsulasi token STS di dalam aplikasi dan menyediakan URI kustom ke sumber daya eksternal. Layanan lain hanya dapat memperoleh token STS melalui URI tersebut, meminimalkan risiko paparan AccessKey. Alat Kredensial memungkinkan Anda mendapatkan token STS dengan memanggil URI layanan untuk menginisialisasi Klien Kredensial.
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'credentials_uri',
// Tentukan URI kredensial dalam format http://local_or_remote_uri/ dengan menentukan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
credentialsURI: '<CredentialsUri>',
});
const credentialClient = new Credential(config);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'credentials_uri',
// Tentukan URI kredensial dalam format http://local_or_remote_uri/ dengan menentukan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
credentialsURI: '<CredentialsUri>',
});
const credentialClient = new Credential(credentialsConfig);URI harus memenuhi persyaratan berikut:
Kode status respons adalah 200.
Parameter respons berikut dikembalikan:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Contoh pemanggilan
Metode 8: Gunakan token bearer
Hanya Cloud Call Center yang memungkinkan Anda menggunakan token bearer untuk menginisialisasi klien SDK.
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'bearer',
// Tentukan token bearer.
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(config);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'bearer',
// Tentukan token bearer.
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(credentialsConfig);
Contoh
Rantai Penyedia Kredensial Default
Jika Anda ingin menggunakan berbagai jenis kredensial di lingkungan pengembangan dan produksi aplikasi, umumnya Anda perlu mendapatkan informasi lingkungan dari kode dan menulis cabang kode untuk mendapatkan kredensial yang berbeda untuk kedua lingkungan. Rantai penyedia kredensial default dari Alibaba Cloud Credentials untuk Java memungkinkan Anda menggunakan kode yang sama untuk mendapatkan kredensial untuk lingkungan yang berbeda berdasarkan konfigurasi independen dari aplikasi. Jika Anda menggunakan new Credential() untuk menginisialisasi Klien Kredensial tanpa menentukan metode inisialisasi, Alat Kredensial mendapatkan informasi kredensial dalam urutan berikut:
1. Dapatkan informasi kredensial dari variabel lingkungan
Jika tidak ada informasi kredensial yang ditemukan dalam atribut sistem, Alat Kredensial memeriksa variabel lingkungan.
Jika kedua variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET ditentukan, mereka digunakan sebagai kredensial default.
Jika ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN ditentukan, token STS digunakan sebagai kredensial default.
2. Dapatkan informasi kredensial dengan menggunakan peran RAM dari OIDC IdP
Jika tidak ada kredensial dengan prioritas lebih tinggi yang ditemukan, Alat Kredensial memeriksa variabel lingkungan berikut terkait peran RAM dari OIDC IdP:
ALIBABA_CLOUD_ROLE_ARN: ARN dari peran RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia identitas OIDC (IdP).
ALIBABA_CLOUD_OIDC_TOKEN_FILE: jalur file token OIDC.
Jika ketiga variabel lingkungan di atas ditentukan dan valid, Alat Kredensial menggunakan variabel tersebut untuk memanggil operasi AssumeRoleWithOIDC dari STS guna mendapatkan token STS sebagai kredensial default.
3. Dapatkan informasi kredensial dari file config.json
Jika tidak ada kredensial dengan prioritas lebih tinggi yang ditemukan, Alat Kredensial mencoba memuat file config.json. Jalur file default:
Linux:
~/.aliyun/config.jsonWindows:
C:\Users\USER_NAME\.aliyun\config.json
Jangan mengubah jalur default di atas. Jika ingin menggunakan metode ini untuk mengonfigurasi kredensial akses, buat file config.json secara manual di jalur yang sesuai. Contoh:
{
"current": "default",
"profiles": [
{
"name": "default",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "client",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"client1",
"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":"client2",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"client3",
"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":"client4",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
Dalam file config.json, Anda dapat menggunakan mode untuk menentukan jenis kredensial:
AK: menggunakan pasangan AccessKey dari pengguna RAM untuk mendapatkan informasi kredensial.
StsToken: menggunakan token STS sebagai informasi kredensial.
RamRoleArn: menggunakan ARN dari peran RAM untuk mendapatkan informasi kredensial.
EcsRamRole: menggunakan peran RAM yang dilampirkan ke instance ECS untuk mendapatkan informasi kredensial.
OIDC: menggunakan ARN dari IdP OIDC dan file token OIDC untuk mendapatkan informasi kredensial.
ChainableRamRoleArn: menggunakan rantai peran dan menentukan kredensial akses dalam file JSON lain untuk mendapatkan informasi kredensial.
Tetapkan name ke nama kredensial, dan konfigurasikan parameter lainnya sesuai kebutuhan bisnis Anda.
Setelah menyelesaikan konfigurasi, Alat Kredensial memilih kredensial yang ditentukan oleh parameter current dalam file konfigurasi dan menginisialisasi klien. Anda juga dapat menentukan variabel lingkungan ALIBABA_CLOUD_PROFILE untuk menentukan informasi kredensial. Sebagai contoh, atur variabel lingkungan ALIBABA_CLOUD_PROFILE ke client1.
4. Dapatkan informasi kredensial dengan menggunakan peran RAM dari instance ECS
Jika tidak ada kredensial dengan prioritas lebih tinggi yang ditemukan, Alat Kredensial mencoba menggunakan peran RAM yang ditugaskan ke instance ECS untuk mendapatkan kredensial. Secara default, Alat Kredensial mengakses server metadata ECS dalam mode penguatan keamanan (IMDSv2) untuk mendapatkan token STS dari peran RAM yang digunakan oleh instance ECS dan menggunakan token STS tersebut sebagai kredensial default. Alat Kredensial secara otomatis mengakses server metadata ECS untuk mendapatkan nama peran RAM (RoleName) dan kemudian mendapatkan kredensial. Dua permintaan dikirim dalam proses ini. Jika hanya ingin mengirim satu permintaan, tambahkan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk menentukan nama peran RAM. Jika terjadi pengecualian dalam mode penguatan keamanan (IMDSv2), Alat Kredensial mendapatkan kredensial akses dalam mode normal (IMDSv1). Anda juga dapat mengonfigurasi variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE untuk menentukan logika penanganan pengecualian. Nilai valid:
false: Alat Kredensial terus mendapatkan kredensial akses dalam mode normal (IMDSv1).
true: Pengecualian dilemparkan dan Alat Kredensial terus mendapatkan kredensial akses dalam mode penguatan keamanan.
Konfigurasi server metadata menentukan apakah server mendukung mode penguatan keamanan (IMDSv2).
Selain itu, Anda dapat menentukan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true untuk menonaktifkan akses dari Alat Kredensial ke server metadata ECS.
Untuk informasi lebih lanjut tentang metadata instance ECS, lihat Dapatkan Metadata Instance.
Untuk informasi lebih lanjut tentang cara menempelkan peran RAM ke instance ECS, lihat bagian "Buat Peran RAM Instance dan Tempelkan Peran RAM Instance ke Instance ECS" dari topik Peran RAM Instance. Untuk informasi lebih lanjut tentang cara menempelkan peran RAM ke instance kontainer elastis, lihat bagian "Tetapkan Peran RAM Instance ke Instance Kontainer Elastis" dari topik Gunakan Peran RAM Instance dengan Memanggil Operasi API.
5. Dapatkan informasi kredensial berdasarkan URI
Jika tidak ada kredensial valid yang diperoleh menggunakan metode sebelumnya, Alat Kredensial memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel lingkungan ini ada dan menentukan URI yang valid, Alat Kredensial memulai permintaan HTTP untuk mendapatkan token STS sebagai kredensial default.
Mekanisme pembaruan otomatis kredensial sesi
Kredensial sesi mencakup ARN peran RAM (RamRoleArn), peran RAM dari instance ECS, peran RAM dari IdP OIDC (OIDCRoleArn), dan URI kredensial. Alat Kredensial menyediakan mekanisme pembaruan otomatis bawaan untuk kredensial sesi. Setelah kredensial diperoleh dari panggilan pertama, Alat Kredensial menyimpan kredensial dalam cache. Dalam panggilan berikutnya, kredensial dibaca dari cache selama belum kedaluwarsa. Jika tidak, Alat Kredensial melakukan panggilan untuk mendapatkan kredensial lagi dan memperbarui kredensial dalam cache.
Untuk peran RAM dari instance ECS, Alat Kredensial memperbarui kredensial 15 menit sebelum waktu habis cache (TTL) berakhir.
Dalam contoh berikut, Klien Kredensial dibuat dalam mode instans tunggal dan digunakan untuk menginisialisasi klien layanan cloud. Kemudian, operasi API dipanggil pada periode waktu yang berbeda untuk memeriksa apakah cache internal digunakan dan apakah kredensial diperbarui setelah cache kedaluwarsa.
const Credential = require('@alicloud/credentials');
const Ecs20140526 = require('@alicloud/ecs20140526');
const { Config } = require('@alicloud/openapi-client');
const { RuntimeOptions } = require('@alicloud/tea-util');
// Dapatkan variabel lingkungan.
const accessKeyId = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID;
const accessKeySecret = process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET;
const roleArn = process.env.ALIBABA_CLOUD_ROLE_ARN;
/**
* Kelas singleton Credential digunakan untuk mengelola instans kredensial Alibaba Cloud.
*/
class CredentialClient {
constructor() {
if (!CredentialClient.instance) {
var credentialsConfig = new Credential.Config({
type: 'ram_role_arn',
accessKeyId: accessKeyId,
accessKeySecret: accessKeySecret,
roleArn: roleArn,
roleSessionName: 'RoleSessionNameTest',
roleSessionExpiration: 3600,
});
this.credentialsClient = new Credential.default(credentialsConfig);
CredentialClient.instance = this;
}
return CredentialClient.instance;
}
static getInstance() {
return new CredentialClient().credentialsClient;
}
}
/**
* Kelas singleton ECS Client digunakan untuk mengelola instans klien ECS.
*/
class EcsClient {
constructor(credentialClient) {
if (!EcsClient.instance) {
const config = new Config({
endpoint: 'ecs.cn-hangzhou.aliyuncs.com',
credential: credentialClient
});
this.ecsClient = new Ecs20140526.default(config);
EcsClient.instance = this;
}
return EcsClient.instance;
}
static getInstance(credentialClient) {
return new EcsClient(credentialClient).ecsClient;
}
}
/**
* Eksekusi logika tugas.
*/
async function executeTask() {
try {
const credentialClient = CredentialClient.getInstance();
const credential = await credentialClient.getCredential();
console.log(new Date());
console.log(`AK ID: ${credential.accessKeyId}`);
console.log(`AK Secret: ${credential.accessKeySecret}`);
console.log(`STS Token: ${credential.securityToken}`);
// Dalam contoh ini, operasi API ECS dipanggil untuk menguji apakah kredensial valid. Anda dapat menentukan operasi API yang ingin Anda panggil.
const ecsClient = EcsClient.getInstance(credentialClient);
const request = new Ecs20140526.DescribeRegionsRequest();
const runtime = new RuntimeOptions({});
const response = await ecsClient.describeRegionsWithOptions(request, runtime);
console.log(`Hasil pemanggilan: ${response.statusCode}`);
} catch (error) {
throw new Error(`Eksekusi klien ECS gagal: ${error.message}`, { cause: error });
}
}
/**
* Jadwalkan eksekusi tugas menggunakan timer.
*/
function scheduleTasks() {
// Jalankan tugas segera satu kali.
executeTask();
// Tetapkan penundaan untuk tugas berikutnya.
setTimeout(executeTask, 600 * 1000); // Jalankan tugas kedua setelah 600 detik.
setTimeout(executeTask, 4200 * 1000); // Jalankan tugas ketiga setelah 4.200 detik.
setTimeout(executeTask, 4300 * 1000); // Jalankan tugas keempat setelah 4.300 detik.
}
// Mulai penjadwalan tugas.
scheduleTasks();
import Credential, { Config as CredentialsConfig } from '@alicloud/credentials';
import Ecs20140526, * as $Ecs20140526 from '@alicloud/ecs20140526';
import { Config } from '@alicloud/openapi-client';
import { RuntimeOptions } from '@alicloud/tea-util';
// Dapatkan variabel lingkungan.
const accessKeyId: string | undefined = process.env.ALIBABA_CLOUD_ACCESS_KEY_ID;
const accessKeySecret: string | undefined = process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET;
const roleArn: string | undefined = process.env.ALIBABA_CLOUD_ROLE_ARN;
if (!accessKeyId || !accessKeySecret || !roleArn) {
throw new Error('Variabel lingkungan yang diperlukan hilang.');
}
/**
* Kelas singleton Credential digunakan untuk mengelola instans kredensial Alibaba Cloud.
*/
class CredentialClient {
private static instance: CredentialClient;
private readonly credentialsClient: InstanceType<typeof Credential>;
private constructor() {
const credentialsConfig = new CredentialsConfig({
type: 'ram_role_arn',
accessKeyId,
accessKeySecret,
roleArn,
roleSessionName: 'RoleSessionNameTest',
roleSessionExpiration: 3600,
});
this.credentialsClient = new Credential(credentialsConfig);
}
static getInstance(): InstanceType<typeof Credential> {
if (!CredentialClient.instance) {
CredentialClient.instance = new CredentialClient();
}
return CredentialClient.instance.credentialsClient;
}
}
/**
* Kelas singleton ECS Client digunakan untuk mengelola instans klien ECS.
*/
class EcsClient {
private static instance: EcsClient;
private readonly ecsClient: InstanceType<typeof Ecs20140526>;
private constructor(credentialClient: InstanceType<typeof Credential>) {
const config = new Config({
endpoint: 'ecs.cn-hangzhou.aliyuncs.com',
credential: credentialClient
});
this.ecsClient = new Ecs20140526(config);
}
static getInstance(credentialClient: InstanceType<typeof Credential>): InstanceType<typeof Ecs20140526> {
if (!EcsClient.instance) {
EcsClient.instance = new EcsClient(credentialClient);
}
return EcsClient.instance.ecsClient;
}
}
/**
* Eksekusi logika tugas.
*/
async function executeTask(): Promise<void> {
try {
const credentialClient = CredentialClient.getInstance();
const credential = await credentialClient.getCredential();
console.log(new Date());
console.log(`AK ID: ${credential.accessKeyId}`);
console.log(`AK Secret: ${credential.accessKeySecret}`);
console.log(`STS Token: ${credential.securityToken}`);
// Dalam contoh ini, operasi API ECS dipanggil untuk menguji apakah kredensial valid. Anda dapat menentukan operasi API yang ingin Anda panggil.
const ecsClient = EcsClient.getInstance(credentialClient);
const request = new $Ecs20140526.DescribeRegionsRequest();
const runtime = new RuntimeOptions({});
const response = await ecsClient.describeRegionsWithOptions(request, runtime);
console.log(`Hasil pemanggilan: ${response.statusCode}`);
} catch (error) {
throw new Error(`Eksekusi klien ECS gagal: ${error}`);
}
}
/**
* Jadwalkan eksekusi tugas menggunakan timer.
*/
function scheduleTasks(): void {
// Jalankan tugas segera satu kali.
executeTask();
// Tetapkan penundaan untuk tugas berikutnya.
setTimeout(executeTask, 600 * 1000); // Jalankan tugas kedua setelah 600 detik.
setTimeout(executeTask, 4200 * 1000); // Jalankan tugas ketiga setelah 4.200 detik.
setTimeout(executeTask, 4300 * 1000); // Jalankan tugas keempat setelah 4.300 detik.
}
// Mulai penjadwalan tugas.
scheduleTasks();
Analisis log:
Pada pemanggilan pertama, sistem mendapatkan kredensial berdasarkan konfigurasi karena kredensial belum di-cache. Setelah sistem mendapatkan kredensial, kredensial disimpan dalam cache.
Pemanggilan kedua menggunakan kredensial yang sama dengan pemanggilan pertama, yang menunjukkan bahwa kredensial diperoleh dari cache.
Pada pemanggilan ketiga, kredensial telah kedaluwarsa karena pemanggilan ketiga dilakukan 4.200 detik setelah pemanggilan pertama sementara TTL kredensial (RoleSessionExpiration) diatur ke 3.600 detik. SDK mendapatkan kredensial lagi berdasarkan mekanisme pembaruan otomatis dan menyimpan kredensial dalam cache.
Pemanggilan keempat menggunakan kredensial yang sama dengan pemanggilan ketiga, yang menunjukkan bahwa kredensial diperbarui setelah cache kedaluwarsa.
Referensi
Untuk informasi lebih lanjut tentang RAM, lihat Istilah.
Untuk informasi lebih lanjut tentang cara membuat pasangan AccessKey, lihat Buat Pasangan AccessKey.
Untuk informasi lebih lanjut tentang cara membuat pengguna RAM, pasangan AccessKey, peran RAM, kebijakan, serta memberikan izin kepada pengguna RAM, lihat Gambaran SDK RAM.
Untuk informasi lebih lanjut tentang cara mengasumsikan peran menggunakan program, lihat Gambaran SDK STS.
Untuk informasi lebih lanjut tentang operasi API terkait RAM dan STS, lihat Referensi API.
Praktik Terbaik untuk Menggunakan Kredensial Akses untuk Memanggil Operasi API