全部产品
Search
文档中心

Elastic Container Instance:Gunakan peran RAM instans dengan memanggil operasi API

更新时间:Jul 06, 2025

Anda dapat menetapkan peran RAM instans ke Elastic Container Instance. Kemudian, Anda dapat mengakses API layanan Alibaba Cloud lainnya menggunakan kredensial Security Token Service (STS) dari aplikasi yang dijalankan pada instans kontainer elastis. Topik ini menjelaskan cara memanggil operasi API untuk membuat peran RAM instans, melampirkan kebijakan izin ke peran RAM, dan menetapkan peran RAM ke instans kontainer elastis.

Skenario

Aplikasi yang dijalankan pada instans kontainer elastis dapat mengakses API layanan Alibaba Cloud lainnya seperti Object Storage Service (OSS), Virtual Private Cloud (VPC), dan ApsaraDB RDS menggunakan pasangan AccessKey akun Alibaba Cloud atau pengguna RAM. Untuk mempermudah pemanggilan operasi API, beberapa pengguna menulis pasangan AccessKey ke instans, misalnya, menulis pasangan AccessKey ke file konfigurasi. Metode ini dapat menyebabkan masalah seperti kebocoran informasi dan pemeliharaan yang kompleks. Selain itu, metode ini juga dapat memberikan lebih banyak izin daripada yang diperlukan. Peran RAM instans dapat mencegah masalah tersebut.

Peran RAM adalah pengguna virtual dengan izin tertentu yang dapat diasumsikan oleh instans kontainer elastis, sehingga instans mendapatkan izin yang sesuai. Peran RAM menghilangkan kebutuhan untuk menyimpan pasangan AccessKey di instans kontainer elastis. Jika Anda ingin memodifikasi izin instans, cukup modifikasi izin peran RAM yang diasumsikan oleh instans. Hal ini mengurangi risiko kebocoran pasangan AccessKey. Untuk informasi lebih lanjut tentang peran RAM, lihat Ikhtisar Peran RAM.

Prosedur

Untuk menggunakan peran RAM instans dengan memanggil operasi API, ikuti langkah-langkah berikut:

  1. Buat Peran RAM Instans

    Anda dapat memanggil operasi CreateRole untuk membuat peran RAM instans. Dalam permintaan, tetapkan entitas tepercaya yang mengasumsikan peran RAM ke Elastic Container Instance dan layanan tepercaya ke Elastic Compute Service (ECS).

  2. Lampirkan Kebijakan Izin ke Peran RAM Instans

    Anda dapat memanggil operasi CreatePolicy untuk membuat kebijakan, lalu memanggil operasi AttachPolicyToRole untuk melampirkan kebijakan ke peran RAM instans.

  3. (Opsional) Berikan Izin kepada Pengguna RAM untuk Menggunakan Peran RAM Instans

    Sebelum menggunakan pengguna RAM untuk membuat instans kontainer elastis dan menetapkan peran RAM instans ke instans, Anda harus memberikan izin kepada pengguna RAM untuk menggunakan peran RAM instans.

  4. Tetapkan Peran RAM Instans ke Instans Kontainer Elastis

    Saat memanggil operasi CreateContainerGroup untuk membuat instans kontainer elastis, gunakan parameter RamRoleName untuk menetapkan peran RAM instans ke instans kontainer elastis. Dengan cara ini, instans mendapatkan izin dari peran RAM. Hanya satu peran RAM instans yang dapat ditetapkan ke instans kontainer elastis.

  5. Dapatkan Token STS

    Setelah menetapkan peran RAM instans ke instans kontainer elastis, Anda harus mendapatkan token STS menggunakan metadata instans jika ingin mengakses API layanan Alibaba Cloud lainnya dari aplikasi pada instans kontainer elastis.

Buat peran RAM instans

Panggil operasi CreateRole untuk membuat peran RAM instans. Untuk informasi tentang parameter, lihat CreateRole.

