閱讀133 返回首頁    go 阿裏雲 go 技術社區[雲棲]


雲服務器 ECS 最佳實踐:借助於實例 RAM 角色訪問其它雲產品 API




概述

以往部署在 ECS 實例中的應用程序如果需要訪問阿裏雲其他雲產品的 API,您通常需要借助 Access Key ID 和 Access Key Secret(下文簡稱 AK)來實現。AK 是您訪問阿裏雲 API 的密鑰,具有相應賬號的完整權限。為了方便應用程序對 AK 的管理,您通常需要將 AK 保存在應用程序的配置文件中或以其他方式保存在 ECS 實例中,這在一定程度上增加了 AK 管理的複雜性,並且降低了 AK 的保密性。甚至,如果您需要實現多地域一致性部署,AK 會隨著鏡像以及使用鏡像創建的實例擴散出去。這種情況下,當您需要更換 AK 時,您就需要逐台更新和重新部署實例和鏡像。

現在借助於 ECS 實例 RAM 角色,您可以將 RAM 角色 和 ECS 實例關聯起來,實例內部的應用程序可以通過 STS 臨時憑證訪問其他雲產品的 API。其中 STS 臨時憑證由係統自動生成和更新,應用程序可以使用指定的 實例元數據 URL 獲取 STS 臨時憑證,無需特別管理。同時借助於 RAM,通過對角色和授權策略的管理,您可以達到不同實例對不同雲產品或相同雲產品具有各自訪問權限的目的。

本文以部署在 ECS 實例上的 Python 訪問 OSS 為例,詳細介紹了如何借助 ECS 實例 RAM 角色,使實例內部的應用程序可以使用 STS 臨時憑證訪問其它雲產品的 API,具體步驟如下:

  1. 創建 RAM 角色並配置授權策略。
  2. 指定 RAM 角色創建並設置 ECS 實例。
  3. 在實例內部訪問實例元數據 URL 獲取 STS 臨時憑證。
  4. 基於臨時憑證,使用 Python SDK 訪問 OSS。

注意:為了方便您隨本文樣例快速入門,文檔裏所有操作均在 OpenAPI Explorer 完成。OpenAPI Explorer 通過已登錄用戶信息獲取當前賬號臨時 AK,對當前賬號發起線上資源操作,請謹慎操作。創建實例操作會產生費用。操作完成後請及時釋放實例。

操作步驟

1. 創建 RAM 角色並配置授權策略

按以下步驟創建 RAM 角色並配置授權策略。

1.創建 RAM 角色。找到 OpenAPI Explorer RAM 產品下 CreateRole API。其中:

  • RoleName:設置角色的名稱。根據自己的需要填寫,本示例中為 EcsRamRoleTest。
  • AssumeRolePolicyDocument: 填寫如下內容,表示該角色為一個服務角色,受信雲服務(本示例中為 ECS)可以扮演該角色。
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Principal": {
  "Service": [
    "ecs.aliyuncs.com"
  ]
}
}
],
"Version": "1"
}


image

2.創建授權策略。找到 OpenAPI Explorer RAM 產品下 CreatePolicy API。其中:

  • PolicyName:設置授權策略的名稱。本示例中為 EcsRamRolePolicyTest。
  • PolicyDocument:輸入授權策略內容。本示例中填寫如下內容,表示該角色具有 OSS 隻讀權限。
{
"Statement": [
{
"Action": [
  "oss:Get*",
  "oss:List*"
],
"Effect": "Allow",
"Resource": "*"
}
],
"Version": "1"
}


image

3.為角色附加授權。找到 OpenAPI Explorer RAM 產品下 AttachPolicyToRole API。其中:

  • PolicyType:填寫 Custom。
  • PolicyName:填寫第 2 步創建的策略名稱,如本示例中的 EcsRamRolePolicyTest。
  • RoleName:填寫第 1 步創建的角色名稱,如本示例中的 EcsRamRoleTest。


image


2. 指定 RAM 角色創建並設置 ECS 實例

按以下步驟指定 RAM 角色創建並設置 ECS 實例。

1.創建實例。找到 OpenAPI Explorer ECS 產品下的 CreateInstance API,根據實際情況填寫請求參數。必須填寫的參數包括:

  • RegionId:實例所在地域。本示例中為 cn-hangzhou。
  • ImageId:實例的鏡像。本示例中為 centos_7_03_64_40G_alibase_20170503.vhd。
  • InstanceType:實例的規格。本示例中為 ecs.xn4.small。
  • VSwitchId:實例所在的 VPC 網絡虛擬交換機。因為 ECS 實例 RAM 角色目前隻支持 VPC 網絡的實例,所以 VSwitchId 是必需的。
  • RamRoleName:RAM 角色的名稱。本示例中為 EcsRamRoleTest。


