Peran Manajemen Akses Sumber Daya (RAM) adalah pengguna virtual dengan izin tertentu yang dapat diasumsikan oleh pod berbasis Elastic Container Instance. Hal ini memungkinkan pod untuk mendapatkan izin yang sesuai. Topik ini menjelaskan cara menetapkan peran RAM ke pod sehingga aplikasi pada pod dapat mengakses API layanan Alibaba Cloud lainnya menggunakan kredensial Security Token Service (STS).
Informasi latar belakang
Aplikasi yang diterapkan pada pod dapat mengakses API layanan Alibaba Cloud lainnya seperti Object Storage Service (OSS), Virtual Private Cloud (VPC), dan ApsaraDB RDS dengan menggunakan pasangan AccessKey dari akun Alibaba Cloud atau pengguna RAM. Untuk mempermudah pemanggilan operasi API, beberapa pengguna menulis pasangan AccessKey ke pod, misalnya dengan menulis pasangan AccessKey ke file konfigurasi. Namun, praktik ini dapat menyebabkan masalah seperti kebocoran informasi, kompleksitas pemeliharaan yang meningkat, dan izin yang berlebihan.
Peran RAM instans dapat mencegah masalah tersebut. Peran RAM menghilangkan kebutuhan untuk menyimpan pasangan AccessKey di pod. Jika Anda ingin memodifikasi izin pod, Anda hanya perlu memodifikasi izin peran RAM yang diasumsikan oleh pod. Ini mengurangi risiko kebocoran pasangan AccessKey. Untuk informasi lebih lanjut tentang peran RAM, lihat Ikhtisar Peran RAM.
Buat peran RAM dan berikan izin ke peran tersebut
Buat peran RAM. Untuk informasi lebih lanjut, lihat Buat Peran RAM untuk Layanan Tepercaya Alibaba Cloud.
Saat membuat peran RAM, pilih Alibaba Cloud Service sebagai entitas tepercaya dan Elastic Compute Service sebagai layanan tepercaya.

Lampirkan kebijakan izin ke peran RAM.
Buat kebijakan. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.
Lampirkan kebijakan ke peran RAM. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.
(Opsional) Otorisasi pengguna RAM untuk menggunakan peran RAM.
Jika Anda ingin pengguna RAM menggunakan peran RAM, pastikan pengguna RAM memiliki izin
ram:passRole. Kode berikut memberikan detail izin tersebut. ECIRamRoleTest adalah nama peran RAM. Izinram:PassRoledari peran RAM akan diberikan kepada pengguna RAM.{ "Statement": [ { "Effect": "Allow", "Action": "ram:PassRole", "Resource": "acs:ram:*:*:role/ECIRamRoleTest" } ], "Version": "1" }
Tetapkan peran RAM ke pod
Saat membuat pod, Anda dapat menggunakan anotasi k8s.aliyun.com/eci-ram-role-name untuk menetapkan peran RAM ke pod. Dengan cara ini, pod dapat mengasumsikan peran RAM untuk mengakses layanan Alibaba Cloud.
Anotasi harus ditambahkan ke metadata dalam file konfigurasi pod. Misalnya, saat membuat Deployment, Anda harus menambahkan anotasi di bagian spec.template.metadata.
Untuk menggunakan fitur Elastic Container Instance, Anda hanya dapat menambahkan anotasi saat membuat pod berbasis Elastic Container Instance. Jika Anda menambahkan atau memodifikasi anotasi saat memperbarui pod, anotasi tersebut tidak akan berlaku.
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"]Peroleh token STS
Anda dapat mengakses URL metadata di pod untuk memperoleh token STS dari peran RAM. Token STS dapat digunakan untuk melakukan izin dan menggunakan sumber daya peran RAM. Token STS diperbarui secara otomatis dan berkala.
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/${your_ram_role_name}Ganti ${your_ram_role_name} dengan nama sebenarnya dari peran RAM Anda. Dalam contoh ini, ECIRamRoleTest digunakan sebagai nama peran RAM. Contoh perintah:
curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ECIRamRoleTestAnda dapat memperoleh token STS di output perintah. Contoh:
{
"AccessKeyId" : "STS.******",
"AccessKeySecret" : "******",
"Expiration" : "2023-06-22T19:13:58Z",
"SecurityToken" : "******",
"LastUpdated" : "2023-06-22T13:13:58Z",
"Code" : "Success"
}Akses layanan Alibaba Cloud berdasarkan token STS
Contoh berikut menunjukkan cara menggunakan SDK untuk Go untuk mengakses layanan Alibaba Cloud dengan menggunakan token STS. Dalam contoh ini, Anda dapat mengakses Bucket OSS dengan menggunakan token STS yang Anda peroleh dan melihat semua objek yang terdaftar di bucket tersebut.
Kode sampel berikut hanya digunakan untuk menunjukkan cara mengakses layanan Alibaba Cloud dengan menggunakan token STS. Dalam skenario nyata, tulis kode berdasarkan persyaratan bisnis Anda. Untuk informasi lebih lanjut, lihat SDK dari layanan cloud yang ingin Anda gunakan.
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", "Silakan masukkan titik akhir oss, Titik akhir internal direkomendasikan, misalnya: oss-cn-hangzhou-internal.aliyuncs.com")
flag.StringVar(&ossBucketName, "bucket", "", "Silakan 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("Silakan masukkan titik akhir oss, misalnya: oss-cn-hangzhou-internal.aliyuncs.com")
}
if ossBucketName == "" {
log.Fatal("Silakan masukkan titik akhir oss")
}
output, err := exec.Command("curl", securityCredUrl).Output()
if err != nil {
log.Fatalf("Gagal mendapatkan nama ramrole dari metaserver: %s", err)
}
output, err = exec.Command("curl", securityCredUrl+string(output)).Output()
if err != nil {
log.Fatalf("Gagal mendapatkan kredensial keamanan dari metaserver: %s", err)
}
authServiceIdentity := new(AssumedRoleUserCredentialsWithServiceIdentity)
if err := json.Unmarshal(output, authServiceIdentity); err != nil {
log.Fatalf("Gagal Unmarshal ke AssumedRoleUserCredentialsWithServiceIdentity: %s", err)
}
// Buat instance klien OSS. Jika klien OSS digunakan dalam lingkungan produksi, Anda perlu memperbarui klien OSS secara berkala untuk mencegah token STS kedaluwarsa dan gagal mengakses layanan Alibaba Cloud.
ossClient, err := oss.New(ossEndpoint, authServiceIdentity.AccessKeyId,
authServiceIdentity.AccessKeySecret, oss.SecurityToken(authServiceIdentity.SecurityToken))
if err != nil {
log.Fatalf("Gagal membuat klien oss baru: %s", err)
}
// Dapatkan bucket.
bucket, err := ossClient.Bucket(ossBucketName)
if err != nil {
log.Fatalf("Gagal mendapatkan bucket %q: %s", ossBucketName, err)
}
// Daftarkan objek di bucket.
marker := ""
for {
lsRes, err := bucket.ListObjects(oss.Marker(marker))
if err != nil {
log.Fatalf("Gagal mencantumkan objek dari bucket %q: %s", ossBucketName, err)
}
// Tampilkan objek yang terdaftar. Secara default, maksimum 100 objek dikembalikan sekaligus.
for _, object := range lsRes.Objects {
log.Println("Bucket: ", object.Key)
}
if lsRes.IsTruncated {
marker = lsRes.NextMarker
} else {
break
}
}
}