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
-
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 rolüne izin verin.
Bir izin ilkesi oluşturun. Ayrıntılı talimatlar için bkz. Özel ilke oluşturma.
İzin ilkesini RAM rolüne ekleyin. Ayrıntılı talimatlar için bkz. RAM rolüne izin verme.
-
(İ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:passRoleiznini 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.
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.
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
}
}
}