日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

通過API使用實例RAM角色

實例RAM角色允許您將一個角色關聯到ECI實例,在實例內部基于STS(Security Token Service)臨時憑證訪問其他云產品的API。本文介紹如何通過API創建、授權實例RAM角色,并將該角色授予給ECI實例。

應用場景

ECI實例上部署的應用程序在云產品通信中,通過云賬號或者RAM用戶的AccessKey訪問阿里云其他云產品(例如OSS、VPC、RDS等)的API。為了方便和快速地調用,部分用戶直接把AccessKey固化在實例中,例如直接寫在配置文件中。這種方式存在權限過高、泄露信息和難以維護等問題。實例RAM角色能夠避免此類問題。

RAM角色是一種具備某些權限的虛擬用戶,可以被ECI實例扮演,從而使得ECI實例獲得相應的權限。使用RAM角色,無需在實例中保存AccessKey,通過修改RAM角色的權限即可變更ECI實例的權限,在使用上安全便捷。更多關于RAM角色的信息,請參見RAM角色概覽

使用流程

使用實例RAM角色的步驟如下:

  1. 創建實例RAM角色

    調用CreateRole創建實例RAM角色,設置允許扮演該角色的可信實體為ECI服務(受信服務為云服務器ECS)。

  2. 授權實例RAM角色

    根據需要調用CreatePolicy創建權限策略,然后調用AttachPolicyToRole將該權限策略授予給實例RAM角色。

  3. (可選)授權RAM用戶使用實例RAM角色

    如果您使用RAM用戶創建ECI實例并指定實例RAM角色,則必須先授權RAM用戶可以使用實例RAM角色。

  4. 為ECI實例授予實例RAM角色

    調用CreateContainerGroup創建ECI實例,通過RamRoleName參數為ECI實例授予實例RAM角色,使得ECI實例獲得對應的權限。一個ECI實例只能授予一個實例RAM角色。

  5. 獲取STS Token

    為ECI實例授予了實例RAM角色后,如果需要在ECI實例內部部署的應用程序中訪問云產品的API,您需要通過實例元數據獲取實例RAM角色的STS Token。

創建實例RAM角色

調用CreateRole可以創建一個實例RAM角色。具體參數信息,請參見CreateRole

您可以自定義設置RoleName來指定角色名(假設為ECIRamRoleTest),然后按如下策略文本設置AssumeRolePolicyDocument。

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

授權實例RAM角色

  1. 調用CreatePolicy創建一個自定義權限策略。

    調用時,需設置以下參數:

    • PolicyName:權限策略名稱(假設為ECIRamRoleTestPolicy)。

    • PolicyDocument:權限策略內容。

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

    更多信息,請參見CreatePolicy

  2. 調用AttachPolicyToRole為RAM角色添加權限策略。

    調用時,需設置以下參數:

    • PolicyName:指定權限策略名稱,例如ECIRamRoleTestPolicy。

    • PolicyType:權限策略類型,配置為Custom,表示是自定義權限策略。

    • RoleName:指定RAM角色,例如ECIRamRoleTest。

    更多信息,請參見AttachPolicyToRole

授權RAM用戶使用實例RAM角色

如果您使用RAM用戶,則必須先授權RAM用戶具備該實例RAM角色的ram:PassRole權限,RAM用戶才可以使用實例RAM角色。ram:PassRole權限決定RAM用戶能否直接執行角色策略賦予的權限。

  1. 使用阿里云賬號(或者具備管理權限的RAM用戶)登錄RAM控制臺

  2. 授權RAM用戶使用實例RAM角色。

    授權時,請創建以下自定義權限策略,并將其授權給RAM用戶。其中,ECIRamRoleTest為要授權的ram:PassRole權限的實例RAM角色。具體操作,請參見為RAM用戶授權

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

為ECI實例授予實例RAM角色

調用CreateContainerGroup創建ECI實例時,可以通過RamRoleName參數來指定RAM角色。更多信息,請參見CreateContainerGroup

說明

一個ECI實例只能授予一個實例RAM角色。如果ECI實例已有RAM角色,則會報錯提示您不能附加新的角色。

獲取STS Token

在ECI實例內部,您可以訪問元數據URL來獲取RAM角色的STS Token,該STS Token可以執行RAM角色的權限和資源,并且該STS Token會自動周期性地更新。

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

請使用實際RAM角色名稱替換${your_ram_role_name},假設RAM角色名稱為ECIRamRoleTest,命令示例如下:

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

返回結果中可以獲取STS Token,示例如下:

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

基于STS Token訪問云服務

以下示例以使用Go SDK訪問OSS為例介紹如何基于STS Token訪問云服務,該示例可以實現基于STS Token訪問某個OSS Bucket并列舉其中的所有文件。

說明

該示例僅用于演示基于STS Token訪問云服務的方法,實際場景中請根據自身業務編寫代碼,具體請參考您要使用的云服務的SDK。

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 input oss endpoint")
	}

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

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

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

	// 創建OSS Client實例, 生產環境使用需要定時更新OSS Client,防止SecurityToken過期訪問云產品失敗
	ossClient, err := oss.New(ossEndpoint, authServiceIdentity.AccessKeyId,
		authServiceIdentity.AccessKeySecret, oss.SecurityToken(authServiceIdentity.SecurityToken))
	if err != nil {
		log.Fatalf("Failed to new oss client: %s", err)
	}

	// 獲取存儲空間
	bucket, err := ossClient.Bucket(ossBucketName)
	if err != nil {
		log.Fatalf("Failed to get bucket %q: %s", ossBucketName, err)
	}

	// 列舉存儲空間中文件
	marker := ""
	for {
		lsRes, err := bucket.ListObjects(oss.Marker(marker))
		if err != nil {
			log.Fatalf("Failed to list object from bucket %q: %s", ossBucketName, err)
		}
		// 打印列舉文件,默認情況下一次返回100條記錄。
		for _, object := range lsRes.Objects {
			log.Println("Bucket: ", object.Key)
		}
		if lsRes.IsTruncated {
			marker = lsRes.NextMarker
		} else {
			break
		}
	}
}