Sambungkan peran RAM ke layanan EAS Anda agar kode yang berjalan di dalam layanan dapat memanggil API Alibaba Cloud lainnya tanpa menyimpan AccessKey jangka panjang. Saat waktu proses, instans layanan secara otomatis mengambil kredensial STS sementara dan memperbaruinya sebelum kedaluwarsa.
Manfaat
Menggunakan peran RAM alih-alih AccessKey yang dikodekan langsung memberikan dua keuntungan:
-
Keamanan: Kredensial bersifat sementara dan tidak pernah disimpan dalam gambar atau konfigurasi layanan Anda. Tidak ada kunci jangka panjang yang berisiko bocor.
-
Kontrol terperinci: Perbarui kebijakan izin peran RAM kapan saja untuk mengubah sumber daya yang dapat diakses layanan—tanpa perlu menerapkan ulang.
Batasan
Setiap layanan EAS hanya dapat dikaitkan dengan satu peran RAM.
Pilih jenis peran
| Peran default PAI | Peran kustom | |
|---|---|---|
| Apa itu | Peran layanan bawaan AliyunServiceRoleForPaiEas, tersedia secara otomatis |
Peran RAM yang Anda buat dan konfigurasi sendiri |
| Izin | Hanya MaxCompute dan OSS | Layanan Alibaba Cloud apa pun yang Anda berikan aksesnya |
| Kapan digunakan | Mengakses bucket OSS default ruang kerja atau proyek MaxCompute tempat pemilik layanan memiliki izin eksekusi | Skenario lainnya, atau ketika Anda memerlukan kontrol izin yang lebih granular |
| Usaha pengaturan | Tambahkan satu bidang JSON ke konfigurasi layanan | Buat peran, berikan kebijakan, lalu tambahkan ARN peran ke konfigurasi layanan |
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Layanan EAS di PAI atau penerapan yang siap dikonfigurasi
-
(Untuk peran kustom) Akses ke Konsol RAM untuk membuat dan mengelola peran
-
(Untuk Pengguna RAM) Hubungi akun utama untuk memberikan izin
ram:PassRole— lihat Berikan izin PassRole kepada Pengguna RAM
Sambungkan peran default PAI
Tambahkan bidang berikut ke JSON pada bagian Service Configuration saat melakukan penerapan:
"options": {
"enable_ram_role": true
}
Setelah diaktifkan, instans layanan dapat mengakses:
-
Data di proyek MaxCompute tempat pemilik layanan EAS memiliki izin eksekusi, melalui SDK PyODPS
-
Data di bucket OSS default yang telah ditetapkan di ruang kerja saat ini, melalui SDK OSS
Jika Anda melakukan penerapan menggunakan JSON langsung dan ingin menggunakan SDK OSS melalui peran default PAI, sertakan bidang metadata.workspace_id dalam konfigurasi layanan.
Sambungkan peran RAM kustom
Langkah 1: Buat peran RAM
-
Masuk ke Konsol RAM dan buat peran RAM.
-
Atur parameter berikut:
Parameter Nilai Principal Type Cloud Service Principal Name Platform for AI/PAI ( eas.pai.aliyuncs.com) -
Pada tab Trust Policy peran baru, pastikan
eas.pai.aliyuncs.communcul dalam larik principalService. Kebijakan kepercayaan ini mengontrol layanan mana yang dapat mengasumsikan peran tersebut. Contoh kebijakan kepercayaan yang dikonfigurasi dengan benar adalah sebagai berikut:PentingKetidakhadiran entri ini merupakan penyebab paling umum dari kesalahan penerapan
failed to assume role. Jika peran dibuat dengan principal berbeda (misalnya, layanan lain), klik Edit Trust Policy dan tambahkan"eas.pai.aliyuncs.com"ke larikService.{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": ["acs:ram::aaa:root"], "Service": ["xxx.aliyuncs.com"] } } ], "Version": "1" }
Langkah 2: Berikan izin kepada peran
Sambungkan kebijakan sistem atau kustom untuk memberikan akses peran ke sumber daya yang dibutuhkan layanan Anda. Sebagai contoh, sambungkan AliyunOSSReadOnlyAccess untuk mengizinkan akses baca ke OSS.
Jika layanan memasang sumber data (NAS atau OSS) atau menarik gambar kustom saat penerapan, berikan izin yang sesuai kepada peran tersebut:
-
Sumber data: Kontrol akses NAS atau Kontrol akses OSS
-
Gambar container: Container Registry
Langkah 3: Kaitkan peran saat penerapan
Tambahkan konfigurasi berikut ke JSON pada bagian Service Configuration. Ganti role_arn dengan ARN peran yang telah Anda buat. Untuk menemukan ARN, lihat Lihat peran RAM.
"options": {
"enable_ram_role": true
},
"role_arn": "acs:ram::111*************:role/${RoleName}"
Berikan izin PassRole kepada Pengguna RAM
Jika Anda menerapkan layanan EAS sebagai Pengguna RAM (sub-akun), akun utama harus memberikan izin ram:PassRole kepada Anda. Tanpa izin ini, penerapan akan gagal dengan kesalahan konfigurasi peran.
Minta akun utama untuk menyambungkan kebijakan kustom berikut ke Pengguna RAM Anda. Ganti ${RoleName} dengan nama peran RAM yang dikaitkan dengan layanan EAS. Untuk bantuan, lihat Buat kebijakan izin kustom dan Berikan izin kepada Pengguna RAM.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "ram:PassRole",
"Resource": "acs:ram::*:role/${RoleName}"
}
]
}
Dapatkan kredensial akses sementara
Setelah peran disambungkan, instans layanan dapat mengambil kredensial sementara STS melalui tiga cara. Ketiga metode ini mengembalikan bidang kredensial yang sama.
Metode 1: Credentials tool
Credentials tool membaca kredensial dari titik akhir lokal yang secara otomatis disuntikkan ke instans layanan. Kredensial diperbarui secara berkala—kode Anda tidak perlu menangani rotasi.
Saat melakukan penerapan, instal alibabacloud_credentials di bagian Third-party Library Configuration (lewati langkah ini jika sudah ada dalam gambar Anda).
Kemudian gunakan kode berikut untuk menginisialisasi klien terotentikasi:
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials.models import Config as CredConfig
credentials_config = CredConfig(type='credentials_uri')
credentials_client = CredClient(credentials_config)
Untuk contoh dalam bahasa lain, lihat Praktik terbaik untuk mengakses OpenAPI Alibaba Cloud menggunakan kredensial akses.
Metode 2: Panggil titik akhir kredensial lokal
Di dalam instans layanan, panggil server lokal yang secara otomatis disuntikkan untuk mendapatkan kredensial saat ini:
# Ambil kredensial sementara untuk peran RAM instans
curl $ALIBABA_CLOUD_CREDENTIALS_URI
Contoh respons:
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
| Bidang | Deskripsi |
|---|---|
SecurityToken |
Token sementara untuk peran RAM |
Expiration |
Waktu kedaluwarsa kredensial (UTC) |
Metode 3: Baca file kredensial
PAI-EAS secara otomatis menulis kredensial ke /etc/ram/credentials di dalam instans layanan dan memperbarui file tersebut secara berkala. Baca file ini secara langsung jika panggilan HTTP lokal tidak memungkinkan:
{
"Code": "Success",
"AccessKeyId": "STS.N*********7",
"AccessKeySecret": "3***************d",
"SecurityToken": "DFE32G*******",
"Expiration": "2024-05-21T10:39:29Z"
}
Contoh
Contoh berikut menunjukkan cara mengakses OSS dan MaxCompute dari dalam layanan EAS menggunakan peran RAM. Kedua contoh menggunakan providers.DefaultCredentialsProvider(), yang secara otomatis mengambil kredensial dari titik akhir lokal yang disuntikkan.
Contoh-contoh ini menggunakan halaman Custom Deployment di Konsol PAI. Untuk deskripsi parameter lengkap, lihat Deskripsi parameter penerapan kustom konsol.
Cara kerja contoh: Pasang skrip Python ke instans layanan melalui Model Configuration, lalu atur perintah run untuk mengeksekusinya. Hal ini menghindari pembuatan gambar kustom.
Contoh 1: Akses data OSS
import oss2
from alibabacloud_credentials.client import Client
from alibabacloud_credentials import providers
from itertools import islice
if __name__ == '__main__':
auth = oss2.ProviderAuth(providers.DefaultCredentialsProvider())
bucket = oss2.Bucket(
auth,
'<oss_endpoint>', # Titik akhir internal, misalnya oss-cn-hangzhou-internal.aliyuncs.com
'<oss_bucket>' # Harus merupakan bucket OSS default untuk ruang kerja saat ini
)
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
Ganti placeholder berikut:
| Placeholder | Deskripsi |
|---|---|
<oss_bucket> |
Nama bucket OSS Anda. Harus merupakan bucket OSS default yang telah ditetapkan di ruang kerja saat ini. |
<oss_endpoint> |
Titik akhir endpoint untuk wilayah bucket Anda. Secara default, EAS tidak terhubung ke internet publik, sehingga gunakan titik akhir internal (misalnya, oss-cn-hangzhou-internal.aliyuncs.com). Untuk menggunakan titik akhir publik, konfigurasikan virtual private cloud (VPC) dengan akses internet untuk EAS. Lihat Konfigurasi jaringan. |
Contoh 2: Akses MaxCompute (PyODPS)
from alibabacloud_credentials import providers
from odps.accounts import CredentialProviderAccount
from odps import ODPS
if __name__ == '__main__':
account = CredentialProviderAccount(providers.DefaultCredentialsProvider())
o = ODPS(
account=account,
project='<odps_project>', # Nama proyek MaxCompute Anda
endpoint='<odps_endpoint>' # Titik akhir internal, misalnya https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api
)
for t in o.list_tables():
print(t)
Ganti placeholder berikut:
| Placeholder | Deskripsi |
|---|---|
<odps_project> |
Nama proyek MaxCompute Anda. Temukan di Konsol MaxCompute di bawah Workspace > Project Management. Jika menerapkan sebagai Pengguna RAM, pastikan pengguna tersebut memiliki izin operasi untuk proyek tersebut. Lihat Otorisasi pengguna lain. |
<odps_endpoint> |
Titik akhir endpoint untuk wilayah proyek Anda. Secara default, EAS tidak terhubung ke internet publik, sehingga gunakan titik akhir internal (misalnya, https://service.cn-hangzhou-vpc.maxcompute.aliyun-inc.com/api). Untuk menggunakan titik akhir publik, konfigurasikan VPC dengan akses internet untuk EAS. Lihat Konfigurasi jaringan. |
Terapkan contoh
Pada halaman Custom Deployment, konfigurasikan parameter berikut:
| Parameter | Nilai |
|---|---|
| Run Command (di bawah Environment Information) | python /mnt/data/xx.py |
| Model Configuration | Pasang direktori yang berisi skrip Anda dan atur jalur pemasangan ke /mnt/data/ |
| Third-party Library List (di bawah Third-party Library Configuration) | alibabacloud_credentials, pyodps, oss2 — lewati jika sudah pra-instal dalam gambar Anda |
| Service Configuration | Tambahkan "options": { "enable_ram_role": true } ke JSON |
Setelah mengklik Deploy, lihat output di log layanan setelah layanan berjalan.
Pemecahan Masalah
Peran tidak ditemukan
Gejala: Anda mengalami kesalahan Permission Denied dengan kode kesalahan Forbidden.PrivilegeDenied. Aksi otorisasi adalah ram:PassRole, dan hasil pemeriksaan izin menunjukkan izin tidak mencukupi.
Periksa di Konsol RAM apakah peran tersebut ada.
-
Peran tidak ada: Perbarui konfigurasi layanan untuk mereferensikan nama peran yang ada.
-
Peran ada tetapi kesalahan tetap muncul: Pengguna RAM yang menerapkan layanan tidak memiliki izin
ram:PassRole. Minta akun utama untuk menyambungkan kebijakan berikut (ganti${RoleName}dengan nama peran). Lihat Berikan izin kepada Pengguna RAM.{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram::*:role/${RoleName}" } ] }
Gagal mengasumsikan peran
Gejala: Tab Deployment Events pada halaman Elastic Algorithm Service menampilkan:
unable to render, error: failed to assume role for user, reason: You are not authorized to do this action. You should be authorized by RAM.
Kebijakan kepercayaan peran RAM tidak menyertakan eas.pai.aliyuncs.com sebagai principal tepercaya. Untuk memperbaikinya:
-
Masuk ke Konsol RAM sebagai administrator RAM.
-
Di panel navigasi kiri, pilih Identities > Roles.
-
Klik nama peran RAM target.
-
Pada tab Trust Policy, klik Edit Trust Policy.
-
Dalam larik
Service, tambahkan"eas.pai.aliyuncs.com"dan klik OK.
Sebelum:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": ["xxx.aliyuncs.com"]
}
}
],
"Version": "1"
}
Sesudah:
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
"RAM": ["acs:ram::aaa:root"],
"Service": [
"xxx.aliyuncs.com",
"eas.pai.aliyuncs.com"
]
}
}
],
"Version": "1"
}