全部产品
Search
文档中心

Alibaba Cloud SDK:Mengelola kredensial akses

更新时间:Nov 10, 2025

Saat menggunakan SDK Alibaba Cloud, informasi kredensial seperti Pasangan Kunci Akses dan token Security Token Service (STS) dikelola oleh alat Credentials. Topik ini menjelaskan jenis kredensial yang didukung oleh alat Credentials serta cara mengonfigurasinya.

Prasyarat

Instal alat Credentials

Kami menyarankan Anda menggunakan pip untuk menginstal alat ini.

pip install alibabacloud_credentials

Untuk informasi tentang versi terbaru pustaka alibabacloud_credentials, lihat alibabacloud-credentials · PyPI atau Github. Kami menyarankan Anda menggunakan versi terbaru untuk memastikan dukungan semua fitur.

Jenis kredensial yang didukung oleh alat Credentials dan parameter konfigurasinya

Jenis kredensial yang didukung oleh alat Credentials dan parameter konfigurasinya didefinisikan dalam kelas Config pada modul alibabacloud_credentials.models. Jenis kredensial ditentukan oleh parameter type. Jenis kredensial yang berbeda memerlukan parameter konfigurasi yang berbeda. Tabel berikut menjelaskan nilai valid untuk type dan parameter konfigurasi yang didukung masing-masing jenis. Dalam tabel ini, Supported menunjukkan parameter yang diperlukan, - menunjukkan parameter opsional, dan Not supported menunjukkan bahwa parameter tersebut tidak didukung.

Catatan

Kami menyarankan agar Anda tidak menggunakan parameter yang tidak tercantum dalam tabel berikut.

type

access_key

sts

ram_role_arn

ecs_ram_role

oidc_role_arn

credentials_uri

bearer

access_key_id: ID AccessKey.

Supported

Supported

Supported

Not supported

Not supported

Not supported

Not supported

access_key_secret: Rahasia AccessKey.

Supported

Supported

Not supported

Not supported

Not supported

Not supported

security_token: token Security Token Service (STS).

Not supported

-

Not supported

Not supported

Not supported

Not supported

role_arn: Nama Sumber Daya Alibaba Cloud (ARN) dari peran Resource Access Management (RAM).

Not supported

Not supported

Supported

Not supported

Supported

Not supported

Not supported

role_session_name: Nama kustom untuk sesi. Nilai default berformat credentials-python-current_timestamp.

×

Unsupported

-

Not supported

-

Not supported

Not supported

role_name: Menentukan nama peran RAM.

Not supported

Not supported

Not supported

-

Not supported

Not supported

Not supported

disable_imds_v1: Menentukan apakah akan memaksa menggunakan mode penguatan keamanan (IMDSv2). Jika Anda mengatur parameter ini ke true, mode penguatan keamanan (IMDSv2) digunakan. Nilai default: false.

Not supported

×

Not supported

-

Not supported

Not supported

Not supported

bearer_token: token bearer.

Not supported

Not supported

Not supported

Not supported

Not supported

Not supported

policy: kebijakan kustom.

Not supported

Not supported

-

Not supported

-

×

Not supported

role_session_expiration: periode waktu habis sesi. Nilai default: 3600. Satuan: detik.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

oidc_provider_arn: ARN dari penyedia identitas OpenID Connect (OIDC) (IdP).

Not supported

Not supported

Not supported

Not supported

Supported

Not supported

Not supported

oidc_token_file_path: jalur mutlak ke token OIDC.

Not supported

Unsupported

Not supported

Not supported

Supported

Not supported

Not supported

external_id: ID eksternal peran, yang digunakan untuk mencegah masalah confused deputy. Untuk informasi selengkapnya, lihat Gunakan ID eksternal untuk mencegah masalah confused deputy.

Not supported

×

-

Not supported

Not supported

Not supported

Not supported

credentials_uri: URI kredensial.

Not supported

Not supported

Not supported

Not supported

Not supported

Supported

Not supported

sts_endpoint: titik akhir STS. Titik akhir VPC dan titik akhir Internet didukung. Nilai default: sts.aliyuncs.com. Untuk informasi selengkapnya tentang nilai yang valid, lihat Titik Akhir.

Not supported

Not supported

-

Not supported

-

Not supported

Not supported

timeout: periode waktu habis permintaan baca HTTP. Nilai default: 5000. Satuan: milidetik.

Not supported

Not supported

-

-

-

-

Not supported

