本文介紹如何使用Terraform解決存量云資源管理難題。
背景信息
- 場景一:長期使用控制臺、阿里云CLI、資源編排服務或者直接調用API創建和管理資源,初次使用Terraform的場景。
- 場景二:長期使用Terraform管理資源,如果通過控制臺對單個云資源做屬性變更,希望保持原有的資源狀態(State)一致的場景。
- 場景三:所有資源都定義在一個模板中,想要對原有模板進行重構拆分,以降低隨著資源不斷增多而帶來的模板和state的管理復雜度的場景。
- 場景四:想要將新版Provider中新增的參數同步到原文檔中的場景。
Terraform基于資源模板定義不僅可以實現對新資源的創建,變更,刪除等操作,還可以通過簡單的命令將那些游離在Terraform管理體系之外的云資源進行導入和納管,進而實現對所有云資源的統一管理。
Terraform 導入存量資源
- 獲取資源ID:
基于資源ID查詢資源并獲取其屬性。
- 模板聲明所要導入的資源:
模板驅動,即使是要導入的資源,也需要在模板中進行聲明。
- 補齊資源模板定義:
導入成功后,需要根據資源屬性補齊已經在模板中聲明的資源定義。
Terraform移除存量資源
在實際操作場景中,經常會遇到資源的誤導入,導入路徑不符,想要調整資源路徑,想要永久保留某資源等多種復雜情況。面對這些情況,整體的實現思路也是非常簡單:先將導入后的資源從State中移除,然后重新導入。
terraform state rm <資源類型>.<資源標識>
,詳細操作如下:
$ terraform state rm alicloud_slb.this
Removed alicloud_slb.this
Successfully removed 1 resource instance(s).
state rm命令只是將指定的資源從State文件中移除,并不會將其真正刪除,這也正是為后續的導入操作做好了鋪墊。
總結
- 場景一的解決方案:
通過terraform import命令來完成對存量資源的導入,進而使用Terraform統一管理。
- 場景二的解決方案:
在確定清楚參數屬性的具體值之后,如果以模板參數值為準,那么只需要運行apply命令再變更回來即可;如果以控制臺的值為準,那么只需要補充或修改模板參數值即可。
- 場景三的解決方案:
可以先通過terraform state rm命令將所有需要重組的資源移出State,等模板重構結束后,再使用terraform import將其導入即可。
- 場景四的解決方案:
和上一解決方案一樣,通過“先移出再導入”調整即可。
Terraform的命令非常靈活和簡單,基于模板和State一致性的原理,借助terraform import可以輕松地實現對存量資源的統一管理,不用再擔心那些游離在Terraform管理體系之外資源無法管理的痛點,也無需懼怕某個資源從State中移除后無法繼續管理的問題,所有的云資源都可以被Terraform統一管理起來。