Tetapkan peran Resource Access Management (RAM) ke pod berbasis Elastic Container Instance agar aplikasi yang berjalan di dalamnya dapat memanggil API layanan Alibaba Cloud lainnya menggunakan kredensial sementara dari Security Token Service (STS), tanpa menyimpan Pasangan Kunci Akses (AccessKey pair) di dalam pod.
Mengapa menggunakan peran RAM
Menyimpan Pasangan Kunci Akses secara langsung di dalam pod (misalnya, dalam file konfigurasi) menimbulkan beberapa masalah:
Credential exposure: Kebocoran Pasangan Kunci Akses memberikan akses permanen hingga dicabut secara manual.
Excessive permissions: Pasangan Kunci Akses yang dibagikan sulit dibatasi hanya pada izin yang benar-benar dibutuhkan oleh setiap pod.
High maintenance overhead: Rotasi kredensial mengharuskan pembaruan pada setiap pod yang menyimpannya.
Peran RAM mengatasi masalah-masalah tersebut. Pod mengasumsikan peran tersebut saat waktu proses (runtime) dan menerima kredensial STS berumur pendek yang secara otomatis dirotasi. Untuk mengubah akses yang dimiliki pod, cukup perbarui kebijakan izin peran tersebut—tanpa perlu me-restart pod.
Untuk informasi latar belakang mengenai peran RAM, lihat RAM role overview.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Pod berbasis Elastic Container Instance (atau Deployment yang menjadwalkan pod ECI)
(Opsional) Jika pengaturan ini dilakukan oleh Pengguna RAM, Pengguna RAM tersebut harus memiliki izin
ram:PassRoleuntuk peran target. Lihat langkah 3 di Create a RAM role and grant permissions.
Buat peran RAM dan berikan izin
Buat peran RAM. Untuk informasi selengkapnya, lihat Create a RAM role for a trusted Alibaba Cloud service. Saat diminta, pilih Alibaba Cloud Service sebagai entitas tepercaya dan Elastic Compute Service sebagai layanan tepercaya.