connect_timeout: periode waktu habis permintaan koneksi HTTP. Nilai default: 10000. Satuan: milidetik.

Not supported

Not supported

-

-

-

-

Not supported

Gunakan alat Credentials

Bagian berikut menyediakan contoh kode untuk menunjukkan cara menggunakan alat Credentials. Anda dapat memilih metode berdasarkan kebutuhan Anda.

Penting
  • Kami menyarankan Anda menyimpan Pasangan Kunci Akses di variabel lingkungan atau file konfigurasi.

  • Kami menyarankan Anda menggunakan pola singleton saat menggunakan alat Credentials. Praktik ini mengaktifkan fitur caching kredensial bawaan, mencegah masalah throttling akibat banyak panggilan API, serta menghindari pemborosan sumber daya karena pembuatan banyak instans. Untuk informasi selengkapnya, lihat Mekanisme pembaruan otomatis untuk kredensial sesi.

Metode 1: Rantai penyedia kredensial default

Catatan

Ini adalah metode default yang digunakan dalam kode contoh di Portal OpenAPI.

Saat Anda menggunakan alat Credentials tanpa meneruskan parameter konfigurasi apa pun, alat ini mengambil kredensial dari rantai penyedia kredensial default. Jika menggunakan metode ini, pastikan setidaknya satu metode pengambilan kredensial yang didukung oleh rantai penyedia kredensial default telah dikonfigurasi di lingkungan runtime aplikasi Anda.

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_tea_openapi import models as open_api_models

# Jangan tentukan parameter konfigurasi apa pun. Kredensial akan diambil dari rantai penyedia kredensial default.
credentialsClient = CredentialClient()

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 2: Pasangan Kunci Akses

Alat Credentials menggunakan AccessKey Anda sebagai kredensial akses.

Peringatan

Akun Alibaba Cloud memiliki izin penuh atas semua sumber daya. Jika Pasangan Kunci Akses akun Alibaba Cloud bocor, hal ini menimbulkan ancaman keamanan signifikan bagi sistem Anda. Kami tidak merekomendasikan penggunaan Pasangan Kunci Akses akun Alibaba Cloud.

Kami menyarankan Anda menggunakan Pasangan Kunci Akses Pengguna RAM yang diberikan izin minimum yang diperlukan.

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='access_key',
    # Wajib. Contoh ini menunjukkan cara mendapatkan ID AccessKey dari variabel lingkungan.
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # Wajib. Contoh ini menunjukkan cara mendapatkan Rahasia AccessKey dari variabel lingkungan.
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET')
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 3: Token STS

Alat Credentials menggunakan token STS statis yang Anda berikan sebagai kredensial akses.

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='sts',
    # Wajib. Contoh ini menunjukkan cara mendapatkan ID AccessKey dari variabel lingkungan.
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # Wajib. Contoh ini menunjukkan cara mendapatkan Rahasia AccessKey dari variabel lingkungan.
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # Wajib. Contoh ini menunjukkan cara mendapatkan token keamanan sementara dari variabel lingkungan.
    security_token=os.environ.get('ALIBABA_CLOUD_SECURITY_TOKEN')
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 4: Pasangan Kunci Akses dan RamRoleArn

Alat Credentials menggunakan AccessKey dan ARN peran RAM yang Anda berikan untuk memanggil AssumeRole, mendapatkan token STS, lalu menggunakannya sebagai kredensial akses. Kredensial yang diperoleh dengan cara ini mendukung pembaruan otomatis. Untuk informasi selengkapnya, lihat Mekanisme pembaruan otomatis untuk kredensial sesi.

import os

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='ram_role_arn',
    # Wajib. Contoh ini menunjukkan cara mendapatkan ID AccessKey dari variabel lingkungan.
    access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    # Wajib. Contoh ini menunjukkan cara mendapatkan Rahasia AccessKey dari variabel lingkungan.
    access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    # Wajib. ARN peran RAM yang akan diasumsikan. Contoh: acs:ram::123456789012****:role/adminrole. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
    role_arn='<role_arn>',
    # Opsional. Nama sesi peran. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
    role_session_name='<role_session_name>',
    # Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    policy='<policy>',
    # Opsional. ID eksternal peran, yang digunakan untuk mencegah masalah confused deputy.
    external_id='<external_id>',
    # Opsional. Waktu kedaluwarsa sesi. Nilai default adalah 3600 detik.
    role_session_expiration=3600
)

credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 5: Peran RAM instans ECS

Jika aplikasi Anda berjalan di instans ECS atau ECI yang diberi peran RAM, alat Credentials dapat mengambil token STS peran RAM dari metadata instans. Token STS ini kemudian digunakan sebagai kredensial akses. Kredensial yang diambil dengan cara ini mendukung pembaruan otomatis. Untuk informasi selengkapnya, lihat Mekanisme pembaruan otomatis untuk kredensial sesi.

Alat Credentials secara default menggunakan mode penguatan keamanan (IMDSv2) untuk mengakses metadata instans ECS. Jika terjadi pengecualian dalam mode penguatan keamanan, Anda dapat menggunakan parameter disable_imds_v1 atau variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol logika penanganan pengecualian:

  • Jika nilainya False (default), sistem mencoba beralih ke mode NAT dan melanjutkan pengambilan kredensial.

  • Jika nilainya True, kredensial hanya dapat diambil dalam mode penguatan keamanan. Jika akses dalam mode penguatan keamanan gagal, pengecualian dilemparkan.

Dukungan server terhadap IMDSv2 bergantung pada konfigurasi server Anda.

Anda juga dapat mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true untuk menonaktifkan akses kredensial dari metadata instans.

Catatan
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='ecs_ram_role',
    # Opsional. Nama peran ECS. Jika Anda tidak menentukan parameter ini, nama akan diambil secara otomatis. Kami menyarankan Anda menentukan parameter ini untuk mengurangi jumlah permintaan. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA.
    role_name='<role_name>',
    # Opsional. Nilai default adalah False. Jika diatur ke True, mode penguatan keamanan dipaksakan. Jika diatur ke False, sistem pertama-tama mencoba mengambil kredensial dalam mode penguatan keamanan. Jika upaya gagal, sistem beralih ke mode normal (IMDSv1).
    disable_imds_v1=True
)

credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 6: OIDCRoleArn

Jika Anda menggunakan protokol autentikasi OIDC dan telah membuat peran RAM untuk Penyedia Identitas OIDC, Anda dapat memberikan ARN Penyedia Identitas OIDC, token OIDC, dan ARN peran RAM ke alat Credentials. Sistem secara otomatis memanggil API AssumeRoleWithOIDC STS untuk mendapatkan token STS untuk peran RAM dan menggunakannya sebagai kredensial akses. Kredensial yang diperoleh dengan metode ini mendukung pembaruan otomatis. Untuk informasi selengkapnya, lihat Mekanisme pembaruan otomatis untuk kredensial sesi. Misalnya, jika aplikasi Anda berjalan di kluster ACK yang memiliki fitur RRSA diaktifkan, alat Credentials dapat membaca informasi konfigurasi OIDC dari variabel lingkungan pod, memanggil API AssumeRoleWithOIDC untuk mendapatkan token STS untuk peran layanan, lalu menggunakan token STS tersebut untuk mengakses layanan Alibaba Cloud.

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='oidc_role_arn',
    # Wajib. ARN peran RAM. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_ARN.
    role_arn='<role_arn>',
    # Wajib. ARN Penyedia Identitas OIDC. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_PROVIDER_ARN.
    oidc_provider_arn='<oidc_provider_arn>',
    # Wajib. Jalur file token OIDC. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_OIDC_TOKEN_FILE.
    oidc_token_file_path='<oidc_token_file_path>',
    # Opsional. Nama sesi peran. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_ROLE_SESSION_NAME.
    role_session_name='<role_session_name>',
    # Opsional. Kebijakan izin yang lebih kecil. Contoh: {"Statement": [{"Action": ["*"],"Effect": "Allow","Resource": ["*"]}],"Version":"1"}
    policy='<policy>',
    # Opsional. Waktu kedaluwarsa sesi. Nilai default adalah 3600 detik.
    role_session_expiration=3600
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 7: Kredensial URI

Anda dapat mengenkapsulasi layanan STS dan mengekspos URI-nya untuk memungkinkan layanan eksternal mengambil token STS dari URI tersebut. Hal ini mengurangi risiko terpaparnya informasi sensitif seperti AccessKey. Alat Credentials dapat mengakses URI yang Anda berikan untuk mengambil token STS. Token STS ini kemudian digunakan sebagai kredensial akses. Kredensial yang diambil dengan cara ini mendukung pembaruan otomatis. Untuk informasi selengkapnya, lihat Mekanisme pembaruan otomatis untuk kredensial sesi.

