全部产品
Search
文档中心

Elastic Container Instance:Tetapkan peran RAM ke pod

更新时间:Jun 29, 2025

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

  1. 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.

    RAM角色.png

  2. Lampirkan kebijakan izin ke peran RAM.

    1. Buat kebijakan. Untuk informasi lebih lanjut, lihat Buat Kebijakan Kustom.

    2. Lampirkan kebijakan ke peran RAM. Untuk informasi lebih lanjut, lihat Berikan Izin ke Peran RAM.

  3. (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. Izin ram:PassRole dari 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.

Penting
  • 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/ECIRamRoleTest

Anda 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.

Catatan

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
		}
	}
}