image


如果您希望授權子賬號創建指定 RAM 角色的 ECS 實例,那麼子賬號除了擁有創建 ECS 實例的權限之外,還需要增加 PassRole 權限。所以,您需要創建一個如下所示的自定義授權策略並綁定到子賬號上。如果是創建 ECS 實例,[ECS RAM Action] 可以是 ecs:CreateInstance,您也可以根據實際情況添加更多的權限,詳見 RAM 中可對 ECS 資源進行授權的 Action。如果您需要為子賬號授予所有 ECS 操作權限,[ECS RAM Action] 應該替換為 ecs:*。

{
"Statement": [
{
"Action": "[ECS RAM Action]", 
"Resource": "*",
"Effect": "Allow"
},
{
"Action": "ram:PassRole",
"Resource": "*",
"Effect": "Allow"
],
"Version": "1"
}

2.設置密碼並啟動實例。

3.使用 API 或在控製台設置 ECS 實例能訪問公網。

3. 在實例內部訪問實例元數據 URL 獲取 STS 臨時憑證

按以下步驟獲取實例的 STS 臨時憑證。

1.遠程連接實例。

2.訪問 https://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest 獲取 STS 臨時憑證。路徑最後一部分是 RAM 角色名稱,您應替換為自己的創建的 RAM 角色名稱。

本示例中使用 curl 命令訪問上述 URL。如果您使用的是 Windows ECS 實例,參考 ECS 用戶指南 的 實例元數據 獲取 STS 臨時憑證。

示例輸出結果如下:

[root@local ~]# curl https://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest
{
"AccessKeyId" : "STS.J8XXXXXXXXXX4",
"AccessKeySecret" : "9PjfXXXXXXXXXBf2XAW",
"Expiration" : "2017-06-09T09:17:19Z",
"SecurityToken" : "CAIXXXXXXXXXXXwmBkleCTkyI+",
"LastUpdated" : "2017-06-09T03:17:18Z",
"Code" : "Success"
}

4. 基於臨時憑證,使用 Python SDK 訪問 OSS

本示例中,我們基於 STS 臨時憑證使用 Python SDK 列舉實例所在地域的某個 OSS 存儲空間(Bucket)裏的 10 個文件。

前提條件

您已經遠程連接到 ECS 實例。

您的 ECS 實例已經安裝了 Python。如果您用的是 Linux ECS 實例,必須安裝 pip。

您在實例所在的地域已經創建了存儲空間(Bucket),並已經獲取 Bucket 的名稱和 Endpoint。本示例中,Bucket 名稱為 ramroletest,Endpoint 為 oss-cn-hangzhou.aliyuncs.com。

操作步驟

按以下步驟使用 Python SDK 訪問 OSS。

1.執行命令 pip install oss2,安裝 OSS Python SDK。

2.如果您用的是 Windows ECS 實例,參考 對象存儲 OSS SDK 參考 的 安裝 Python SDK。
執行下述命令進行測試,其中:

  • oss2.StsAuth 中的 3 個參數分別對應於上述 URL 返回的 AccessKeyId、AccessKeySecret 和 SecurityToken。
  • oss2.Bucket 中後 2 個參數是 Bucket 的名稱和 Endpoint。
import oss2
from itertools import islice
auth = oss2.StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
bucket = oss2.Bucket(auth, <您的 Endpoint>, <您的 Bucket 名稱>)
for b in islice(oss2.ObjectIterator(bucket), 10):
  print(b.key)

示例輸出結果如下。

[root@local ~]# python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import oss2
>>> from itertools import islice
>>> auth = oss2.StsAuth("STS.J8XXXXXXXXXX4", "9PjfXXXXXXXXXBf2XAW", "CAIXXXXXXXXXXXwmBkleCTkyI+")
>>> bucket = oss2.Bucket(auth, "oss-cn-hangzhou.aliyuncs.com", "ramroletest")
>>> for b in islice(oss2.ObjectIterator(bucket), 10):
...     print(b.key)
...
ramroletest.txt
test.sh

原文鏈接

最後更新:2017-08-15 16:02:40

  上一篇:go  雲服務器 ECS 鏡像遷移:應用遷雲之鏡像遷移(1)概述
  下一篇:go  Google開發者大會即將登陸中國