URI harus memenuhi kondisi berikut:

  • Mendukung permintaan GET.

  • Mengembalikan kode status 200.

  • Badan respons memiliki struktur berikut:

    {
      "Code": "Success",
      "AccessKeySecret": "yourAccessKeySecret",
      "AccessKeyId": "STS.****************",
      "Expiration": "2021-09-26T03:46:38Z",
      "SecurityToken": "yourSecurityToken"
    }
from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='credentials_uri',
    # Wajib. URI eksternal untuk mengambil kredensial. Formatnya http://local_or_remote_uri/. Anda dapat mengatur ini menggunakan variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI.
    credentials_uri='<credentials_uri>',
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK V2.0 untuk produk Alibaba Cloud, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Metode 8: Token Bearer

Saat ini, hanya Cloud Call Center (CCC) yang mendukung token bearer.

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_tea_openapi import models as open_api_models

credentialsConfig = CredentialConfig(
    type='bearer',
    # Wajib. Masukkan token bearer Anda.
    bearer_token='<BearerToken>',
)
credentialsClient = CredentialClient(credentialsConfig)

credential = credentialsClient.get_credential()
access_key_id = credential.get_access_key_id()
access_key_secret = credential.get_access_key_secret()
security_token = credential.get_security_token()

# Jika Anda menggunakan SDK CCC V2.0, gunakan kelas Config dari modul alibabacloud_tea_openapi.models untuk meneruskan kredensial.
config = open_api_models.Config(
    credential=credentialsClient,
    endpoint='<endpoint>'
)
# ... Kode untuk menginisialisasi klien produk menggunakan objek config dihilangkan.

Rantai penyedia kredensial default

Rantai penyedia kredensial default adalah strategi fallback yang mencari kredensial dalam urutan yang telah ditentukan. Alat ini melewati rantai hingga menemukan informasi kredensial. Jika informasi kredensial tidak dapat diperoleh dari penyedia mana pun dalam rantai, `CredentialException` dilemparkan. Urutan pencarian adalah sebagai berikut:

1. Menggunakan variabel lingkungan

Jika tidak ditemukan informasi kredensial dalam properti sistem, alat Credentials memeriksa variabel lingkungan.

  • Jika variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID dan ALIBABA_CLOUD_ACCESS_KEY_SECRET ada dan tidak kosong, Pasangan Kunci Akses digunakan sebagai kredensial default.

  • Jika variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID, ALIBABA_CLOUD_ACCESS_KEY_SECRET, dan ALIBABA_CLOUD_SECURITY_TOKEN semuanya diatur, token STS digunakan sebagai kredensial default.

2. Mendapatkan informasi kredensial menggunakan peran RAM Penyedia Identitas OIDC

Jika tidak ditemukan informasi kredensial, alat Credentials memeriksa variabel lingkungan berikut yang terkait dengan peran RAM OIDC:

  • ALIBABA_CLOUD_ROLE_ARN: ARN peran RAM.

  • ALIBABA_CLOUD_OIDC_PROVIDER_ARN: ARN Penyedia Identitas OIDC.

  • ALIBABA_CLOUD_OIDC_TOKEN_FILE: Jalur file token OIDC.

Jika ketiga variabel lingkungan tersebut ada dan tidak kosong, alat Credentials menggunakan nilai variabel lingkungan ini untuk memanggil operasi AssumeRoleWithOIDC STS dan mendapatkan token STS sebagai kredensial default.

3. Menggunakan file konfigurasi

Catatan

Fitur ini memerlukan versi alibabacloud_credentials 1.0rc3 atau lebih baru.

Jika kredensial masih belum ditemukan, alat Credentials mencoba memuat file config.json dari jalur default dan menggunakan kredensial yang ditentukan sebagai kredensial default. Jalur file default adalah:

  • Linux/macOS: ~/.aliyun/config.json

  • Windows: C:\Users\USER_NAME\.aliyun\config.json

Untuk mengonfigurasi kredensial menggunakan metode ini, Anda dapat menggunakan Cloud Assistant CLI atau membuat file konfigurasi config.json secara manual di jalur yang sesuai. Blok kode berikut menunjukkan contoh format kontennya:

