Alibaba Cloud SDK menggunakan alat Credentials untuk mengelola kredensial secara terpusat, seperti AccessKey dan STS Token Anda. Topik ini menjelaskan jenis kredensial yang didukung dan metode konfigurasinya.
Prasyarat
-
.NET Framework 4.5 atau versi lebih baru.
-
.NET Standard 2.0 atau versi lebih baru.
-
C# 4.0 atau versi lebih baru.
-
Alibaba Cloud SDK for .NET V2.0 atau versi lebih baru.
Instal tool kredensial
Jika Anda telah menginstal Alibaba Cloud Credentials untuk .NET, Anda dapat melewati langkah ini. Gunakan versi terbaru dari paket kredensial untuk memastikan dukungan terhadap semua jenis kredensial. Untuk informasi tentang semua versi yang dirilis, lihat ChangeLog.md.
Anda dapat menginstal Alibaba Cloud Credentials untuk .NET dengan salah satu cara berikut:
-
Instal paket dengan CLI .NET.
dotnet add package Aliyun.Credentials -
Instal paket dengan manajer paket NuGet.
-
Klik kanan proyek Anda di
Solution Explorerdan pilihManage NuGet Packages. -
Di
NuGet Package Manager, klik tabBrowsedan masukkanAliyun.Credentials. -
Dari daftar tersebut, pilih paket resmi yang memiliki
AuthorsbernamaAlibaba Cloud, lalu klik Install.
-
Setelah instalasi selesai, jalankan perintah berikut. Output akan menampilkan Aliyun.Credentials dan nomor versinya:
dotnet list package
Parameter untuk tool kredensial
Parameter konfigurasi untuk alat kredensial didefinisikan dalam Aliyun.Credentials.Models.Config. Parameter type yang wajib digunakan menentukan jenis kredensial. Setelah memilih jenis kredensial, konfigurasikan parameter yang sesuai. Tabel berikut merinci nilai yang valid untuk type dan parameter yang didukung oleh setiap jenis kredensial. Dalam tabel ini, √ menunjukkan parameter wajib, - menunjukkan parameter opsional, dan × menunjukkan parameter yang tidak didukung.
Gunakan hanya jenis kredensial dan parameter yang tercantum dalam tabel berikut.
|
Type |
access_key |
sts |
ram_role_arn |
ecs_ram_role |
oidc_role_arn |
credentials_uri |
bearer |
|
AccessKeyId: ID Access Key. |
√ |
√ |
√ |
× |
× |
× |
× |
|
AccessKeySecret: Secret Access Key. |
√ |
√ |
√ |
× |
× |
× |
× |
|
SecurityToken: Token keamanan. |
× |
√ |
- |
× |
× |
× |
× |
|
RoleArn: ARN dari role RAM. |
× |
× |
√ |
× |
√ |
× |
× |
|
RoleSessionName: Nama sesi kustom. Format defaultnya adalah |
× |
× |
- |
× |
- |
× |
× |
|
RoleName: Nama role RAM. |
× |
× |
× |
- |
× |
× |
× |
|
DisableIMDSv1: Menentukan apakah IMDSv1 dinonaktifkan untuk menerapkan mode penguatan keamanan (IMDSv2). Nilai default-nya adalah |
× |
× |
× |
- |
× |
× |
× |
|
BearerToken: Token bearer. |
× |
× |
× |
× |
× |
× |
√ |
|
Policy: Kebijakan kustom. |
× |
× |
- |
× |
- |
× |
× |
|
RoleSessionExpiration: Periode timeout sesi, dalam detik. Nilai default-nya adalah 3600. |
× |
× |
- |
× |
- |
× |
× |
|
OidcProviderArn: ARN dari penyedia identitas OIDC. |
× |
× |
× |
× |
√ |
× |
× |
|
OidcTokenFilePath: Jalur file ke token OIDC. |
× |
× |
× |
× |
√ |
× |
× |
|
ExternalId: ID eksternal yang digunakan untuk mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Gunakan ID eksternal untuk mencegah masalah confused deputy. |
× |
× |
- |
× |
× |
× |
× |
|
CredentialsURI: URI kredensial. |
× |
× |
× |
× |
× |
√ |
× |
|
STSEndpoint: Titik akhir STS. Baik titik akhir VPC maupun titik akhir publik didukung. Untuk daftar nilai yang valid, lihat Endpoints. Nilai default-nya adalah |
× |
× |
- |
× |
- |
× |
× |
|
Timeout: Timeout baca untuk permintaan HTTP, dalam milidetik. Nilai default-nya adalah 5000. |
× |
× |
- |
- |
- |
- |
× |
|
ConnectTimeout: Timeout koneksi untuk permintaan HTTP, dalam milidetik. Nilai default-nya adalah 10000. |
× |
× |
- |
- |
- |
- |
× |
Inisialisasi klien kredensial
Bagian sebelumnya menjelaskan jenis kredensial dan parameter konfigurasi yang didukung oleh alat Credentials. Bagian berikut menyediakan contoh kode yang menunjukkan cara menggunakan alat tersebut. Pilih metode yang paling sesuai dengan skenario Anda.
-
Menyematkan AccessKey secara langsung dalam proyek Anda menciptakan risiko keamanan. Izin repositori yang tidak dikelola dengan baik dapat mengekspos seluruh sumber daya dalam akun Anda. Disarankan untuk menyimpan AccessKey dalam variabel lingkungan atau file konfigurasi.
-
Gunakan pola singleton dengan alat Credentials. Pola ini memungkinkan caching kredensial bawaan pada alat untuk mencegah pembatasan laju akibat panggilan API yang terlalu sering dan menghindari pemborosan sumber daya akibat pembuatan banyak instans. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
Metode 1: Rantai penyedia kredensial default
Jika Anda menginisialisasi klien Credentials tanpa parameter apa pun, alat Credentials akan menggunakan rantai penyedia kredensial default. Untuk memahami cara SDK memuat kredensial default, lihat Rantai penyedia kredensial default.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
// Tidak meneruskan parameter apa pun, atau meneruskan null.
var credential = new Aliyun.Credentials.Client();
// var credential = new Aliyun.Credentials.Client(null);
}
}
}
Contoh pemanggilan API
Metode 2: AccessKey
Alat Credentials menggunakan AccessKey yang Anda berikan sebagai kredensial akses.
Akun Alibaba Cloud (akun root) memiliki izin penuh atas semua sumber dayanya, sehingga AK yang terekspos menimbulkan risiko keamanan signifikan. Jangan gunakan AK dari akun root.
Gunakan AK dari pengguna RAM dengan izin prinsip hak istimewa minimal (least-privilege).
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 API
Metode 3: Gunakan token STS
Alat Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.
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 Secret AccessKey dari variabel lingkungan.
AccessKeySecret = Environment.GetEnvironmentVariable("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
// Dapatkan token keamanan 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 pemanggilan API
Metode 4: Access key dan ARN role RAM
Metode ini menggunakan token STS secara internal. Saat Anda menentukan ARN (Nama Sumber Daya Alibaba Cloud) dari role RAM, alat kredensial memperoleh token STS dari STS. Anda juga dapat menggunakan parameter Policy untuk menerapkan himpunan izin yang lebih kecil pada role 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"),
// ARN dari role RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda juga dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
RoleArn = "<RoleArn>",
// Nama sesi role. Anda juga dapat mengatur ini menggunakan 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();
}
}
}
Pemanggilan API
Metode 5: Role RAM instans ECS
Anda dapat menyambungkan role RAM instans ke instans ECS dan ECI, sehingga aplikasi pada instans tersebut dapat menggunakan alat Credentials untuk secara otomatis mengambil token STS dari role tersebut guna menginisialisasi klien kredensial.
Secara default, alat Credentials menggunakan mode penguatan keamanan (IMDSv2) untuk mengakses server metadata ECS. Jika terjadi kesalahan, alat akan kembali ke mode normal untuk mengambil kredensial akses. Anda dapat mengonfigurasi perilaku fallback ini dengan mengatur parameter disableIMDSv1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLE:
-
Jika nilainya
false(default), alat tetap mengambil kredensial akses dalam mode normal. -
Jika nilainya
true, alat hanya menggunakan mode penguatan keamanan. Jika pengambilan gagal, alat akan melemparkan pengecualian.
Dukungan terhadap IMDSv2 bergantung pada konfigurasi server.
Anda juga dapat mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true untuk menonaktifkan pengambilan kredensial dari metadata instans ECS.
-
Untuk mendapatkan kredensial keamanan sementara dalam mode penguatan keamanan, pastikan versi alat Credentials adalah 1.4.2 atau lebih baru.
-
Untuk informasi selengkapnya tentang metadata instans ECS, lihat metadata instans.
-
Untuk petunjuk cara memberikan role RAM ke instans ECS dan ECI, lihat Langkah 1: Buat role RAM dan Berikan role RAM instans ke instans ECI.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
var config = new Config()
{
Type = "ecs_ram_role",
// Opsional. Nama role RAM ECS. Tentukan parameter ini untuk mengurangi jumlah permintaan. Jika dihilangkan, sistem secara otomatis mengambil nama role. Anda juga dapat mengatur nama role menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
RoleName = "<RoleName>"
};
// Opsional. Default: false. Atur ke true untuk menerapkan mode penguatan keamanan. Jika false, sistem pertama-tama mencoba mengambil kredensial akses dalam mode penguatan keamanan dan kembali ke mode normal (IMDSv1) jika gagal.
// 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 API
Metode 6: Menggunakan OIDCRoleArn
Jika Anda menggunakan OIDC untuk autentikasi dan telah membuat role RAM untuk penyedia identitas OIDC, Anda dapat memberikan ARN penyedia OIDC, jalur file token OIDC, dan ARN role RAM ke alat Credentials. Alat tersebut kemudian secara otomatis memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk role RAM, yang digunakan sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi. Misalnya, jika aplikasi Anda berjalan di kluster Container Service for Kubernetes (ACK) dengan RRSA diaktifkan, alat Credentials dapat membaca konfigurasi OIDC dari variabel lingkungan pod dan memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS. Anda kemudian dapat menggunakan token STS ini untuk mengakses layanan Alibaba Cloud.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "oidc_role_arn",
// ARN dari role RAM yang akan diasumsikan. Diatur dengan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
RoleArn = "<RoleArn>",
// ARN dari Penyedia Identitas OIDC. Diatur dengan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
OIDCProviderArn = "<OidcProviderArn>",
// Jalur file token OIDC. Diatur dengan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
OIDCTokenFilePath = "<OidcTokenFilePath>",
// Nama sesi role. Diatur dengan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
RoleSessionName = "<RoleSessionName>",
// Opsional. Kebijakan kustom yang membatasi izin untuk sesi role. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
Policy = "<Policy>",
RoleSessionExpiration = 3600
};
var ecsCredential = new Aliyun.Credentials.Client(config);
}
}
}
Contoh API
Metode 7: URI Kredensial
Anda dapat mengenkapsulasi Security Token Service (STS) di balik URI layanan, sehingga layanan eksternal dapat memperoleh token STS tanpa mengekspos informasi sensitif seperti AK. Alat Credentials kemudian dapat menggunakan URI ini untuk mengambil token STS sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "credentials_uri",
// Menentukan URI untuk mengambil kredensial, misalnya http://local_or_remote_uri/. Atau, atur variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
CredentialsURI = "<CredentialsURI>"
};
}
}
}
Contoh API
Metode 8: Token bearer
Hanya Cloud Call Center (CCC) yang mendukung inisialisasi kredensial dengan token bearer.
using Aliyun.Credentials.Models;
namespace credentials_demo
{
class Program
{
static void Main(string[] args)
{
Config config = new Config()
{
Type = "bearer",
// Masukkan Bearer Token Anda.
BearerToken = "<BearerToken>"
};
var bearerCredential = new Aliyun.Credentials.Client(config);
string bearerToken = bearerCredential.GetBearerToken();
string credentialType = bearerCredential.GetType();
}
}
}
Contoh API
Rantai penyedia kredensial default
Saat aplikasi Anda menggunakan kredensial berbeda untuk lingkungan pengembangan dan produksi, pengembang biasanya menulis kode kondisional untuk memuat kredensial yang tepat untuk setiap lingkungan. Rantai penyedia kredensial default memungkinkan Anda menggunakan kode yang sama dan mengelola kredensial untuk lingkungan berbeda melalui konfigurasi eksternal. Saat Anda menginisialisasi klien kredensial dengan memanggil new Client(config) tanpa parameter atau dengan null, Alibaba Cloud SDK mencoba menemukan 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. Gunakan role RAM OIDC
Jika belum ditemukan kredensial, rantai penyedia memeriksa variabel lingkungan berikut yang terkait dengan role RAM OIDC:
-
ALIBABA_CLOUD_ROLE_ARN: ARN dari role RAM.
-
ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN dari penyedia OIDC.
-
ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.
Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, rantai penyedia menggunakan nilai-nilai ini untuk memanggil API AssumeRoleWithOIDC dari Security Token Service (STS) untuk mendapatkan token STS.
3. Menggunakan config.json
Jika belum ditemukan kredensial, rantai penyedia mencoba memuat file kredensial bersama, config.json, dari lokasi default-nya 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. Role RAM instans ECS
Jika aplikasi Anda berjalan di instans Elastic Compute Service (ECS) atau Elastic Container Instance (ECI) yang telah diberi role RAM, alat Credentials mengambil token STS dari metadata instans untuk digunakan sebagai kredensial akses. Saat mengakses metadata instans, alat pertama-tama mengambil nama role RAM yang ditetapkan ke instans tersebut. Anda dapat menentukan nama role RAM dengan menggunakan parameter roleName atau variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk mengurangi waktu pengambilan dan meningkatkan efisiensi. Kredensial yang diperoleh dengan cara ini mendukung refresh otomatis. Untuk informasi selengkapnya, lihat Refresh otomatis kredensial sesi.
-
Jika diatur ke
false(default), alat kembali ke mode normal untuk mengambil kredensial. -
Jika diatur ke
true, alat hanya menggunakan mode aman dan melemparkan pengecualian jika akses gagal.
Dukungan server Anda terhadap IMDSv2 bergantung pada konfigurasinya.
Untuk menonaktifkan akses kredensial dari metadata instans, atur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.
-
Untuk informasi selengkapnya tentang metadata instans, lihat Metadata instans.
-
Untuk mempelajari cara memberikan role RAM ke instans ECS atau ECI, lihat Langkah 1: Buat role RAM dan Berikan role RAM instans ke instans ECI.
-
Anda memerlukan credentials-java versi 0.3.10 atau lebih baru untuk mendapatkan kredensial sementara dalam mode aman.
5. URI tool 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 tersebut mengakses URI untuk mengambil token STS.
Refresh otomatis kredensial sesi
Jenis kredensial sesi, seperti ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri, mendukung refresh otomatis melalui mekanisme bawaan dalam penyedia kredensial. Saat klien kredensial mengambil kredensial untuk pertama kalinya, penyedia menyimpannya dalam cache. Pada operasi selanjutnya, instans klien yang sama secara otomatis mengambil kredensial dari cache ini. Jika kredensial yang di-cache telah kedaluwarsa, instans klien mengambil yang baru dan memperbarui cache tersebut.
Untuk kredensial ecs_ram_role, penyedia kredensial secara proaktif merefresh-nya 15 menit sebelum kedaluwarsa.
Contoh berikut menggunakan pola singleton untuk membuat klien kredensial. Contoh ini menunjukkan mekanisme refresh dengan mengambil kredensial pada interval waktu berbeda dan memanggil operasi OpenAPI untuk memverifikasi bahwa kredensial tersebut dapat digunakan.
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 Credential mengelola instans kredensial Alibaba Cloud dengan menggunakan pola 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 mengelola instans klien ECS dengan menggunakan pola singleton statis.
/// Anda harus mengatur endpoint dan kredensial dengan Initialize.
/// </summary>
public static class EcsClient
{
private static string _endpoint = string.Empty; // Inisialisasi eksplisit. Nilainya tidak boleh null.
private static Aliyun.Credentials.Client _credential = null!; // Inisialisasi eksplisit. Nilainya tidak boleh null.
private static readonly Lazy<AlibabaCloud.SDK.Ecs20140526.Client> _instance = new(() =>
{
if (string.IsNullOrEmpty(_endpoint))
{
throw new InvalidOperationException("Endpoint harus diatur sebelum menginisialisasi klien ECS.");
}
if (_credential == null)
{
throw new InvalidOperationException("Kredensial harus diatur 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("Endpoint 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 EcsClient.
EcsClient.Initialize("ecs.cn-hangzhou.aliyuncs.com", Credential.Instance);
Action task = () =>
{
try
{
var credential = Credential.Instance.GetCredential();
Console.WriteLine(DateTime.Now);
Console.WriteLine($"ID AK: {credential.AccessKeyId}, Secret AK: {credential.AccessKeySecret}, Token STS: {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.
task();
// Mulai tugas asinkron secara konkuren.
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();
}
}
}2025/5/29 10:33:24
ID AK: STS.NVR3xxx P8KrfgTK, Secret AK: 6hsZk211xxx
PeZZ8NHSBeQo, Token STS: CAISxAJ1q6Ft5B2yf5jIr5XneN+ChrwS1It+pcEXr0DkFNMReiaL/qTz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtBkQt5I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA JlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAsg 3PjcmYvy1dKzlhvI856BxNHBq+A748VMgj01iX9IIPPtJO3TwsQdpz0agaAFJZJGZS4RxwNkWL934H/nip/ameLEvxylbsU0x8]AMGRtHmlzYuolmGovqyeKhpDOT+H0am7tG2LvzKHoyVN8Kuck/qb/JAX/
xV1mHcLp3iPma8q+9xboP81YeU06c0vy bzA2n7QI37852WyAA
Hasil pemanggilan: 200
2025/5/29 10:43:25
ID AK: STS.NVR3xxx P8KrfgTK, Secret AK: 6hsZk211xxx
PeZZ8NHSBeQo, Token STS: CAISxAJ1q6Ft5B2yf5jIr5XneN+ChrwS1It+pcEXr0DkFNMReiaL/qTz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtBkQt5I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA JlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAsg 3PjcmYvy1dKzlhvI856BxNHBq+A748VMgj01iX9IIPPtJO3TwsQdpz0agaAFJZJGZS4RxwNkWL934H/nip/ameLEvxylbsU0x8]AMGRtHmlzYuolmGovqyeKhpDOT+H0am7tG2LvzKHoyVN8Kuck/qb/JAX/
xV1mHcLp3iPma8q+9xboP81YeU06c0vy bzA2n7QI37852WyAA
Hasil pemanggilan: 200
2025/5/29 11:43:25
ID AK: STS.NWuFxxx BwvauFkU, Secret AK: 6fBbjmvd2T
ChJTi9gPixZE, Token STS: CAISxAJ1q6Ft5B2yf5jIrSTAG/74uLB13aeARFwQlYXe/lNmoPAtzz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtdxAt7I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA iJlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAtQ JU1tKDlwTxgBGOFKIQQrKj9PMSqhAcLJtS6MDE7NJKbt10KxV8Qdpz0agaAE7zrIhzsIKFMhIAyquB0Z8/YXeYdmswQUMbqmr+0gX306/0U9iWS612r6AalQSomcAD0eijKFnE8PFyx3YifekzIBCjr17TR
ujPRXpMzvxuXfvzz9eszDB0o0AXX5gTQ IKDI4Y7necJANrPiAA
Hasil pemanggilan: 200
2025/5/29 11:45:05
ID AK: STS.NWuPxxx bwvauFkU, Secret AK: 6fBbjmvd2T
ChJTi9gPixZE, Token STS: CAISxAJ1q6Ft5B2yf5jIrSTAG/74uLB13aeARFwQlYXe/lNmoPAtzz2IHhMeXZoA+4YsPu2mmFW6/sdlqdJQpp/QkjJRNF20plM7VtdxAt7I
pbng4YfgbiJREKxaXeirukwDsz9SNTCA iJlhHL91N0vCGlgpPtpNIRZ4o8I3LGbYMe3XUiTmM3NFkFlyGEe4CFdkf3jm5bHu0WB0gCkk7FO/trLT8L6P5U2DvBWsMyo2eF6TK3F3RNL5gJCnKUM1/QcpGif51/DXQEIvUIYbreL6L9mNxRkY6UgHkpJ
vCxxBmi0fUW5fe3VvPUtVVk900y3LAtQ U1U1tKDlwTxgBGOFKIQQrKj9PMSqhAcLJtS6MDE7NJKbt10KxV8Qdpz0agaAE7zrIhzsIKFMhIAyquB0Z8/YXeYdmswQUMbqmr+0gX306/0U9iWS612r6AalQSomcAD0eijKFnE8PFyx3YifekZIBCjr17TR
ujPRXpMzvxuXfvzz9eszDB0o0AXX5gTQ IKDI4Y7necJANrPiAA
Hasil pemanggilan: 200
Semua tugas selesai.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 role RAM secara terprogram; mendefinisikan kebijakan izin; dan memberikan izin, lihat Ikhtisar SDK RAM.
-
Untuk mengasumsikan role 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