Peran RAM adalah identitas virtual dengan izin tertentu yang dapat diasumsikan oleh pod ECI sehingga mewarisi izin tersebut. Dengan menetapkan peran RAM, aplikasi dalam pod dapat menggunakan kredensial STS dari Security Token Service (STS) untuk mengakses layanan Alibaba Cloud lainnya.
Latar Belakang
Aplikasi yang dijalankan pada pod ECI sering menggunakan pasangan AccessKey dari Akun Alibaba Cloud atau Pengguna RAM untuk mengakses layanan Alibaba Cloud lainnya, seperti Object Storage Service (OSS), Virtual Private Cloud (VPC), dan ApsaraDB RDS. Untuk kemudahan, beberapa pengguna menyematkan pasangan AccessKey langsung ke dalam pod—misalnya, dengan menuliskannya secara eksplisit di file konfigurasi. Praktik ini menimbulkan risiko keamanan, termasuk kebocoran kredensial, izin berlebihan, serta kesulitan dalam rotasi dan pemeliharaan kunci.
Dengan menggunakan instance RAM role, Anda tidak perlu lagi menyimpan pasangan AccessKey di dalam pod ECI. Izin untuk pod ECI dapat diubah kapan saja dengan memodifikasi kebijakan izin yang dilampirkan pada peran RAM yang ditetapkan. Pendekatan ini lebih aman dan praktis. Untuk informasi selengkapnya mengenai peran RAM, lihat Ikhtisar peran RAM.
Buat peran RAM dan berikan izin
-
Buat peran RAM. Untuk petunjuk lengkap, lihat Buat peran RAM untuk layanan Alibaba Cloud tepercaya.
Saat membuat peran RAM, pilih Alibaba Cloud Service sebagai tipe entitas tepercaya dan Elastic Compute Service sebagai layanan tepercaya.

-
Berikan izin kepada peran RAM.
-
Buat kebijakan izin. Untuk petunjuk lengkap, lihat Buat kebijakan kustom.
-
Lampirkan kebijakan izin ke peran RAM. Untuk petunjuk lengkap, lihat Berikan izin kepada peran RAM.
-
-
(Opsional) Beri otorisasi kepada Pengguna RAM untuk menggunakan peran RAM tersebut.
Jika Anda ingin Pengguna RAM menetapkan peran RAM tersebut, Anda harus memberikan izin
ram:passRolekepada Pengguna RAM tersebut. Kebijakan berikut menunjukkan contoh di mana ECIRamRoleTest adalah nama peran RAM yang boleh dilewatkan oleh pengguna.{ "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram:*:*:role/ECIRamRoleTest" } ], "Version": "1" }
Tetapkan peran RAM ke pod ECI
Saat membuat pod ECI, Anda dapat menggunakan anotasi k8s.aliyun.com/eci-ram-role-name untuk menetapkan peran RAM, sehingga pod dapat mengakses layanan Alibaba Cloud lainnya.
Anotasi harus ditambahkan ke metadata dalam file konfigurasi pod. Misalnya, saat membuat Deployment, tambahkan anotasi di bagian spec.template.metadata.
Anotasi terkait Elastic Container Instance hanya berlaku saat pod dibuat. Menambahkan atau mengubah anotasi ini pada pod yang sudah ada tidak akan berpengaruh.
File YAML berikut memberikan contoh:
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}" # Tetapkan peran RAM.
spec:
containers:
- name: test
image: registry.cn-shanghai.aliyuncs.com/eci_open/centos:7
command: ["sleep"]
args: ["3600"]
Dapatkan token STS
Dari instans ECI, Anda dapat mengakses URL metadata untuk mengambil token STS dari peran RAM yang ditetapkan. Token ini dapat digunakan untuk mengakses sumber daya sesuai dengan izin peran tersebut dan diperbarui secara otomatis secara berkala.
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/${your_ram_role_name}
Ganti ${your_ram_role_name} dengan nama peran RAM Anda. Sebagai contoh, jika nama perannya adalah ECIRamRoleTest, perintahnya adalah sebagai berikut:
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ECIRamRoleTest
Tanggapan berisi token STS. Contoh output berikut menunjukkan hasilnya:
{
"AccessKeyId" : "STS.******",
"AccessKeySecret" : "******",
"Expiration" : "2023-06-22T19:13:58Z",
"SecurityToken" : "******",
"LastUpdated" : "2023-06-22T13:13:58Z",
"Code" : "Success"
}
Mengakses layanan cloud dengan token STS
Contoh berikut menunjukkan cara menggunakan Go SDK dan token STS untuk mengakses Object Storage Service (OSS). Dalam contoh ini, kode mengakses bucket OSS tertentu dan mencantumkan semua objek di dalamnya.
Contoh ini hanya untuk tujuan demonstrasi. Di lingkungan produksi, sesuaikan kode Anda dengan kebutuhan bisnis spesifik Anda. Untuk informasi lebih lanjut, rujuk dokumentasi SDK layanan Alibaba Cloud yang ingin Anda 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", "Masukkan endpoint OSS, disarankan menggunakan titik akhir internal, contoh: oss-cn-hangzhou-internal.aliyuncs.com")
flag.StringVar(&ossBucketName, "bucket", "", "Masukkan nama bucket OSS")
}
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("Masukkan endpoint OSS, contoh: oss-cn-hangzhou-internal.aliyuncs.com")
}
if ossBucketName == "" {
log.Fatal("Harap berikan nama bucket OSS.")
}
output, err := exec.Command("curl", securityCredUrl).Output()
if err != nil {
log.Fatalf("Gagal mendapatkan nama peran RAM dari server metadata: %s", err)
}
output, err = exec.Command("curl", securityCredUrl+string(output)).Output()
if err != nil {
log.Fatalf("Gagal mendapatkan kredensial keamanan dari server metadata: %s", err)
}
authServiceIdentity := new(AssumedRoleUserCredentialsWithServiceIdentity)
if err := json.Unmarshal(output, authServiceIdentity); err != nil {
log.Fatalf("Gagal melakukan unmarshal ke AssumedRoleUserCredentialsWithServiceIdentity: %s", err)
}
// Buat klien OSS. Di lingkungan produksi, Anda harus memperbarui klien secara berkala untuk mencegah kegagalan akses akibat token STS kedaluwarsa.
ossClient, err := oss.New(ossEndpoint, authServiceIdentity.AccessKeyId,
authServiceIdentity.AccessKeySecret, oss.SecurityToken(authServiceIdentity.SecurityToken))
if err != nil {
log.Fatalf("Gagal membuat klien OSS: %s", err)
}
// Dapatkan bucket.
bucket, err := ossClient.Bucket(ossBucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket %q: %s", ossBucketName, err)
}
// Cantumkan objek dalam bucket.
marker := ""
for {
lsRes, err := bucket.ListObjects(oss.Marker(marker))
if err != nil {
log.Fatalf("Gagal mencantumkan objek dari bucket %q: %s", ossBucketName, err)
}
// Cetak objek yang dicantumkan. Secara default, maksimal 100 objek dikembalikan sekaligus.
for _, object := range lsRes.Objects {
log.Println("Object: ", object.Key)
}
if lsRes.IsTruncated {
marker = lsRes.NextMarker
} else {
break
}
}
}