Alibaba Cloud SDK menggunakan tool Credentials untuk mengelola kredensial secara terpusat, seperti AccessKey dan STS Token Anda. Topik ini menjelaskan jenis kredensial yang didukung dan cara mengonfigurasinya.
Latar Belakang
Kredensial memverifikasi identitas pengguna saat mengakses layanan Alibaba Cloud. Jenis kredensial umum meliputi:
-
Pasangan AccessKey menyediakan kredensial permanen untuk Akun Alibaba Cloud atau Pengguna RAM, yang terdiri dari ID AccessKey dan Rahasia AccessKey.
-
Token STS menyediakan kredensial sementara untuk peran RAM dengan periode validitas dan cakupan izin yang dapat dikonfigurasi. Apa itu STS.
-
Token bearer digunakan untuk otentikasi dan otorisasi.
Prasyarat
-
Node.js 8.5.0 atau versi lebih baru telah diinstal.
-
Alibaba Cloud SDK V2.0 telah dikonfigurasi. Gunakan Alibaba Cloud SDK untuk Node.js dengan IDE.
Instal tool Credentials
Jalankan perintah npm berikut untuk menginstal paket tersebut.
npm install @alicloud/credentials
Gunakan versi terbaru untuk memastikan semua jenis kredensial didukung. Releases · aliyun/credentials-nodejs · GitHub.
Parameter kredensial
Konfigurasikan kredensial melalui konstruktor modul @alicloud/credentials menggunakan kelas Config. Parameter type bersifat wajib dan menentukan parameter lain yang berlaku. Tabel berikut mencantumkan nilai type yang valid beserta parameter terkaitnya. √ = wajib, - = opsional, × = tidak didukung.
Hanya jenis kredensial dan parameter yang tercantum di bawah ini yang didukung.
|
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 Keamanan (STS). |
× |
√ |
- |
× |
× |
× |
× |
|
roleArn: Nama Sumber Daya Alibaba Cloud (ARN) dari peran RAM. |
× |
× |
√ |
× |
√ |
× |
× |
|
roleSessionName: Nama kustom untuk sesi. Format default adalah |
× |
× |
- |
× |
- |
× |
× |
|
roleName: Nama peran RAM. |
× |
× |
× |
- |
× |
× |
× |
|
disableIMDSv1: Menentukan apakah akan menerapkan mode penguatan keamanan (IMDSv2). Nilai default: |
× |
× |
× |
- |
× |
× |
× |
|
bearerToken: Bearer token. |
× |
× |
× |
× |
× |
× |
√ |
|
policy: Kebijakan kustom. |
× |
× |
- |
× |
- |
× |
× |
|
roleSessionExpiration: Waktu kedaluwarsa sesi, dalam detik. Nilai default: 3600. |
× |
× |
- |
× |
- |
× |
× |
|
oidcProviderArn: ARN penyedia identitas OpenID Connect (OIDC). |
× |
× |
× |
× |
√ |
× |
× |
|
oidcTokenFilePath: Jalur ke file token OpenID Connect (OIDC). |
× |
× |
× |
× |
√ |
× |
× |
|
externalId: ID eksternal untuk mengurangi risiko confused deputy problem. Gunakan ID eksternal untuk mencegah confused deputy problem. |
× |
× |
- |
× |
× |
× |
× |
|
credentialsURI: URI kredensial. |
× |
× |
× |
× |
× |
√ |
× |
|
Titik akhir STS. Mendukung titik akhir VPC maupun publik. Titik akhir yang tersedia: Endpoints. Default: |
× |
× |
- |
× |
- |
× |
× |
|
timeout: Timeout baca untuk permintaan HTTP, dalam milidetik. Nilai default adalah 5000. |
× |
× |
- |
- |
- |
- |
× |
|
connectTimeout: Timeout koneksi untuk permintaan HTTP, dalam milidetik. Nilai default adalah 10000. |
× |
× |
- |
- |
- |
- |
× |
Inisialisasi klien kredensial
Bagian sebelumnya menjelaskan jenis kredensial dan parameter konfigurasi yang didukung oleh tool Credentials. Bagian berikut memberikan contoh kode tentang cara menggunakan tool tersebut. Pilih metode yang paling sesuai dengan skenario Anda.
-
Jangan pernah menyimpan
AccessKeydalam bentuk teks biasa di kode proyek Anda. Kunci yang terekspos membahayakan seluruh sumber daya di bawah akun tersebut. Simpan di variabel lingkungan atau file konfigurasi sebagai gantinya. -
Terapkan pola
singletonuntuktool credentials. Ini mengaktifkancredential cachebawaan, mencegahrate limitingakibat panggilan API berlebihan. Mekanisme auto-refresh kredensial sesi.
Metode 1: Rantai penyedia kredensial default
Menginisialisasi klien kredensial tanpa parameter akan mengaktifkan Rantai penyedia kredensial default.
const Credential = require('@alicloud/credentials');
// Gunakan rantai penyedia kredensial default
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);
});Panggilan API
Metode 2: Gunakan 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 akun root.
Gunakan AK Pengguna RAM dengan izin prinsip hak istimewa minimal.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
// Jenis kredensial.
type: 'access_key',
// ID AccessKey Anda, diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Rahasia AccessKey Anda, 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({
// Jenis kredensial.
type: 'access_key',
// ID AccessKey Anda, diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Rahasia AccessKey Anda, diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
});
const credentialClient = new Credential(credentialsConfig);Panggilan API
Metode 3: Gunakan token STS
Tool Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'sts',
// ID AccessKey Anda, diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Rahasia AccessKey Anda, diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Token keamanan Anda, 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({
// Jenis kredensial.
type: 'access_key',
// ID AccessKey Anda, diambil dari variabel lingkungan.
accessKeyId: process.env.ALIBABA_CLOUD_ACCESS_KEY_ID,
// Rahasia AccessKey Anda, diambil dari variabel lingkungan.
accessKeySecret: process.env.ALIBABA_CLOUD_ACCESS_KEY_SECRET,
// Token keamanan Anda, diambil dari variabel lingkungan.
securityToken: process.env.ALIBABA_CLOUD_SECURITY_TOKEN,
});
const credentialClient = new Credential(credentialsConfig);
Panggilan API
Metode 4: AccessKey dan ARN Peran RAM
Metode ini menggunakan STS secara internal. Saat Anda menentukan ARN peran RAM, tool Credentials memperoleh token STS dari STS. Anda dapat menggunakan parameter policy untuk membatasi lebih lanjut izin peran tersebut.
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,
// ARN peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Ini juga dapat diatur menggunakan variabel lingkungan `ALIBABA_CLOUD_ROLE_ARN`.
roleArn: '<RoleArn>',
// Nama sesi peran kustom. Ini juga dapat diatur menggunakan variabel lingkungan `ALIBABA_CLOUD_ROLE_SESSION_NAME`.
roleSessionName: '<RoleSessionName>',
// Opsional. Kebijakan inline untuk membatasi izin 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,
// ARN peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Ini juga dapat diatur menggunakan variabel lingkungan `ALIBABA_CLOUD_ROLE_ARN`.
roleArn: '<RoleArn>',
// Nama sesi peran kustom. Ini juga dapat diatur menggunakan variabel lingkungan `ALIBABA_CLOUD_ROLE_SESSION_NAME`.
roleSessionName: '<RoleSessionName>',
// Opsional. Kebijakan inline untuk membatasi izin peran RAM. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy: '<Policy>',
roleSessionExpiration: 3600,
});
const credentialClient = new Credential(credentialsConfig);Metode panggilan API
Metode 5: Peran RAM instans ECS
Lampirkan peran RAM instans ke instans ECS atau instans kontainer elastis. Aplikasi pada instans tersebut kemudian dapat menggunakan tool Credentials untuk secara otomatis memperoleh token STS untuk peran tersebut.
Secara default, tool Credentials mengakses server metadata ECS dalam mode penguatan keamanan (IMDSv2). Jika terjadi kesalahan, sistem akan kembali ke mode normal. Kendalikan perilaku ini dengan parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE:
-
false(default): Kembali ke mode normal jika gagal. -
true: Hanya menggunakan mode penguatan keamanan dan melempar pengecualian jika gagal.
Dukungan IMDSv2 bergantung pada konfigurasi server Anda.
Anda juga dapat menonaktifkan akses kredensial melalui metadata ECS dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
-
Mode penguatan keamanan memerlukan library kredensial versi 2.3.1 atau lebih baru.
-
Ikhtisar metadata instans ECS: Instance metadata.
-
Untuk memberikan peran RAM ke instans ECS atau instans kontainer elastis: Langkah 1: Buat peran RAM dan Berikan peran RAM instans ke instans ECI.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'ecs_ram_role',
// Opsional. Nama peran RAM ECS. Jika tidak ditentukan, sistem mengambilnya secara otomatis. Disarankan menentukan nama untuk mengurangi permintaan. Ini juga dapat diatur melalui variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
roleName: '<RoleName>',
// Opsional. Default: false. Jika true, menerapkan mode penguatan keamanan. Jika false, sistem mencoba mode penguatan keamanan terlebih dahulu, lalu kembali ke mode normal (IMDSv1) jika gagal.
// disableIMDSv1: true,
});
const cred = new Credential.default(credentialsConfig);
import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'ecs_ram_role',
// Opsional. Nama peran RAM ECS. Jika tidak ditentukan, sistem mengambilnya secara otomatis. Disarankan menentukan nama untuk mengurangi permintaan. Ini juga dapat diatur melalui variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
roleName: '<RoleName>',
// Opsional. Default: false. Jika true, menerapkan mode penguatan keamanan. Jika false, sistem mencoba mode penguatan keamanan terlebih dahulu, lalu kembali ke mode normal (IMDSv1) jika gagal.
// disableIMDSv1: true,
});
const credentialClient = new Credential(credentialsConfig);Panggilan API
Metode 6: Gunakan OIDCRoleArn
Jika Anda menggunakan OIDC dan telah membuat peran RAM untuk penyedia OIDC, berikan ARN penyedia OIDC, token OIDC, dan ARN peran RAM ke SDK Credentials. SDK memanggil operasi AssumeRoleWithOIDC untuk memperoleh token STS. Kredensial ini mendukung refresh otomatis. Mekanisme auto-refresh untuk kredensial sesi. Sebagai contoh, dalam kluster ACK dengan RRSA diaktifkan, SDK membaca konfigurasi OIDC dari variabel lingkungan Pod dan memperoleh token STS untuk mengakses layanan Alibaba Cloud.
const Credential = require('@alicloud/credentials');
const credentialsConfig = new Credential.Config({
type: 'oidc_role_arn',
// ARN peran RAM yang akan diasumsikan. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
roleArn: '<RoleArn>',
// ARN Penyedia Identitas OIDC. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
oidcProviderArn: '<OidcProviderArn>',
// Jalur file token OIDC. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
oidcTokenFilePath: '<OidcTokenFilePath>',
// Nama sesi peran kustom. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Kebijakan untuk mempersempit izin sesi. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy: '<Policy>',
// Durasi sesi dalam detik.
roleSessionExpiration: 3600,
});
const credentialClient = new Credential.default(credentialsConfig);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'oidc_role_arn',
// ARN peran RAM yang akan diasumsikan. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
roleArn: '<RoleArn>',
// ARN Penyedia Identitas OIDC. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
oidcProviderArn: '<OidcProviderArn>',
// Jalur file token OIDC. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
oidcTokenFilePath: '<OidcTokenFilePath>',
// Nama sesi peran kustom. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
roleSessionName: '<RoleSessionName>',
// Opsional. Kebijakan untuk mempersempit izin sesi. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
policy: '<Policy>',
// Durasi sesi dalam detik.
roleSessionExpiration: 3600,
});
const credentialClient = new Credential(credentialsConfig);Panggilan API
Metode 7: Kredensial URI
Ekspos layanan STS melalui URI sehingga layanan eksternal dapat memperoleh token STS tanpa menangani pasangan AccessKey secara langsung. Tool Credentials mengambil token STS dari URI yang ditentukan dan menggunakannya sebagai kredensial akses, dengan dukungan refresh otomatis. Mekanisme refresh otomatis untuk kredensial tipe sesi.
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'credentials_uri',
// Titik akhir untuk mengambil kredensial, misalnya, http://local_or_remote_uri/. Ini juga dapat diatur dengan 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',
// Titik akhir untuk mengambil kredensial, misalnya, http://local_or_remote_uri/. Ini juga dapat diatur dengan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
credentialsURI: '<CredentialsUri>',
});
const credentialClient = new Credential(credentialsConfig);Respons URI harus memenuhi persyaratan berikut:
-
Kode status adalah 200.
-
Format isi respons:
{ "Code": "Success", "AccessKeySecret": "AccessKeySecret", "AccessKeyId": "AccessKeyId", "Expiration": "2021-09-26T03:46:38Z", "SecurityToken": "SecurityToken" }
Panggilan API
Metode 8: Gunakan token bearer
Saat ini, hanya Alibaba Cloud Call Center (CCC) yang mendukung otentikasi token bearer.
const Credential = require('@alicloud/credentials');
const config = new Credential.Config({
type: 'bearer',
// Ganti dengan token bearer Anda.
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(config);import Credential, { Config } from '@alicloud/credentials';
const credentialsConfig = new Config({
type: 'bearer',
// Ganti dengan token bearer Anda.
bearerToken: '<BearerToken>',
});
const credentialClient = new Credential(credentialsConfig);Panggilan API
Rantai penyedia kredensial default
Rantai penyedia kredensial default memungkinkan Anda menggunakan kode yang sama di berbagai lingkungan dan mengontrol pengambilan kredensial melalui konfigurasi eksternal. Saat Anda memanggil new Credential() tanpa parameter, SDK mencari kredensial dalam urutan berikut.
1. Menggunakan 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 peran RAM.
-
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN 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 Layanan Token Keamanan (STS) untuk memperoleh token STS.
3. Config.json
Jika belum ditemukan kredensial, rantai penyedia mencoba memuat file kredensial bersama, config.json, dari lokasi defaultnya dan menggunakan kredensial yang ditentukan dalam file tersebut.
-
Linux/macOS:
~/.aliyun/config.json -
Windows:
C:\Users\USER_NAME\.aliyun\config.json
Untuk mengonfigurasi kredensial dengan cara ini, Anda dapat menggunakan Alibaba Cloud CLI atau membuat file config.json secara manual di jalur yang sesuai. Contoh berikut menunjukkan format isinya:
{
"current": "<PROFILE_NAME>",
"profiles": [
{
"name": "<PROFILE_NAME>",
"mode": "AK",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>"
},
{
"name": "<PROFILE_NAME1>",
"mode": "StsToken",
"access_key_id": "<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret": "<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"sts_token": "<SECURITY_TOKEN>"
},
{
"name":"<PROFILE_NAME2>",
"mode":"RamRoleArn",
"access_key_id":"<ALIBABA_CLOUD_ACCESS_KEY_ID>",
"access_key_secret":"<ALIBABA_CLOUD_ACCESS_KEY_SECRET>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME3>",
"mode":"EcsRamRole",
"ram_role_name":"<RAM_ROLE_ARN>"
},
{
"name":"<PROFILE_NAME4>",
"mode":"OIDC",
"oidc_provider_arn":"<OIDC_PROVIDER_ARN>",
"oidc_token_file":"<OIDC_TOKEN_FILE>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
},
{
"name":"<PROFILE_NAME5>",
"mode":"ChainableRamRoleArn",
"source_profile":"<PROFILE_NAME>",
"ram_role_arn":"<ROLE_ARN>",
"ram_session_name":"<ROLE_SESSION_NAME>",
"expired_seconds":3600
}
]
}
|
Parameter |
Deskripsi |
|
current |
Tentukan nama kredensial untuk mengambil konfigurasi kredensial yang sesuai. Nama kredensial adalah nilai parameter |
|
profiles |
Berisi kumpulan konfigurasi kredensial. Parameter
|
4. Peran RAM instans ECS
Jika tidak ditemukan kredensial dengan prioritas lebih tinggi, SDK mengambil kredensial dari peran RAM instans ECS. SDK mengakses layanan metadata instans dalam mode ditingkatkan (IMDSv2) untuk mendapatkan token STS. Ini memerlukan dua permintaan: satu untuk nama peran, satu lagi untuk kredensial. Untuk menguranginya menjadi satu permintaan, atur nama peran dalam variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika mode ditingkatkan gagal, proses akan kembali ke mode normal. Kendalikan ini dengan ALIBABA_CLOUD_IMDSV1_DISABLE:
-
false: Kembali ke mode normal jika gagal. -
true: Hanya menggunakan mode ditingkatkan dan melempar pengecualian jika gagal.
Dukungan IMDSv2 bergantung pada konfigurasi layanan metadata instans Anda.
Untuk menonaktifkan pengambilan kredensial dari metadata instans ECS, atur ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
-
Ikhtisar metadata instans ECS: Instance Metadata.
-
Untuk memberikan peran RAM ke instans ECS atau ECI: 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.
Auto-refresh untuk kredensial sesi
Kredensial sesi (ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri) mencakup auto-refresh bawaan. Saat pengambilan pertama, tool credentials menyimpan kredensial dalam cache. Permintaan berikutnya mengembalikan nilai yang di-cache hingga kedaluwarsa, lalu kredensial baru diambil secara otomatis.
Untuk kredensial ecs_ram_role, tool credentials melakukan refresh proaktif 15 menit sebelum kedaluwarsa.
Contoh berikut menggunakan pola singleton untuk membuat klien kredensial, memverifikasi auto-refresh dengan mengambil kredensial pada interval berbeda dan mengonfirmasi validitasnya melalui panggilan OpenAPI.
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 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 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;
}
}
/**
* Jalankan 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}`);
// Contoh ini memanggil operasi API ECS untuk memverifikasi validitas kredensial. Ubah sesuai kebutuhan.
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 sekali.
executeTask();
// Atur penundaan untuk tugas berikutnya.
setTimeout(executeTask, 600 * 1000); // Eksekusi kedua: setelah 600 detik.
setTimeout(executeTask, 4200 * 1000); // Eksekusi ketiga: setelah 4.200 detik.
setTimeout(executeTask, 4300 * 1000); // Eksekusi 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 wajib tidak ditemukan.');
}
/**
* Kelas singleton Credential 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 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;
}
}
/**
* Jalankan 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}`);
// Contoh ini memanggil operasi API ECS untuk memverifikasi validitas kredensial. Ubah sesuai kebutuhan.
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 sekali.
executeTask();
// Atur penundaan untuk tugas berikutnya.
setTimeout(executeTask, 600 * 1000); // Eksekusi kedua: setelah 600 detik.
setTimeout(executeTask, 4200 * 1000); // Eksekusi ketiga: setelah 4.200 detik.
setTimeout(executeTask, 4300 * 1000); // Eksekusi keempat: setelah 4.300 detik.
}
// Mulai penjadwalan tugas.
scheduleTasks();2025-05-28T09:22:29.584Z
AK ID: STS.NVS9xxx7DRbao
AK Secret: 9SoQxxxmVjVsED9ad47rcgMaw5XyQyXx
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5Xmcu/irrxq0pWvU0PZhvVtS7hovafKjTz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4xc1LGed0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOiIqKOsk1MdI9Cywly2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/JHusVmo7LiTxqAARdkoKCeYBvLk0ZFWccCiM0ZvdnRtv0VDOUfD1zQELQGL+xB5NrBmdzq2ePjFJbrkBGmy5EXD714jknyzM4lFic2dUQMi14NCHMVDVjGAf0qUs
F+PQW58jGb32fmFxxxTXOx82sdRQqW0/vTd2KQmIAA=
Invoke result: 200
2025-05-28T09:32:28.137Z
AK ID: STS.NVS9xxx7DRbao
AK Secret: 9SoQxxxmVjVsED9ad47rcgMaw5XyQyXx
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5Xmcu/irrxq0pWvU0PZhvVtS7hovafKjTz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4xc1LGed0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOiIqKOsk1MdI9Cywly2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/JHusVmo7LiTxqAARdkoKCeYBvLk0ZFWccCiM0ZvdnRtv0VDOUfD1zQELQGL+xB5NrBmdzq2ePjFJbrkBGmy5EXD714jknyzM4lFic2dUQMi14NCHMVDVjGAf0qUs
F+PQW58jGb32fmFxxxTXOx82sdRQqW0/vTd2KQmIAA=
Invoke result: 200
2025-05-28T10:32:29.771Z
AK ID: STS.NVuaxxxLFiPw8
AK Secret: 5dsoxxxpA5pCzfrek4KforS8MnJ6qHR9
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5XAKsjd241w4PqgY1P2gDUvb8NqhpXc2jz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4yVKL2Gd0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOjIqKOsk+Mdk9CiWv2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/KpUoQEo7LiTxqAAUyV7F+kpLHRG/yHw3JaVz14hqSj2hmxxkwgczUWIkpBLKHLeW0iI3sp2LNQO6iEAImLpSE0nRVBbcutIqxEuFzAs607jgOjHakTF7UZNoKVV
wb42xR4s4ThGd2PxxxqoUsrKfCq5lHiUiDq6L1VIAA=
Invoke result: 200
2025-05-28T10:34:08.130Z
AK ID: STS.NVuaxxxLFiPw8
AK Secret: 5dsoxxxpA5pCzfrek4KforS8MnJ6qHR9
STS Token:
CAISyQJ1q6Ft5B2yfSjIr5XAKsjd241w4PqgY1P2gDUvb8NqhpXc2jz2IHhMeXZoA+4YsPw2mmFW6/sdlrpJTJtIfkHfdsp36LJe9A6dbpHd4yVKL2Gd0s/LI3OaLjKm9u2wCryLYbGwU/OpbE++5U0X6LDmdDKkckW40JmS8/BOZcgWWQ/KB1gvRq
0hRG1YpdQdKGHa0xxxWg0/ks0aH1war1bBL+tqofMP9MfMBZskvD42Hu8VtbbfE3SJq7BxHybx71qQs+02c5onAXAELvUvYa7OKo4MyCVBjBKEhALNBoeL7kfBobmFAAkgwYnynVMMisES3LOjIqKOsk+Mdk9CiWv2y
vfiZZ1prmk1pV68xxxczc4yvhD2nuNe7rmc9Z3/KpUoQEo7LiTxqAAUyV7F+kpLHRG/yHw3JaVz14hqSj2hmxxkwgczUWIkpBLKHLeW0iI3sp2LNQO6iEAImLpSE0nRVBbcutIqxEuFzAs607jgOjHakTF7UZNoKVV
wb42xR4s4ThGd2PxxxqoUsrKfCq5lHiUiDq6L1VIAA=
Invoke result: 200
Analisis berdasarkan output log:
-
Pada pemanggilan pertama, cache kosong. Sistem mengambil kredensial berdasarkan konfigurasi Anda lalu 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; menentukan 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 penggunaan kredensial akses untuk memanggil Alibaba Cloud OpenAPI