Terraform 如何導入以及管理 AWS 現有安全組
?HashiCorp Terraform 是一個IT基礎架構自動化編排工具,可以用代碼來管理維護 IT 資源。Terraform的命令行接口(CLI)提供一種簡單機制,用于將配置文件部署到 AWS 或其他任意支持的云上,并對其進行版本控制。它編寫了描述云資源拓撲的配置文件中的基礎結構,例如虛擬機、存儲賬戶和網絡接口。
Terraform是一個高度可擴展的工具,通過 Provider 來支持新的基礎架構。Terraform能夠讓您在云上輕松使用簡單模板語言來定義、預覽和部署云基礎結構。您可以使用Terraform來創(chuàng)建、修改、刪除ECS、VPC、RDS、SLB等多種資源。
在本文中,我們將了解如何使用 Terraform 管理現有和已創(chuàng)建的 AWS 安全組?;A設施革命的新時代已經開始,我們已經開始在配置管理工具(如 Ansible、Terraform、SaltStack 等)的幫助下以代碼的形式配置、管理和管理我們的基礎設施。
如果您是 Terraform 的新手并且想了解如何將 Terraform 與 AWS 基礎知識結合使用,可以參考本文。
本文的目的
我們知道 Terraform 很強大,我們可以使用 Terraform 高效的管理或創(chuàng)建整個 AWS/GCP/DigitalOcean 云基礎設施,但我們經常發(fā)現自己有一些額外的資源,這些資源通常是早期手動創(chuàng)建的,而不是由 Terraform 管理的。
將所有這些非托管資源(安全組)引入 Terraform 并使它們成為基礎設施即代碼。我們可以使用Terraform import命令。
但是將這些資源一一導入是非常麻煩的。所以我們嘗試使用 Ansible 將其自動化,結果就是這樣。
使用 Terraform 導入和管理現有 AWS 安全組
盡管如此,許多 DevOps 工程師仍在登錄 AWS 管理控制臺以手動更新安全組入站和出站流量路由,例如打開端口、啟用流量路由等。這沒有任何問題,但問題是您無法跟蹤您的團隊所做的更改除非您將其統(tǒng)一使用版本控制來管理。這就是 Infra as code 的優(yōu)勢所在。
想象一下,您將安全組作為代碼,并且您所做的每項更改都在您的 Git 存儲庫(如 BitBucket 或 Github)中正確提交和管理。每個更改都將使用 git 日志和提交消息進行跟蹤,并且還會有配置的備份,以防您想要回滾。不僅如此。
我列出了您應該將 AWS 安全組作為代碼進行管理的幾個原因。
- 它使您能夠跟蹤所有更改,例如打開/關閉端口以及更改的原因。
- 您可以使用 Commit 消息進行更好的安全審計
- 輕松高效的管理
- 使您能夠進一步自動化您的基礎架構
- 輕松找到您的公開路線并在發(fā)生任何安全事件之前進行預防
- 更好的業(yè)務連續(xù)性/災難恢復策略。
- 單擊 Jenkins 作業(yè)允許/禁止 IP/端口/組
因此,將您的 AWS 安全組作為代碼來管理是非常高效的。
所以現在讓我們看看我是如何設法將我現有的 AWS 安全組(所有安全組)導入 Terraform 并對其進行管理的。
Ansible + Terraform – 提供幫助
我是 Ansible 和 Terraform 的粉絲,兩者在管理基礎設施方面都很棒,而 Ansible 是 pythonic,Terraform 有自己的語言,稱為 Hashicorp 配置語言,也支持 JSON。
我們在這里使用 Python 的原因是我們將使用 Ansible 的ec2_group_facts模塊獲取所有安全組及其信息,這也可以使用 AWS CLI 完成,但我更喜歡這種方式來更好地處理數據。
這是我們的設計將如何進行的圖示。
如果您看不懂我的圖,我在這里寫下相同的內容以供參考。
在我們的設置中。Ansible playbook 是使用模塊調用 Terraform 和 EC2 數據收集的主要組件ec2_group_facts。
為了讓 Ansible 能夠訪問 AWS,您需要在環(huán)境變量中啟用 AWS 編程訪問和身份驗證密鑰。
這足以使 Ansible 和 Terraform 能夠訪問您的 AWS 基礎設施。但是,您可能會遇到一些隱藏的細節(jié)和問題(就像我遇到的那樣)如果您遇到困難或在評論中讓我知道,您可以參考以下文章,我會盡快提供幫助
- 為 Ansible AWS 設置 Boto python:(https://www.middlewareinventory.com/blog/ansible-aws-ec2/#Environment_Setup_for_Ansible_to_work_with_AWS_EC2_module)
- 為 AWS 設置編程訪問——密鑰和秘密:(https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/#Setup_Programmatic_Access)
- 安裝和配置 AWS CLI:(https://www.middlewareinventory.com/blog/aws-cli-ec2/#Install_AWS_CLI)
- Terraform AWS 配置基礎知識:(https://www.middlewareinventory.com/blog/terraform-aws-example-ec2/)
為 Ansible 和 Terraform 準備好您的環(huán)境后,我們可以繼續(xù)進行。
"
Ansible 和 Terraform 如何協(xié)同工作
完成 AWS 和 Ansible 集成的訪問設置后,您將能夠從 ansible 訪問您的 AWS 帳戶并執(zhí)行所有 AWS 相關模塊。
在本 playbook 中,我們還將使用這樣一個名為的模塊ec2_group_facts,它可以幫助我們獲取有關安全組的所有信息。那將是我們的第一步。
然后我們將為從 AWS 帳戶獲取的每個安全組創(chuàng)建一個目錄,并使用terraform import命令和安全組 ID創(chuàng)建 Terraform 配置文件。
導入完成后,我們需要刪除 terraform 配置文件中的一些配置元素,例如ownerid、arn、group id等,這些值/元素應該由 Terraform 自動填充,因此 terraform 不會讓您事先定義它。
從配置文件中刪除這些自動生成的元素/變量后,我們將使用以下terraform validate命令驗證文件。
因此,這些是我們要執(zhí)行的四個步驟,以使您的所有安全組都由 Terraform 管理。
Ansible Playbook導入所有安全組并添加到 Terraform
所以,是時候編寫一些代碼了,理論就夠了。
執(zhí)行劇本之前要記住的幾點:
- 您需要更新destdir變量,ansible 將為它正在獲取的每個安全組創(chuàng)建新目錄。目錄名稱將與安全組名稱相同(如果安全組名稱中有空格,它將被轉換為-連字符)
- 你需要替換你對應vpc的vpc-id變量
The Playbook
Ansible Playbook 任務說明
讓我們?yōu)g覽一下劇本,了解每項任務的設計目的。
1.任務 :EC2 信息獲取
此任務使用名為的模塊ec2_group_facts?,它使用您環(huán)境中的 AWS 訪問密鑰和秘密直接連接到您的 AWS 帳戶并獲取所有屬于vpc?參數中提到的特定的安全組。確保vpc-id在運行劇本之前更新過濾器值。
2?.任務 :使用收集的值創(chuàng)建字典
ec2_group_facts 模塊會產生很多關于安全組的信息,但我們只需要一個security group name和security group id
因此,我們正在遍歷上一個任務收集的輸出并創(chuàng)建一個名為secdict?我們正在使用set_fact模塊在運行時創(chuàng)建變量的字典
3.任務 :為每個安全組創(chuàng)建一個目錄——命名約定
如前所述,我們將為每個安全組創(chuàng)建專用目錄,其中將保存相應安全組的 Terraform 配置文件。
此目錄的名稱將是安全組名稱和安全組 ID 的前 7 個字符的組合,這是為了避免重復。AWS 對安全組的命名沒有唯一名稱約束,因此可以有多個同名的安全組。
4.任務 :Terraform 導入任務
在此任務中,我們正在一個接一個地運行多個命令,就像我們在 shell 提示符下鍵入一樣。使用ansible shell 模塊
這些是我們將要完成的任務列表:
- 我們在新建的sec組目錄下初始化一個git repo
- 創(chuàng)建一個main.tf以 AWS 供應商規(guī)范命名的 Terraform 配置文件
- 執(zhí)行terraform init以在目錄上初始化 terraform
- terraform import使用命令和相應安全組的 id執(zhí)行導入過程
- 將導入的配置寫回到main.tf我們在第 2 步創(chuàng)建的配置文件中
- 其余步驟用于版本控制更改,如添加、提交等。
5.任務 :Terraform 文件更正并刪除不需要的字
在此任務中,我們將從創(chuàng)建的main.tf配置文件中刪除不需要的行,否則會使文件在語法上不正確。
6.任務 :驗證更改后的配置
最后,我們可以使用將在所有安全組目錄中執(zhí)行的命令來驗證 Terraform 配置文件main.tf?是否對每個安全組有效。當驗證命令使用ansible failed_whenterraform validate?返回失敗消息時,則為失敗(https://www.middlewareinventory.com/blog/ansible-changed_when-and-failed_when-examples/)
playbook 執(zhí)行和結果
如果你做的一切都是正確的。您將能夠在您的 AWS 賬戶中導入屬于特定 VPC 的所有安全組,并且能夠使用Terraform 進行管理。
您將在 playbook 中定義的 workspace(destdir) 目錄下使用安全組名稱創(chuàng)建目錄。
在 Terraform 文件中進行更改并應用它來驗證
導入配置文件并準備就緒后,轉到創(chuàng)建的任何安全組目錄并編輯main.tf文件并進行更改,例如添加新的入口規(guī)則或更改允許的端口號的 CIDR IP 地址等。
完成更改后。我們就可以使用terraform plan?然后terraform apply它
我們將能夠看到我們的安全組已由 Terraform 成功管理。