Saat memanggil operasi API untuk 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, dan token Layanan Token Keamanan (STS). Alat ini membantu Anda mendapatkan serta mengelola kredensial. Topik ini menjelaskan cara mengonfigurasi berbagai jenis kredensial dan urutan pengambilan kredensial default oleh Alat Kredensial. Dengan pemahaman menyeluruh tentang konfigurasi dan manajemen kredensial di Alibaba Cloud 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, Anda harus menggunakan kredensial yang valid untuk menyelesaikan otentikasi identitas. Jenis-jenis kredensial berikut umumnya digunakan:
Pasangan AccessKey dari akun Alibaba Cloud atau Pengguna Resource Access Management (RAM). Pasangan AccessKey berlaku secara permanen dan terdiri dari ID AccessKey dan Rahasia AccessKey.
Token STS dari Peran RAM. Token STS adalah kredensial sementara. Anda dapat menentukan periode validitas dan izin akses untuk token STS. Untuk informasi lebih lanjut, lihat Apa itu STS?
Token bearer. Ini digunakan untuk otentikasi dan otorisasi identitas.
Prasyarat
.NET Framework 4.5 atau versi lebih baru telah diinstal.
.NET Standard 2.0 atau versi lebih baru telah diinstal.
C# 4.0 atau versi lebih baru telah diinstal.
Alibaba Cloud SDK V2.0 telah diinstal.
Instal Alat Kredensial
Jalankan perintah berikut pada CLI .NET untuk menginstal Alibaba Cloud Credentials for .NET:
dotnet add package Aliyun.CredentialsGunakan manajer paket NuGet untuk menginstal Alibaba Cloud Credentials for .NET.
Klik kanan proyek Anda di panel
Solution Explorerdan pilihManage NuGet Packages.Pada tab
Browsedari panelNuGet Package Manager, masukkanAliyun.Credentialsdi kotak pencarian di pojok kiri atas.Dalam hasil pencarian, pilih paket yang nilainya parameter
AuthorsadalahAlibaba Clouddan klik Install.
Kami merekomendasikan Anda menggunakan versi terbaru dari Alibaba Cloud Credentials for .NET. Hal ini memastikan bahwa semua kredensial didukung.
Untuk informasi tentang semua versi rilis dari Alibaba Cloud Credentials for .NET, lihat ChangeLog.txt.
Parameter dari Alat Kredensial
Parameter-parameter dari Alat Kredensial didefinisikan dalam kelas Aliyun.Credentials.Models.Config. Jenis kredensial ditentukan oleh parameter type, yang merupakan parameter wajib dalam konfigurasi. Setelah menentukan jenis kredensial, konfigurasikan parameter berdasarkan jenis tersebut. Tabel berikut menjelaskan nilai-nilai valid dari parameter type dan parameter yang didukung oleh setiap jenis kredensial. Dalam tabel, tanda centang (✓) menunjukkan bahwa parameter tersebut wajib, tanda hubung (-) menunjukkan bahwa parameter tersebut opsional, dan tanda X (×) menunjukkan bahwa parameter tersebut tidak didukung.
Kami merekomendasikan agar Anda tidak menggunakan parameter yang tidak terdaftar dalam tabel berikut.
Tipe | 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 ARN Alibaba Cloud dari Peran Manajemen Akses Sumber Daya (RAM). | × | × | ✓ | × | ✓ | × | × |
roleSessionName: nama sesi kustom. Format default adalah | × | × | - | × | - | × | × |
RoleName: menentukan nama Peran RAM. | × | × | × | - | × | × | × |
DisableIMDSv1: menentukan apakah akan memaksa 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 VPC dan Internet didukung. Nilai default: | × | × | - | × | - | × | × |
Timeout: periode waktu habis permintaan pembacaan HTTP. Nilai default: 5000. Satuan: milidetik. | × | × | - | - | - | - | × |
ConnectTimeout: periode waktu habis permintaan koneksi HTTP. Nilai default: 10000. Satuan: milidetik. | × | × | - | - | - | - | × |
Inisialisasi Klien Kredensial
Anda dapat menggunakan salah satu metode berikut untuk menginisialisasi Klien Kredensial berdasarkan kebutuhan bisnis Anda:
Jika Anda menggunakan pasangan AccessKey teks biasa dalam proyek, pasangan AccessKey tersebut dapat bocor karena pengelolaan izin yang tidak tepat pada repositori kode. Hal ini dapat mengancam keamanan semua sumber daya dalam akun tempat pasangan AccessKey tersebut berada. Kami merekomendasikan Anda menyimpan pasangan AccessKey di variabel lingkungan atau file konfigurasi.
Kami merekomendasikan Anda menginisialisasi Klien Kredensial dalam mode instans tunggal. Mode ini tidak hanya mengaktifkan fitur caching kredensial dari SDK, tetapi juga secara efektif mencegah masalah pembatasan lalu lintas dan pemborosan sumber daya kinerja yang disebabkan oleh banyak panggilan API. Untuk informasi lebih lanjut, lihat bagian Mekanisme pembaruan otomatis kredensial sesi dari topik ini.
Metode 1: Gunakan rantai penyedia kredensial default
Jika Anda tidak menentukan metode untuk menginisialisasi Klien Kredensial, rantai penyedia kredensial default akan digunakan. Untuk informasi lebih lanjut, lihat Rantai Penyedia Kredensial Default.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
// Jangan tentukan nilai atau tentukan null sebagai nilainya.
var credential = new Aliyun.Credentials.Client();
// var credential = new Aliyun.Credentials.Client(null);
}
}
}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 bagi sistem.
Oleh karena itu, kami merekomendasikan Anda menggunakan pasangan AccessKey dari Pengguna RAM yang diberi izin berdasarkan prinsip hak istimewa minimal (PoLP) untuk menginisialisasi Klien Kredensial.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "access_key",
AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
};
var akCredential = new Aliyun.Credentials.Client(config);
string accessKeyId = akCredential.GetAccessKeyId();
string accessSecret = akCredential.GetAccessKeySecret();
string credentialType = akCredential.GetType();
}
}
}Contoh
Metode 3: Gunakan token STS
Metode ini memungkinkan Anda menggunakan token STS statis untuk menginisialisasi Klien Kredensial. Untuk informasi lebih lanjut tentang cara mendapatkan token STS, lihat Apa itu STS? Contoh berikut menunjukkan cara menginisialisasi Klien Kredensial dengan menggunakan token STS. Contoh ini tidak menunjukkan cara mendapatkan token STS.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "sts",
// Dapatkan ID AccessKey dari variabel lingkungan.
AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
// Dapatkan Rahasia AccessKey dari variabel lingkungan.
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// Dapatkan token STS dari variabel lingkungan.
SecurityToken = Environment.GetEnvironmentVariable("<ALIBABA_CLOUD_SECURITY_TOKEN>")
};
var stsCredential = new Aliyun.Credentials.Client(config);
string accessKeyId = stsCredential.GetAccessKeyId();
string accessSecret = stsCredential.GetAccessKeySecret();
string credentialType = stsCredential.GetType();
string securityToken = stsCredential.GetSecurityToken();
}
}
}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 dapat memperoleh token STS dari STS. Anda juga dapat menggunakan parameter Policy untuk membatasi izin peran RAM.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "ram_role_arn",
AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// Tentukan ARN dari peran RAM yang ingin aplikasi Anda asumsikan. Anda dapat memperoleh nilai dari variabel lingkungan ALIBABA_CLOUD_ROLE_ARN. Contoh: acs:ram::123456789012****:role/adminrole.
RoleArn = "<RoleArn>",
// Tentukan nama sesi peran. Anda dapat mengonfigurasi nama sesi peran sebagai variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
RoleSessionName = "<RoleSessionName>",
};
var arnCredential = new Aliyun.Credentials.Client(config);
string accessKeyId = arnCredential.GetAccessKeyId();
string accessSecret = arnCredential.GetAccessKeySecret();
string credentialType = arnCredential.GetType();
string securityToken = arnCredential.GetSecurityToken();
}
}
}Contoh
Metode 5: Gunakan peran RAM dari instans ECS
Instans ECS dan instans kontainer elastis dapat diberi peran RAM. Program yang berjalan pada instans tersebut dapat menggunakan Alat Kredensial untuk secara otomatis mendapatkan token STS untuk peran RAM. 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 instans Anda menentukan apakah server metadata instans mendukung 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 adalah 1.4.2 atau lebih baru.
Untuk informasi lebih lanjut tentang cara mendapatkan metadata instans ECS, lihat Dapatkan Metadata Instans.
Untuk informasi lebih lanjut tentang cara melampirkan peran RAM ke instans ECS, lihat bagian "Buat peran RAM instans dan lampirkan peran RAM instans ke instans ECS" dari topik Peran RAM Instans. Untuk informasi lebih lanjut tentang cara melampirkan peran RAM ke instans kontainer elastis, lihat bagian "Tetapkan peran RAM instans ke instans kontainer elastis" dari topik Gunakan Peran RAM Instans dengan Memanggil Operasi API.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
var config = new Config()
{
Type = "ecs_ram_role",
// Opsional. Tentukan nama peran RAM dari instans ECS. Anda dapat memperoleh nilai dari variabel lingkungan ALIBABA_CLOUD_ECS_METADATA. Jika Anda tidak menentukan parameter ini, nilainya akan diperoleh secara otomatis. Kami merekomendasikan Anda menentukan parameter ini untuk mengurangi jumlah permintaan.
RoleName = "<RoleName>"
};
# Nilai default: false. Parameter ini opsional. true: Mode penguatan keamanan (IMDSv2) dipaksakan. false: Sistem mencoba mendapatkan kredensial akses dalam mode penguatan keamanan (IMDSv2). Jika upaya gagal, sistem beralih ke mode normal (IMDSv1) untuk mendapatkan kredensial akses.
// config.DisableIMDSv1 = true;
var ecsCredential = new Aliyun.Credentials.Client(config);
string accessKeyId = ecsCredential.GetAccessKeyId();
string accessSecret = ecsCredential.GetAccessKeySecret();
string credentialType = ecsCredential.GetType();
string securityToken = ecsCredential.GetSecurityToken();
}
}
}Contoh
Metode 6: Gunakan peran RAM dari OIDC IdP
Untuk memastikan keamanan sumber daya cloud dan memungkinkan aplikasi yang tidak tepercaya mendapatkan token STS yang diperlukan 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, dan 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.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "oidc_role_arn",
// Tentukan ARN dari peran RAM yang akan diasumsikan. Anda dapat mengonfigurasi ARN sebagai variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
RoleArn = "<RoleArn>",
// Tentukan ARN dari OIDC IdP. Anda dapat mengonfigurasi ARN dari OIDC IdP sebagai variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
OIDCProviderArn = "<OidcProviderArn>",
// Tentukan jalur file token OIDC. Anda dapat mengonfigurasi jalur file token OIDC sebagai variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
OIDCTokenFilePath = "<OidcTokenFilePath>",
// Tentukan nama sesi peran. Anda dapat mengonfigurasi nama sesi peran sebagai 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
};
var ecsCredential = new Aliyun.Credentials.Client(config);
}
}
}Contoh
Metode 7: Gunakan URI kredensial
Metode ini memungkinkan Anda mengenkapsulasi token STS dalam aplikasi Anda dan menyediakan URI kustom ke sumber daya eksternal. Layanan lain hanya dapat memperoleh token STS melalui URI tersebut. Hal ini meminimalkan risiko paparan AccessKey. Alat Kredensial memungkinkan Anda mendapatkan token STS dengan memanggil URI layanan untuk menginisialisasi Klien Kredensial.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "credentials_uri",
// Tentukan URI kredensial dalam format http://local_or_remote_uri/. Anda dapat memperoleh nilai dari variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
CredentialsURI = "<CredentialsURI>"
};
}
}
}Contoh
Metode 8: Gunakan token bearer
Hanya Cloud Call Center yang memungkinkan Anda menggunakan token bearer untuk menginisialisasi Klien Kredensial.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "bearer",
// Tentukan token bearer.
BearerToken = "<BearerToken>"
};
var bearerCredential = new Aliyun.Credentials.Client(config);
string bearerToken = bearerCredential.GetBearerToken();
string credentialType = bearerCredential.GetType();
}
}
}Contoh
Rantai penyedia kredensial default
Jika Anda ingin menggunakan jenis kredensial yang berbeda di lingkungan pengembangan dan produksi aplikasi Anda, umumnya Anda perlu mendapatkan informasi lingkungan dari kode dan menulis cabang kode untuk mendapatkan kredensial yang berbeda untuk lingkungan pengembangan dan produksi. Rantai penyedia kredensial default dari Alibaba Cloud Credentials for .NET memungkinkan Anda menggunakan kode yang sama untuk mendapatkan kredensial untuk lingkungan yang berbeda berdasarkan konfigurasi yang independen dari aplikasi. Jika Anda menggunakan new Client(config) untuk menginisialisasi Klien Kredensial tanpa menentukan metode inisialisasi, Alat Kredensial mendapatkan informasi kredensial dalam urutan yang dijelaskan dalam bagian ini.
1. Dapatkan informasi kredensial dari variabel lingkungan
Jika tidak ada informasi kredensial yang ditemukan dalam atribut sistem, Alat Kredensial terus 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 yang terkait dengan peran RAM dari OIDC IdP:
ALIBABA_CLOUD_ROLE_ARN: ARN dari peran RAM.
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari OIDC IdP.
ALIBABA_CLOUD_OIDC_TOKEN_FILE: jalur file token OIDC.
Jika ketiga variabel lingkungan di atas ditentukan dan valid, Alat Kredensial menggunakan variabel lingkungan tersebut untuk memanggil operasi AssumeRoleWithOIDC dari STS untuk mendapatkan token STS sebagai kredensial default.
3. Dapatkan informasi kredensial dari file konfigurasi 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 ubah jalur default di atas. Jika Anda 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 instans ECS untuk mendapatkan informasi kredensial.
OIDC: menggunakan ARN dari OIDC IdP dan file token OIDC untuk mendapatkan informasi kredensial.
ChainableRamRoleArn: menggunakan rantai peran dan menentukan kredensial akses di file JSON lain untuk mendapatkan informasi kredensial.
Tetapkan name ke nama kredensial, dan konfigurasikan parameter lain berdasarkan 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. Misalnya, Anda dapat menetapkan variabel lingkungan ALIBABA_CLOUD_PROFILE ke client1.
4. Dapatkan informasi kredensial dengan menggunakan peran RAM dari instans ECS
Jika tidak ada kredensial dengan prioritas lebih tinggi yang ditemukan, Alat Kredensial mencoba menggunakan peran RAM yang ditetapkan ke instans 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 instans ECS dan menggunakan token STS 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 Anda ingin mengirim hanya 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 untuk 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 instans ECS, lihat Dapatkan Metadata Instans.
Untuk informasi lebih lanjut tentang cara melampirkan peran RAM ke instans ECS, lihat bagian "Buat peran RAM instans dan lampirkan peran RAM instans ke instans ECS" dari topik Peran RAM Instans. Untuk informasi lebih lanjut tentang cara melampirkan peran RAM ke instans kontainer elastis, lihat bagian "Tetapkan peran RAM instans ke instans kontainer elastis" dari topik Gunakan Peran RAM Instans dengan Memanggil Operasi API.
5. Dapatkan informasi kredensial berdasarkan URI
Jika tidak ada kredensial valid yang diperoleh dengan 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 instans ECS, peran RAM dari OIDC IdP (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 kredensial belum kedaluwarsa. Jika tidak, Alat Kredensial melakukan panggilan untuk mendapatkan kredensial lagi, dan memperbarui kredensial dalam cache.
Untuk peran RAM dari instans 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.
using System;
using System.Threading.Tasks;
using Aliyun.Credentials.Models;
using AlibabaCloud.SDK.Ecs20140526;
using AlibabaCloud.OpenApiClient.Models;
using AlibabaCloud.TeaUtil.Models;
namespace Example
{
/// <summary>
/// Kelas Credentials digunakan untuk mengelola instans kredensial Alibaba Cloud dalam mode singleton statis.
/// </summary>
public static class Credential
{
private static readonly Lazy<Aliyun.Credentials.Client> _instance = new(() =>
{
try
{
var config = new Aliyun.Credentials.Models.Config
{
Type = "ram_role_arn",
AccessKeyId = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_ID"),
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
RoleArn = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ROLE_ARN"),
RoleSessionName = "RamRoleArnTest",
RoleSessionExpiration = 3600
};
return new Aliyun.Credentials.Client(config);
}
catch (Exception ex)
{
throw new InvalidOperationException("Inisialisasi kredensial gagal: " + ex.Message, ex);
}
});
public static Aliyun.Credentials.Client Instance => _instance.Value;
}
/// <summary>
/// Kelas EcsClient digunakan untuk mengelola klien ECS dalam mode singleton statis.
/// Anda harus menggunakan parameter Initialize untuk mengonfigurasi titik akhir dan kredensial.
/// </summary>
public static class EcsClient
{
private static string _endpoint=string.Empty; // Inisialisasi eksplisit. Jangan atur nilainya ke null.
private static Aliyun.Credentials.Client _credential=null!; // Inisialisasi eksplisit. Jangan atur nilainya ke null.
private static readonly Lazy<AlibabaCloud.SDK.Ecs20140526.Client> _instance = new(() =>
{
if (string.IsNullOrEmpty(_endpoint))
{
throw new InvalidOperationException("Titik akhir harus ditetapkan sebelum menginisialisasi klien ECS.");
}
if (_credential == null)
{
throw new InvalidOperationException("Kredensial harus ditetapkan sebelum menginisialisasi klien ECS.");
}
try
{
var ecsConfig = new AlibabaCloud.OpenApiClient.Models.Config
{
Endpoint = _endpoint,
Credential = _credential
};
return new AlibabaCloud.SDK.Ecs20140526.Client(ecsConfig);
}
catch (Exception ex)
{
throw new InvalidOperationException("Inisialisasi klien ECS gagal: " + ex.Message, ex);
}
});
public static void Initialize(string endpoint, Aliyun.Credentials.Client credential)
{
if (string.IsNullOrEmpty(endpoint))
{
throw new ArgumentException("Titik akhir tidak boleh null atau kosong.", nameof(endpoint));
}
if (credential == null)
{
throw new ArgumentNullException(nameof(credential), "Kredensial tidak boleh null.");
}
_endpoint = endpoint;
_credential = credential;
}
public static AlibabaCloud.SDK.Ecs20140526.Client Instance => _instance.Value;
}
public class Program
{
public static async Task Main(string[] args)
{
// Inisialisasi instans EcsClient.
EcsClient.Initialize("ecs.cn-hangzhou.aliyuncs.com", Credential.Instance);
Action task = () =>
{
try
{
var credential = Credential.Instance.GetCredential();
Console.WriteLine(DateTime.Now);
Console.WriteLine($"AK ID: {credential.AccessKeyId}, AK Secret: {credential.AccessKeySecret}, STS Token: {credential.SecurityToken}");
var ecsClient = EcsClient.Instance;
var request = new AlibabaCloud.SDK.Ecs20140526.Models.DescribeRegionsRequest();
var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
var response = ecsClient.DescribeRegionsWithOptions(request, runtime);
Console.WriteLine($"Hasil pemanggilan: {response.StatusCode}");
}
catch (Exception ex)
{
Console.WriteLine($"Eksekusi klien ECS gagal: {ex.Message}");
}
};
// Jalankan tugas segera satu kali.
task();
// Mulai beberapa tugas asinkron secara bersamaan.
var tasks = new[]
{
ScheduleTaskAsync(task, 600),
ScheduleTaskAsync(task, 4200),
ScheduleTaskAsync(task, 4300)
};
await Task.WhenAll(tasks);
Console.WriteLine("Semua tugas selesai.");
}
private static async Task ScheduleTaskAsync(Action task, int delaySeconds)
{
await Task.Delay(TimeSpan.FromSeconds(delaySeconds));
task();
}
}
}
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 adalah 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, dan kebijakan serta memberikan izin kepada Pengguna RAM, lihat Ikhtisar SDK RAM.
Untuk informasi lebih lanjut tentang cara mengasumsikan peran menggunakan program, lihat Ikhtisar SDK STS.
Untuk informasi lebih lanjut tentang operasi API terkait RAM dan STS, lihat Referensi API.
Praktik Terbaik untuk Menggunakan Kredensial Akses Memanggil Operasi API