Tüm Ürünler
Search
Belge Merkezi

Elastic Container Instance:ECI poduna RAM rolü atama

Son Güncelleme:Oct 06, 2026

RAM rolü, bir ECI podunun üstlenebileceği ve böylece bu rolün izinlerini devralabileceği belirli izinlere sahip sanal bir kimliktir. Bir rol atamak, pod içindeki uygulamaların diğer Alibaba Cloud hizmetlerine erişmek için Security Token Service (STS) üzerinden STS kimlik bilgilerini kullanmasına olanak tanır.

Arka Plan

ECI podlarında dağıtılan uygulamalar genellikle Object Storage Service (OSS), Virtual Private Cloud (VPC) ve ApsaraDB RDS gibi diğer Alibaba Cloud hizmetlerine erişmek için bir Alibaba Cloud hesabının veya bir RAM kullanıcısının AccessKey çiftini kullanır. Kolaylık sağlamak amacıyla bazı kullanıcılar AccessKey çiftini doğrudan pod içine gömer; örneğin, yapılandırma dosyasında sabit kodlayarak. Bu uygulama, kimlik bilgilerinin sızması, aşırı izinler ve anahtar döndürme ile bakım zorlukları gibi güvenlik riskleri yaratır.

Örnek RAM rolü kullanmak, ECI podlarınızda AccessKey çifti depolama ihtiyacını ortadan kaldırır. Atanan RAM rolüne eklenen izin ilkelerini değiştirerek ECI podu için izinleri istediğiniz zaman değiştirebilirsiniz. Bu yöntem daha güvenli ve kullanışlıdır. RAM rolleri hakkında daha fazla bilgi için bkz. RAM rollerine genel bakış.

RAM rolü oluşturma ve izin verme

  1. Bir RAM rolü oluşturun. Ayrıntılı talimatlar için bkz. Güvenilen bir Alibaba Cloud hizmeti için RAM rolü oluşturma.

    RAM rolünü oluştururken güvenilen varlık türü olarak Alibaba Cloud Service ve güvenilen hizmet olarak Elastic Compute Service seçin.

    RAM角色.png

  2. RAM rolüne izin verin.

    1. Bir izin ilkesi oluşturun. Ayrıntılı talimatlar için bkz. Özel ilke oluşturma.

    2. İzin ilkesini RAM rolüne ekleyin. Ayrıntılı talimatlar için bkz. RAM rolüne izin verme.

  3. (İsteğe bağlı) Bir RAM kullanıcısına RAM rolünü kullanma yetkisi verin.

    Bir RAM kullanıcısının RAM rolünü atamasını istiyorsanız, o RAM kullanıcısına ram:passRole iznini vermeniz gerekir. Aşağıdaki ilke, kullanıcının geçiş yapmasına izin verilen RAM rolünün adının ECIRamRoleTest olduğu bir örneği gösterir.

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

ECI poduna RAM rolü atama

Bir ECI podu oluştururken, bir RAM rolü atamak için k8s.aliyun.com/eci-ram-role-name ek açıklamasını kullanabilirsiniz. Bu, podun diğer Alibaba Cloud hizmetlerine erişmesini sağlar.

Önemli
  • Ek açıklamalar, podun yapılandırma dosyasındaki metadata bölümüne eklenmelidir. Örneğin, bir Deployment oluştururken ek açıklamaları spec.template.metadata bölümüne eklemeniz gerekir.

  • Elastic Container Instance ile ilgili ek açıklamalar yalnızca bir pod oluşturulduğunda uygulanır. Mevcut bir poda bu ek açıklamaları eklemek veya değiştirmek hiçbir etki yaratmaz.

Aşağıdaki YAML dosyası bir örnek sunar:

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"]

STS belirteci alma

Bir ECI örneğinden, atanan RAM rolü için bir STS belirteci almak üzere bir meta veri URL'sine erişebilirsiniz. Rolün izinlerine göre kaynaklara erişmek için bu belirteci kullanabilirsiniz. STS belirteci otomatik olarak ve periyodik aralıklarla yenilenir.

curl http://100.100.100.200/latest/meta-data/ram/security-credentials/${your_ram_role_name}

${your_ram_role_name} ifadesini RAM rolünüzün adıyla değiştirin. Örneğin, rol adı ECIRamRoleTest ise komut aşağıdaki gibidir:

curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ECIRamRoleTest

Yanıt, STS belirtecini içerir. Aşağıdaki çıktı bir örnek sunar:

{
  "AccessKeyId" : "STS.******",
  "AccessKeySecret" : "******",
  "Expiration" : "2023-06-22T19:13:58Z",
  "SecurityToken" : "******",
  "LastUpdated" : "2023-06-22T13:13:58Z",
  "Code" : "Success"
}

STS belirteci ile cloud hizmetlerine erişim

Aşağıdaki örnek, Go SDK ve bir STS belirteci kullanarak Object Storage Service (OSS) hizmetine nasıl erişileceğini gösterir. Bu örnekte kod, belirtilen bir OSS paketine erişir ve içindeki tüm nesneleri listeler.

Not

Bu örnek yalnızca gösterim amaçlıdır. Üretim ortamında kodunuzu belirli iş gereksinimlerinize göre yazın. Daha fazla bilgi için erişmek istediğiniz Alibaba Cloud hizmetinin SDK belgelerine bakın.

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 provide an OSS bucket name.")
	}

	output, err := exec.Command("curl", securityCredUrl).Output()
	if err != nil {
		log.Fatalf("Failed to get the RAM role name from the metadata server: %s", err)
	}

	output, err = exec.Command("curl", securityCredUrl+string(output)).Output()
	if err != nil {
		log.Fatalf("Failed to get security credentials from the metadata server: %s", err)
	}

	authServiceIdentity := new(AssumedRoleUserCredentialsWithServiceIdentity)
	if err := json.Unmarshal(output, authServiceIdentity); err != nil {
		log.Fatalf("Failed to unmarshal to AssumedRoleUserCredentialsWithServiceIdentity: %s", err)
	}

	// Create an OSS client. In a production environment, you must periodically update the client to prevent access failures due to an expired STS token.
	ossClient, err := oss.New(ossEndpoint, authServiceIdentity.AccessKeyId,
		authServiceIdentity.AccessKeySecret, oss.SecurityToken(authServiceIdentity.SecurityToken))
	if err != nil {
		log.Fatalf("Failed to create an OSS client: %s", err)
	}

	// Get the bucket.
	bucket, err := ossClient.Bucket(ossBucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket %q: %s", ossBucketName, err)
	}

	// List objects in the bucket.
	marker := ""
	for {
		lsRes, err := bucket.ListObjects(oss.Marker(marker))
		if err != nil {
			log.Fatalf("Failed to list objects from bucket %q: %s", ossBucketName, err)
		}
		// Print the listed objects. By default, a maximum of 100 objects are returned at a time.
		for _, object := range lsRes.Objects {
			log.Println("Object: ", object.Key)
		}
		if lsRes.IsTruncated {
			marker = lsRes.NextMarker
		} else {
			break
		}
	}
}