{
  "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

Menentukan nama kredensial yang akan digunakan, yang sesuai dengan nilai parameter profiles pada nilai name. Secara default, sistem memprioritaskan nama kredensial yang ditentukan oleh variabel lingkungan ALIBABA_CLOUD_PROFILE . Jika variabel lingkungan ini tidak diatur, sistem menggunakan nama kredensial yang ditentukan oleh current.

profiles

Kumpulan informasi kredensial. Gunakan parameter mode untuk menentukan jenis kredensial:

  • AK: Menggunakan Pasangan Kunci Akses pengguna sebagai kredensial.

  • StsToken: Menggunakan token STS sebagai kredensial.

  • RamRoleArn: Mendapatkan kredensial dengan meminta Pengguna RAM mengasumsikan peran RAM.

  • EcsRamRole: Mendapatkan kredensial dari metadata instans.

  • OIDC: Mendapatkan kredensial menggunakan ARN Penyedia Identitas OIDC, token OIDC, dan ARN peran RAM.

  • ChainableRamRoleArn: Menggunakan metode perantai peran untuk mendapatkan informasi kredensial baru dengan menggunakan source_profile untuk menentukan nama kredensial lain dalam profiles.

4. Mendapatkan informasi kredensial menggunakan peran RAM instans ECS

Jika tidak ditemukan informasi kredensial, alat Credentials mencoba mendapatkan token STS peran RAM yang diberikan ke instans dari metadata instans dan menggunakannya sebagai kredensial default. Saat mengakses metadata instans, program pertama-tama mendapatkan nama peran RAM yang dilampirkan ke instans saat ini, lalu mendapatkan token STS yang sesuai berdasarkan peran tersebut. Anda juga dapat menentukan nama peran RAM menggunakan variabel lingkungan ALIBABA_CLOUD_ECS_METADATA untuk mengurangi waktu yang diperlukan untuk mendapatkan kredensial dan meningkatkan efisiensi.

Secara default, alat Credentials mengakses metadata dalam mode penguatan keamanan (IMDSv2). Jika terjadi pengecualian dalam mode penguatan keamanan, Anda dapat menggunakan variabel lingkungan ALIBABA_CLOUD_IMDSV1_DISABLED untuk mengontrol logika penanganan pengecualian:

  • Jika nilainya false (default), sistem mencoba beralih ke mode NAT untuk melanjutkan pengambilan kredensial.

  • Jika nilainya true, hanya mode penguatan keamanan yang diizinkan untuk mendapatkan kredensial. Jika akses dalam mode penguatan keamanan gagal, pengecualian dilemparkan.

Selain itu, Anda dapat menonaktifkan akses kredensial dari metadata instans dengan mengatur variabel lingkungan ALIBABA_CLOUD_ECS_METADATA_DISABLED=true.

Catatan

5. Mendapatkan informasi kredensial berdasarkan URI

Jika tidak ditemukan informasi kredensial, alat Credentials memeriksa variabel lingkungan ALIBABA_CLOUD_CREDENTIALS_URI. Jika variabel ini ada dan mengarah ke URI yang valid, alat Credentials mengakses URI ini untuk mendapatkan token STS sebagai kredensial default.

Mekanisme pembaruan otomatis kredensial sesi

Kredensial sesi mencakup ram_role_arn, ecs_ram_role, oidc_role_arn, dan credentials_uri. Jenis kredensial ini memiliki mekanisme pembaruan otomatis bawaan dalam alat Credentials. Setelah klien kredensial mendapatkan kredensial untuk pertama kalinya, alat Credentials menyimpan informasi kredensial ke cache. Pada permintaan berikutnya, instans klien kredensial yang sama secara otomatis mengambil kredensial dari cache. Jika kredensial dalam cache telah kedaluwarsa, instans klien kredensial akan mengambil kembali kredensial dan memperbarui cache.

Catatan

Untuk kredensial `ecs_ram_role`, alat Credentials menyegarkan cache 15 menit sebelum kredensial kedaluwarsa.

Contoh berikut membuat klien kredensial dalam pola singleton. Klien mendapatkan kredensial pada titik waktu yang berbeda untuk memverifikasi mekanisme pembaruan otomatis dan memanggil operasi OpenAPI untuk memastikan bahwa kredensial yang diperoleh valid.

import os
import sys
import time
import threading
from functools import wraps
from threading import Lock

from alibabacloud_credentials.client import Client as CredentialClient
from alibabacloud_credentials.models import Config as CredentialConfig
from alibabacloud_ecs20140526.client import Client
from alibabacloud_ecs20140526.models import DescribeRegionsRequest
from alibabacloud_tea_openapi.models import Config as EcsConfig


#
# Dekorator singleton aman thread
#

def singleton(cls):
    """Menerapkan pola singleton aman thread"""
    instances = {}
    lock = Lock()

    @wraps(cls)
    def wrapper(*args, **kwargs):
        with lock:
            if cls not in instances:
                instances[cls] = cls(*args, **kwargs)
        return instances[cls]

    return wrapper


#
# Kelas layanan singleton
#

@singleton
class Credential:
    def __init__(self):
        self._client = self._init_client()

    @staticmethod
    def _init_client() -> CredentialClient:
        try:
            config = CredentialConfig(
                type="ram_role_arn",
                access_key_id=os.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
                access_key_secret=os.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),
                role_arn=os.getenv("ALIBABA_CLOUD_ROLE_ARN"),
                role_session_name="RamRoleArnTest",
                role_session_expiration=3600,
            )
            return CredentialClient(config)
        except Exception as e:
            raise RuntimeError(f"Inisialisasi kredensial gagal: {e}") from e

    @property
    def client(self) -> CredentialClient:
        return self._client


