434
技術社區[雲棲]
ECS實例RAM角色實踐
ECS實例RAM角色快速入門
概述
以往部署在ECS實例中的應用程序如果需要訪問阿裏雲其他雲產品的API,通常需要借助於AccessKeyId和AccessKeySecret(下文簡稱AK)來實現。AK是用戶訪問阿裏雲API的密鑰,具有相應賬戶的完整權限。但是為了方便應用程序對AK的管理,用戶通常需要將AK保存在應用程序的配置文件中或以其他方式保存在實例中。這在一定程度上增加了AK管理上的複雜性且降低了AK的保密性,尤其是對有多地域一致性部署需求的用戶,AK將隨著鏡像及鏡像創建的實例擴散出去。在需要更換AK時,也需要逐台實例(和鏡像)進行更新和重新部署。此外,使用AK雖然簡單,但AK的權限過大,無法做到精細的權限控製。
現在借助於ECS實例RAM角色,我們可以將RAM角色和ECS實例關聯起來,實例內部的應用程序則通過STS臨時憑證訪問其他雲產品的API。其中臨時憑證由係統自動生成和更新,應用程序可以通過訪問實例元數據的指定URL獲取臨時憑證,而無須特別的管理。同時借助於RAM,用戶可以通過對角色和授權策略的管理,達到不同實例對不同雲產品或相同雲產品具有各自訪問權限的目的。
本文接下來將詳細介紹ECS實例使用RAM角色的正確姿勢,為了方便讀者隨本篇樣例快速入門,全文將基於OpenAPI Explorer操作(OpenAPI Explorer將各產品的API及參數以可視化的方式展現出來,並能自動生成Java,Python等SDK的樣例代碼)。具體分為以下幾個步驟:
- 通過RAM創建角色,並配置授權策略
- 指定RAM角色創建ECS實例
- 在實例內部訪問實例元數據URL獲取STS臨時憑證
- 基於臨時憑證,使用Python SDK訪問OSS
注:OpenAPI Explorer通過已登錄用戶信息獲取當前賬號臨時AK,對當前賬號線上資源發起線上資源操作,請小心操作。同時創建實例操作也會產生一定的費用!操作完成後請及時釋放實例。
創建RAM角色&配置策略
- 創建RAM角色。找到OpenAPI Explorer RAM產品下CreateRole API。其中RoleName參數可以根據自己的需要填寫,如本文填“RamRoleTest”。AssumeRolePolicyDocument填如下內容,表示該角色為一個服務角色,受信雲服務(此處為ECS)可以扮演該角色:
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "ecs.aliyuncs.com" ] } } ], "Version": "1" }
- 創建授權策略。找到CreatePolicy API。其中PolicyName本文填“RamRolePolicyTest”。PolicyDocument填以下內容,表示該角色具有OSS隻讀權限。
{ "Statement": [ { "Action": [ "oss:Get*", "oss:List*" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
當希望通過子賬號創建指定RAM角色的ECS實例時,還需要在上述“Statement”節點中額外增加ECS相關的權限和PassRole權限,如下所示。其中“...”需要替換成具體的ECS RAM Action,或替換成“ecs:*”表示所有Action。{ "Action": ..., "Resource": "*", "Effect": "Allow" }, { "Action": "ram:PassRole", "Resource": "*", "Effect": "Allow" }
- 為角色附加授權。找到AttachPolicyToRole API。其中PolicyType填“Custom”,PolicyName填第2步創建的“RamRolePolicyTest”,RoleName填第1步創建的“RamRoleTest”。
指定角色創建實例
- 創建實例。找到OpenAPI Explorer ECS產品下的CreateInstance API,參數可根據實際情況進行填寫,主要需要填寫的參數有:RegionId、ImageId、ecs.n1.tiny、VSwitchId和RamRoleName。由於ECS實例RAM角色目前隻支持VPC實例,所以VSwitchId是必須的,RamRoleName則填之前創建的RamRoleTest。
- 設置密碼和啟動實例。從ECS控製台“實例標簽頁”重置實例密碼,並啟動實例。
獲取STS臨時憑證
從ECS控製台遠程連接實例,並登陸到實例中。訪問https://100.100.100.200/latest/meta-data/ram/security-credentials/RamRoleTest獲取STS臨時憑證,其中路徑最後為實例名。
基於臨時憑證訪問OSS
- 命令行輸入
pip install oss2
安裝OSS python SDK - 執行下述命令進行測試,其中oss2.StsAuth中的前三個參數分別對應於上述URL返回的AccessKeyId、AccessKeySecret和SecurityToken。
import oss2
from itertools import islice
auth = oss2.StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
bucket = oss2.Bucket(auth, "oss-cn-qingdao.aliyuncs.com", "bozhi-qd")
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
相關文檔
最後更新:2017-06-06 14:32:10