Lampirkan kebijakan izin ke peran tersebut.
Buat kebijakan kustom. Untuk informasi selengkapnya, lihat Buat kebijakan kustom.
Lampirkan kebijakan tersebut ke peran RAM. Untuk informasi selengkapnya, lihat Grant permissions to a RAM role.
(Opsional) Berikan izin kepada Pengguna RAM untuk meneruskan peran tersebut. Jika Pengguna RAM akan menetapkan peran ini ke pod, Pengguna RAM tersebut memerlukan izin
ram:PassRoleyang diberi cakupan khusus untuk peran tersebut. GantiECIRamRoleTestdengan nama peran Anda.{ "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram:*:*:role/ECIRamRoleTest" } ], "Version": "1" }
Tetapkan peran RAM ke pod
Tambahkan anotasi k8s.aliyun.com/eci-ram-role-name ke bagian metadata pod saat membuatnya. Ganti ${your_ram_role_name} dengan nama peran RAM Anda.
Anotasi hanya berlaku saat pod dibuat. Menambahkan atau mengubah anotasi pada pod yang sudah ada tidak akan berpengaruh. Untuk Deployment, tambahkan anotasi di bawah spec.template.metadata, bukan di bawah metadata tingkat atas.
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
name: test
labels:
app: test
alibabacloud.com/eci: "true"
annotations:
k8s.aliyun.com/eci-ram-role-name: "${your_ram_role_name}" # Assign the RAM role.
spec:
containers:
- name: test
image: registry.cn-shanghai.aliyuncs.com/eci_open/centos:7
command: ["sleep"]
args: ["3600"]Verifikasi konfigurasi
Setelah pod mulai berjalan, pastikan pod tersebut dapat mengambil kredensial STS dari layanan metadata instans.
Jalankan perintah berikut dari dalam pod. Ganti ${your_ram_role_name} dengan nama peran RAM Anda.
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/${your_ram_role_name}Sebagai contoh, jika peran Anda bernama ECIRamRoleTest:
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ECIRamRoleTestTanggapan yang berhasil terlihat seperti berikut:
{
"AccessKeyId": "STS.******",
"AccessKeySecret": "******",
"Expiration": "2023-06-22T19:13:58Z",
"SecurityToken": "******",
"LastUpdated": "2023-06-22T13:13:58Z",
"Code": "Success"
}Jika tanggapan mengembalikan Code: Success, peran telah ditetapkan dengan benar dan kredensial tersedia. Kredensial STS secara otomatis dirotasi sebelum masa berlakunya habis.
Akses layanan Alibaba Cloud menggunakan kredensial STS
Contoh kode Go berikut mengambil kredensial STS dari layanan metadata dan menggunakannya untuk mencantumkan objek dalam bucket Object Storage Service (OSS).
Contoh ini menunjukkan pola penggunaan kredensial STS. Di lingkungan produksi, sesuaikan kode dengan logika bisnis Anda dan merujuk dokumentasi SDK untuk layanan yang Anda panggil. Refresh klien OSS sebelum kredensial kedaluwarsa untuk menghindari kegagalan akses.
package main
import (
"encoding/json"
"flag"
"log"
"os/exec"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
const (
securityCredUrl = "http://100.100.100.200/latest/meta-data/ram/security-credentials/"
)
var (
ossEndpoint string
ossBucketName string
)
func init() {
flag.StringVar(&ossEndpoint, "endpoint", "oss-cn-hangzhou-internal.aliyuncs.com", "Please input oss endpoint, Recommended internal endpoint, eg: oss-cn-hangzhou-internal.aliyuncs.com")
flag.StringVar(&ossBucketName, "bucket", "", "Please input oss bucket name")
}
type AssumedRoleUserCredentialsWithServiceIdentity struct {
AccessKeyId string `json:"AccessKeyId" xml:"AccessKeyId"`
AccessKeySecret string `json:"AccessKeySecret" xml:"AccessKeySecret"`
Expiration string `json:"Expiration" xml:"Expiration"`
SecurityToken string `json:"SecurityToken" xml:"SecurityToken"`
LastUpdated string `json:"LastUpdated" xml:"LastUpdated"`
Code string `json:"Code" xml:"Code"`
}
func main() {
flag.Parse()
if ossEndpoint == "" {
log.Fatal("Please input oss endpoint, eg: oss-cn-hangzhou-internal.aliyuncs.com")
}
if ossBucketName == "" {
log.Fatal("Please input oss bucket name")
}
// Retrieve the RAM role name from the metadata service.
output, err := exec.Command("curl", securityCredUrl).Output()
if err != nil {
log.Fatalf("Failed to get RAM role name from metadata service: %s", err)
}
// Retrieve STS credentials for the role.
output, err = exec.Command("curl", securityCredUrl+string(output)).Output()
if err != nil {
log.Fatalf("Failed to get security credentials from metadata service: %s", err)
}
authServiceIdentity := new(AssumedRoleUserCredentialsWithServiceIdentity)
if err := json.Unmarshal(output, authServiceIdentity); err != nil {
log.Fatalf("Failed to unmarshal security credentials: %s", err)
}
// Create an OSS client using STS credentials.
// In production, refresh the client before credentials expire to maintain continuous access.
ossClient, err := oss.New(ossEndpoint, authServiceIdentity.AccessKeyId,
authServiceIdentity.AccessKeySecret, oss.SecurityToken(authServiceIdentity.SecurityToken))
if err != nil {
log.Fatalf("Failed to create OSS client: %s", err)
}
// Get a reference to the bucket.
bucket, err := ossClient.Bucket(ossBucketName)
if err != nil {
log.Fatalf("Failed to get bucket %q: %s", ossBucketName, err)
}
// List all objects in the bucket. By default, up to 100 objects are returned per request.
marker := ""
for {
lsRes, err := bucket.ListObjects(oss.Marker(marker))
if err != nil {
log.Fatalf("Failed to list objects in bucket %q: %s", ossBucketName, err)
}
for _, object := range lsRes.Objects {
log.Println("Object:", object.Key)
}
if lsRes.IsTruncated {
marker = lsRes.NextMarker
} else {
break
}
}
}Langkah selanjutnya
RAM role overview — pelajari cara kerja peran RAM dan STS secara bersamaan
Grant permissions to a RAM role — sesuaikan layanan yang dapat diakses oleh peran tersebut