阿里雲團隊努力不懈,讓最新技術內容能以更快方式以您最熟悉的語言呈現給您。本文內容由機器自動翻譯簡體中文,過程無人工干預。轉碼所造成任何內容錯誤及相關損失,阿里雲概不負責。敬請見諒。若任何內容問題涉及信息準確性,請以英文版為準。
全部產品
Search
文件中心

藉助於執行個體 RAM 角色訪問其他雲產品

更新時間: Aug 23, 2018

概述

以往部署在 ECS 執行個體中的應用程式如果需要訪問阿里雲其他雲產品,您通常需要藉助 AccessKeyID 和 AccessKeySecret(下文簡稱 AK)來實現。AK 是您訪問阿里雲 API 的密鑰,具有相應帳號的完整許可權。為了方便應用程式對 AK 的管理,您通常需要將 AK 保存在應用程式的設定檔中或以其他方式保存在 ECS 執行個體中,這在一定程度上增加了 AK 管理的複雜性,並且降低了 AK 的保密性。甚至,如果您需要實現多地域一致性部署,AK 會隨著鏡像以及使用鏡像建立的執行個體擴散出去。這種情況下,當您需要更換 AK 時,您就需要逐台更新和重新部署執行個體和鏡像。

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

本文以部署在 ECS 執行個體上的 Python 訪問 OSS 為例,詳細介紹了如何藉助 ECS 執行個體 RAM 角色,使執行個體內部的應用程式可以使用 STS 臨時憑證訪問其他雲產品。

說明:為了方便您隨本文樣例快速入門,文檔裡所有操作均在 OpenAPI Explorer 完成。OpenAPI Explorer 通過已登入使用者資訊獲取當前帳號臨時 AK,對當前帳號發起線上資源操作,請謹慎操作。建立執行個體操作會產生費用。操作完成後請及時釋放執行個體。

操作步驟

為了使 ECS 藉助執行個體 RAM 角色,實現內部 Python 可以使用 STS 臨時憑證訪問 OSS,您需要完成以下步驟:

步驟 1. 建立 RAM 角色並配置授權策略
步驟 2. 指定 RAM 角色建立並設定 ECS 執行個體
步驟 3. 在執行個體內部訪問執行個體元資料 URL 獲取 STS 臨時憑證
步驟 4. 基於臨時憑證,使用 Python SDK 訪問 OSS

步驟 1. 建立 RAM 角色並配置授權策略

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

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

    • RoleName:設定角色的名稱。根據自己的需要填寫,本樣本中為 EcsRamRoleTest
    • AssumeRolePolicyDocument: 填寫如下內容,表示該角色為一個服務角色,受信雲端服務(本樣本中為 ECS)可以扮演該角色。
      1. {
      2. "Statement": [
      3. {
      4. "Action": "sts:AssumeRole",
      5. "Effect": "Allow",
      6. "Principal": {
      7. "Service": [
      8. "ecs.aliyuncs.com"
      9. ]
      10. }
      11. }
      12. ],
      13. "Version": "1"
      14. }
      ECSECS _ RAM 角色 _ 在 OpenAPI Explorer 裡使用 CreateRole API 建立角色
  2. 建立授權策略。找到 OpenAPI Explorer RAM 產品下的 CreatePolicy API。其中:

    • PolicyName:設定授權策略的名稱。本樣本中為 EcsRamRolePolicyTest
    • PolicyDocument:輸入授權策略內容。本樣本中填寫如下內容,表示該角色具有 OSS 只讀許可權。
      1. {
      2. "Statement": [
      3. {
      4. "Action": [
      5. "oss:Get*",
      6. "oss:List*"
      7. ],
      8. "Effect": "Allow",
      9. "Resource": "*"
      10. }
      11. ],
      12. "Version": "1"
      13. }
      ECS _ RAM 角色 _ 在 OpenAPI Explorer 裡使用 CreatePolicy 建立策略
  3. 為角色附加授權。找到 OpenAPI Explorer RAM 產品下 AttachPolicyToRole API。其中:

    • PolicyType:填寫 Custom
    • PolicyName:填寫第 2 步建立的策略名稱,如本樣本中的 EcsRamRolePolicyTest
    • RoleName:填寫第 1 步建立的角色名稱稱,如本樣本中的 EcsRamRoleTest
      ECS _ RAM 角色 _ 在 OpenAPI Explorer 裡使用 AttachPolicyToRole 為角色附件授權