Gunakan parameter RoleName untuk menentukan nama peran. Nama peran ECIRamRoleTest digunakan dalam contoh ini. Kemudian, konfigurasikan AssumeRolePolicyDocument berdasarkan kode berikut.

{
"Statement": [
{
  "Action": "sts:AssumeRole",
  "Effect": "Allow",
  "Principal": {
    "Service": [
      "ecs.aliyuncs.com"
    ]
  }
}
],
"Version": "1"
}

Lampirkan kebijakan ke peran RAM instans

  1. Panggil operasi CreatePolicy untuk membuat kebijakan kustom.

    Konfigurasikan parameter berikut dalam permintaan:

    • PolicyName: nama kebijakan. Nama ECIRamRoleTestPolicy digunakan dalam contoh ini.

    • PolicyDocument: detail tentang kebijakan.

      {
           "Statement": [
               {
               "Action": [
                   "oss:Get*",
                   "oss:List*"
               ],
               "Effect": "Allow",
               "Resource": "*"
               }
           ],
           "Version": "1"
       }

    Untuk informasi lebih lanjut, lihat CreatePolicy.

  2. Panggil operasi AttachPolicyToRole untuk melampirkan kebijakan ke peran RAM.

    Konfigurasikan parameter berikut dalam permintaan:

    • PolicyName: nama kebijakan. Nama ECIRamRoleTestPolicy digunakan dalam contoh ini.

    • PolicyType: jenis kebijakan. Tetapkan parameter ini ke Custom.

    • RoleName: nama peran RAM. Nama ECIRamRoleTest digunakan dalam contoh ini.

    Untuk informasi lebih lanjut, lihat AttachPolicyToRole.

Berikan izin kepada pengguna RAM untuk menggunakan peran RAM instans

Jika Anda ingin pengguna RAM menggunakan peran RAM instans, Anda harus memberikan izin ram:PassRole dari peran RAM instans ke pengguna RAM. Jika pengguna RAM tidak memiliki izin ram:PassRole, pengguna RAM tidak dapat menggunakan izin yang ditentukan dalam kebijakan peran.

  1. Masuk ke Konsol RAM menggunakan pengguna RAM yang memiliki izin administratif atau menggunakan akun Alibaba Cloud.

  2. Berikan izin kepada pengguna RAM untuk menggunakan peran RAM instans.

    Untuk memberikan izin kepada pengguna RAM untuk menggunakan peran RAM instans, buat kebijakan kustom berikut dan lampirkan kebijakan ke pengguna RAM. ECIRamRoleTest adalah nama peran RAM instans. Izin ram:PassRole dari peran RAM akan diberikan kepada pengguna RAM. Untuk informasi lebih lanjut, lihat Berikan Izin kepada Pengguna RAM.

    {
       "Statement": [
        {
          "Effect": "Allow",
          "Action": "ram:PassRole",
          "Resource": "acs:ram:*:*:role/ECIRamRoleTest" 
        }
      ],
      "Version": "1"
    }                

Tetapkan peran RAM instans ke instans kontainer elastis

Saat memanggil operasi CreateContainerGroup untuk membuat instans kontainer elastis, gunakan parameter RamRoleName untuk menentukan peran RAM. Untuk informasi lebih lanjut, lihat CreateContainerGroup.

Catatan

Hanya satu peran RAM instans yang dapat ditetapkan ke instans kontainer elastis. Jika peran RAM instans telah ditetapkan ke instans kontainer elastis, pesan kesalahan akan muncul saat Anda mencoba menetapkan peran RAM instans lain ke instans.

Dapatkan token STS

Anda dapat mengakses URL metadata di pod untuk mendapatkan token STS dari peran RAM. Token STS dapat digunakan untuk melakukan izin dan menggunakan sumber daya dari 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 mendapatkan token STS dalam 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 for Go untuk mengakses layanan Alibaba Cloud dengan menggunakan token STS. Dalam contoh ini, Anda dapat mengakses Bucket OSS menggunakan token STS yang Anda peroleh dan melihat semua objek yang terdaftar di bucket.

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

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