@singleton
class EcsClient:
    def __init__(self, credential: CredentialClient):
        self._client = self._init_client(credential)

    @staticmethod
    def _init_client(credential: CredentialClient) -> Client:
        try:
            ecs_config = EcsConfig(credential=credential)
            ecs_config.endpoint = 'ecs.cn-hangzhou.aliyuncs.com'
            return Client(ecs_config)
        except Exception as e:
            raise RuntimeError(f"Inisialisasi klien ECS gagal: {e}") from e

    @property
    def client(self) -> Client:
        return self._client


#
# Fungsi tugas
#

def execute_task():
    try:
        # Dapatkan kredensial dan klien ECS.
        credential = Credential().client.get_credential()
        ecs_client = EcsClient(Credential().client).client

        # Cetak informasi kredensial.
        print("Waktu:", time.strftime("%Y-%m-%d %H:%M:%S"))
        print("ID AK:", credential.access_key_id)
        print("Rahasia AK:", credential.access_key_secret)
        print("Token STS:", credential.security_token)

        # Panggil operasi API untuk mengkueri daftar wilayah.
        request = DescribeRegionsRequest()
        response = ecs_client.describe_regions(request)
        print("Hasil pemanggilan:", response.to_map()["statusCode"])

    except Exception as e:
        print(f"Eksekusi klien ECS gagal: {e}")
        raise


def schedule_task():
    def run_execute_task():
        try:
            execute_task()
        except Exception as e:
            print(f"Eksekusi tugas gagal: {e}")
        finally:
            nonlocal task_count
            task_count += 1
            if task_count == len(DELAYS):
                print("Semua tugas selesai. Keluar dari program.")
                sys.exit(0)

    def schedule_execution(delay):
        task_timer = threading.Timer(delay, run_execute_task)
        task_timer.start()
        return task_timer

    # Tentukan penundaan untuk tugas terjadwal.
    DELAYS = [0, 600, 4200, 4300]
    task_count = 0

    timers = [schedule_execution(delay) for delay in DELAYS]

    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("Program dihentikan oleh pengguna.")
        for timer in timers:
            timer.cancel()


if __name__ == "__main__":
    schedule_task()

image

Bagian berikut menganalisis hasil log:

  • Pada panggilan pertama, tidak ada informasi kredensial yang di-cache. Oleh karena itu, sistem mendapatkan kredensial berdasarkan konfigurasi. Setelah kredensial diperoleh, kredensial tersebut disimpan dalam cache.

  • Kredensial yang digunakan pada panggilan kedua sama dengan yang pertama. Ini menunjukkan bahwa kredensial untuk panggilan kedua diambil dari cache.

  • Pada panggilan ketiga, kredensial dalam cache telah kedaluwarsa. Hal ini karena periode validitas kredensial (`RoleSessionExpiration`) diatur menjadi 3.600 detik, dan panggilan ketiga terjadi 4.200 detik setelah panggilan pertama. Oleh karena itu, SDK mengambil kembali kredensial baru berdasarkan mekanisme pembaruan otomatis dan menyimpan kredensial baru ke cache.

  • Kredensial yang digunakan pada panggilan keempat sama dengan kredensial baru yang diperoleh pada panggilan ketiga. Ini menunjukkan bahwa kredensial dalam cache telah diperbarui setelah kedaluwarsa.

Referensi