步驟 2. 為 ECS 執行個體指定 RAM 角色

您可以通過以下任一種方式為 ECS 執行個體指定 RAM 角色:

將執行個體 RAM 角色附加到一個已有的 VPC 類型ECS執行個體上

您可以使用 ECS 的 AttachInstanceRamRole API 附加執行個體 RAM 角色到已有的 VPC 類型 ECS 執行個體授權訪問,設定資訊如下:

  • RegionId:為執行個體所在的地域 ID。
  • RamRoleName:RAM 角色的名稱。本樣本中為 EcsRamRoleTest
  • InstanceIds:需要附加執行個體 RAM 角色的 VPC 類型 ECS 執行個體 ID。本樣本中為 [“i-bXXXXXXXX”]。

指定 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 類型 ECS 執行個體,所以 VSwitchId 是必需的。
    • RamRoleName:RAM 角色的名稱。本樣本中為 EcsRamRoleTest
      ECS _ RAM 角色 _ 在 OpenAPI Explorer 上用 CreateInstance 建立指定 RAM 角色的執行個體

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

      1. {
      2. "Statement": [
      3. {
      4. "Action": "[ECS RAM Action]",
      5. "Resource": "*",
      6. "Effect": "Allow"
      7. },
      8. {
      9. "Action": "ram:PassRole",
      10. "Resource": "*",
      11. "Effect": "Allow"
      12. ],
      13. "Version": "1"
      14. }
  2. 設定密碼並啟動執行個體。

  3. 使用 API 或在控制台設定 ECS 執行個體能訪問公網。關於在控制台設定 VPC 類型 ECS 執行個體訪問公網,請參見 彈性公網 IP

步驟 3. 在執行個體內部訪問執行個體元資料 URL 獲取 STS 臨時憑證

按以下步驟獲取執行個體的 STS 臨時憑證。

說明:STS 臨時憑證失效前半小時會生成新的 STS 臨時憑證,在這半小時內,新舊 STS 臨時憑證均可使用。

  1. 遠端連線執行個體

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

    說明:本樣本中使用 curl 命令訪問上述 URL。如果您使用的是 Windows ECS 執行個體,請參見 執行個體元資料

    樣本輸出結果如下。

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

步驟 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。

    如果您用的是 Windows ECS 執行個體,參考 Object Storage Service SDK 參考安裝 Python SDK

  2. 執行下述命令進行測試,其中:

    • oss2.StsAuth 中的 3 個參數分別對應於上述 URL 返回的 AccessKeyId、AccessKeySecret 和 SecurityToken。
    • oss2.Bucket 中後 2 個參數是 Bucket 的名稱和 Endpoint。
      1. import oss2
      2. from itertools import islice
      3. auth = oss2.StsAuth(<AccessKeyId>, <AccessKeySecret>, <SecurityToken>)
      4. bucket = oss2.Bucket(auth, <您的 Endpoint>, <您的 Bucket 名稱>)
      5. for b in islice(oss2.ObjectIterator(bucket), 10):
      6. print(b.key)
      樣本輸出結果如下。
      1. [root@local ~]# python
      2. Python 2.7.5 (default, Nov 6 2016, 00:28:07)
      3. [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
      4. Type "help", "copyright", "credits" or "license" for more information.
      5. >>> import oss2
      6. >>> from itertools import islice
      7. >>> auth = oss2.StsAuth("STS.J8XXXXXXXXXX4", "9PjfXXXXXXXXXBf2XAW", "CAIXXXXXXXXXXXwmBkleCTkyI+")
      8. >>> bucket = oss2.Bucket(auth, "oss-cn-hangzhou.aliyuncs.com", "ramroletest")
      9. >>> for b in islice(oss2.ObjectIterator(bucket), 10):
      10. ... print(b.key)
      11. ...
      12. ramroletest.txt
      13. test.sh