Terraform助力ECS實例藉助RAM管理阿里雲產品
眾所周知,不論以怎樣的方式訪問阿里雲產品的 API,擁有賬號完整許可權的密鑰AK(Access Key ID 和 Access Key Secret,簡稱 AK)是必不可少的參數。因此,對 AK 的有效管理是每個調用阿里雲 API 的應用程序首先需要解決的問題。
對於部署在 ECS 實例上的應用程序而言,為了方便對 AK 的管理,通常需要將 AK 保存在應用程序的配置文件中或 ECS 實例的環境變數中,如此一來,無疑增加了 AK 管理的複雜性,降低了 AK 的安全性和靈活性。除此之外,對於多 Region 一致性部署應用的場景而言,AK 往往會隨著鏡像以及基於鏡像創建的實例擴散出去,此時,將不得不更新鏡像和逐台重新部署實例,從而應用部署的複雜度也將隨之增加。
面對以上困境,我們可藉助於 RAM 角色功能,將 RAM 角色 和 ECS 實例關聯起來,使得實例內部的應用程序可以通過 STS 臨時憑證(由系統自動生成和更新,詳見 RAM And STS)訪問其他雲產品的 API。應用程序無需管理 STS 臨時憑證,直接通過實例元數據 URL 即可獲取。同時,通過對 RAM 角色和授權策略的管理,可以達到不同實例對不同雲產品或相同雲產品具有各自訪問許可權的目的。
值得注意的是,每個 RAM 角色可同時被授權多個策略,通常我們的做法是為某一角色逐個授權相應的策略,同時,對於已有的 ECS 實例,我們需要逐台綁定某一角色,如何實現對 RAM 角色的自動化管理,授權策略的靈活設置以及為角色批量綁定 ECS 實例呢?本文將藉助於自動化運維工具 Terraform 給出最佳的實踐方案。
正如上圖所示,基於 Terraform 實現了 RAM Role,Policy以及 ECS 實例的創建,為 Role 配置 Policy,並將配置後的 Role 掛載到 ECS 實例上,進而幫助實例上的應用程序訪問阿里雲的其他雲服務。
本文將以 ECS 實例藉助於 RAM 角色訪問 OSS 服務為例,向大家展示如何基於 Terraform 實現從 RAM 角色的創建,授權策略的設置到ECS 實例的綁定以及如何在綁定了 RAM 角色的 ECS 實例上利用 Python 訪問 OSS 服務的。
定義 RAM 角色
首先編寫 Terraform 模板,定義 RAM Role:
resource "alicloud_ram_role" "role" { name = "EcsRamRoleTest"
模板定義了一個 RAM Role:EcsRamRoleTest,並為該角色配置了一個受信雲服務 ECS,表示該角色為一個服務角色,受信雲服務 ECS 可以扮演該角色。其中,設置 force = true
表示在通過 Terraform 釋放該 Role 時會強制解除與該 Role 相關聯的所有關係。
定義 RAM 授權策略
接下來在模板中定義 RAM Policy:
resource "alicloud_ram_policy" "policy" { name = "EcsRamRolePolicyTest"
模板定義了一個自定義的授權策略 EcsRamRoleTest
,並為該 Policy 中聲明了 OSS 只讀許可權的策略。和 RAM Role 類似,設置 force = true
表示在通過 Terraform 釋放該 Policy 時會強制解除與該 Policy 相關聯的所有關係。
為 RAM 角色授權策略
在定義好 RAM Role 和 Policy 之後,接下來需要將 Policy 跟 Role 進行綁定,為 Role 進行策略授權:
resource "alicloud_ram_role_policy_attachment" "role-policy" { policy_name = "${alicloud_ram_policy.policy.name}"
模板利用將創建好的 Policy 綁定到 Role 上,使得 Role 具有訪問某種雲產品服務的許可權。
定義 ECS 實例
接下來基於 Terraform 創建一個 ECS 實例,用來綁定 Role 和部署應用:
resource "alicloud_vpc" "vpc" { name = "vpc_for_ecs_role"
因為 ECS 實例 RAM 角色目前只支持 VPC 網路的實例,所以模板創建了一個 VPC 環境下的 ECS Instance,實例的鏡像是 ubuntu_140405_32_40G_cloudinit_20161115.vhd
, 規格是ecs.n4.large
,通過allocate_public_ip = true
為該實例分配了公網 IP,並為其設置了 20M 的帶寬。 在創建 instance 的同時,還新建了 VPC, VSwitch 和安全組資源。為了可以遠程連接 ECS 實例,為安全組創建了入方向的安全組規則,打開了 SSH 協議需要的 22 埠。
為 ECS 實例配置 RAM 角色
在完成 ECS 實例的創建和 RAM Role 的配置之後,接下來需要將 RAM Role 和 ECS 實例進行綁定,以幫助實例上的應用可以直接訪問其他雲資源:
resource "alicloud_ram_role_attachment" "attach" { role_name = "${alicloud_ram_role.role.name}"
定義 OSS Bucket
為了更好的測試結果,我們可通過 Terraform 新建一個 OSS Bucket,並為該 Bucket 上傳兩個 Object:
resource "alicloud_oss_bucket" "bucket" { bucket = "my-bucket-for-ram-role-test"
如上所示,模板定義了一個 OSS Bucket:"my-bucket-for-ram-role-test" 和兩個 OSS Object,分別為:"object-content-key-1" 和 "object-content-key-2".
訪問 ECS 實例並測試
接下來,我們登錄到 ECS 實例上藉助於 Python 訪問 OSS 服務來測試 Role 以及 Policy 生效。具體步驟如下:
遠程連接 ECS 實例
獲取 STS 臨時憑證
訪問 http://100.100.100.200/latest/meta-data/ram/security-credentials/ 即可獲取 STS 臨時憑證,其中
<RAM-Role-Name>
表示 RAM 角色名稱,在這裡我們將其設置為 「EcsRamRoleTest」。運行結果如下:
root@iZ2XXXXXXXXX:~# curl http://100.100.100.200/latest/meta-data/ram/security-credentials/EcsRamRoleTest
結果顯示,我們使用了
curl
命令成功地獲取到了STS
憑證,由此表明 RAM Role 已經與 ECS 實例綁定成功。基於臨時憑證,使用 Python SDK 訪問 OSS
本示例中,我們基於 STS 臨時憑證使用 Python SDK 列舉實例所在地域的 OSS Bucket 里的 2 個對象。具體測試步驟如下:
* 執行如下命令,安裝 OSS Python SDK
以上的運行結果顯示,將 RAM Role 與 ECS 實例成功綁定後,ECS 實例可利用 STS
臨時憑證成功地實現對 OSS 服務的訪問,由此驗證了整個運行流程的正確性。
寫在最後
本文藉助 RAM 角色訪問雲服務的功能,基於 Terraform 向大家展示了如何快速的實現 RAM 角色的創建,授權策略的設置,ECS 實例的創建以及綁定 RAM Role 等一系列操作,並通過測試驗證了整個流程的有效性。
作為一個自動化運維工具,Terraform 的出現大大降低了資源編排的複雜度,簡化了基礎設施資源及其環境的搭建流程,同時對資源模板的版本化管理更是為基礎設施資源的持續管理提供了方案,正如本文所展示的,當我們需要使用 OSS 的其他許可權,或者訪問其他雲產品,或者讓更多的 ECS 實例具有同樣的許可權的時候,只需要對如上的模板做一些適當的變更,如為 Policy 設置更多更豐富的 "statement",在 alicloud_instance
中設置 "count" 參數實現對 ECS 實例的平滑擴容等,然後只需運行一條簡單的命令terraform apply
即可實現對原資源的快速升級和變更,省時又省力。
目前,面向阿里雲的 Terraform Provider 仍在不斷的發展和完善中,歡迎大家使用和提供寶貴的意見和建議。以下是相關參考資料,歡迎大家查閱。
Terraform Provider Github 地址:https://github.com/alibaba/terraform-provider
Terraform Provider Document:Github: https://github.com/alibaba/terraform-provider-docs
Terraform Provider Package:https://github.com/alibaba/terraform-provider/releases
ECS 實例元數據獲取 STS 臨時憑證指南: https://www.alibabacloud.com/help/zh/doc-detail/49122.htm?spm=a3c0i.o54579zh.a3.7.4131bb5bwgOONE
※一張表的設計優化節省了兩百萬,客戶不斷盛譽,他做對了什麼?
※LSTM長短記,長序依賴可追憶(深度學習入門系列之十四)
※阿里雲首席安全科學家吳翰清的思考:彈性安全網路,構建下一代安
TAG:雲棲社區 |
※谷歌AR產品總監加入Facebook,將負責Camera AR產品管理
※NET Core使用swagger進行API介面文檔管理
※使用ELK管理SpringBoot日誌
※.NET Core + Vue.js動態許可權(RBAC)管理系統框架「DncZeus」開源了
※宏鏈CSM@Customer雲服務管理解決方案
※VMware收購E8 Security加強設備管理功能
※集群管理工具KafkaAdminClient——原理與示例
※ARM收購物聯網設備連接管理服務提供商Stream Technologies
※監控管理之Spring Boot Admin使用
※Kube:在VS Code中管理Helm charts
※MongoDB 管理工具: Rockmongo
※Veritas收購雲數據管理公司fluid Operations AG
※MK2與Secret Location達成合作,以簡化VR Pod內容管理
※使用Jira software+Structure實現大規模跨團隊項目管理
※時間追蹤管理工具ManicTime Pro
※如何在 Emacs 中使用 Magit 管理 Git 項目
※Pure Storage收購瑞典文件管理軟體公司Cpmpuverde
※HPE發布混合雲管理服務GreenLake
※《Dead In Vinland》糅合了RPG、冒險和生存管理
※Kobe Bryant 歡迎 LeBron James 加入「Lakers 大家庭」並盛讚管理層