IaC(Infrastructure as Code)是近年來很夯的技術名詞之一,它的概念是為了更好的整合維運以及開發,舉例來說:
在 IaC 出現之前,當 Developer 交付新的程式碼後或是我們需要針對不同的需求、客戶來部署一個新的服務,可能會需要一個全新的環境部署這個服務,假設這個服務是部署在 GCP 好了,那麼開發者或是維運者至少需要手動的進行以下步驟:
而 IaC 正式為了解決大量人工部署所提出的概念。
Terraform 是由 HashiCorp 推出的開源專案,它是一個 IaC 的解決方案(有廣大的社群資源和討論熱度,不怕出問題時求助無門),透過撰寫 terraform 的組態檔案,讓我們可以用寫程式的方式去部署我們的 infrastructure。
Terraform 支援多個熱門的雲端平台(至少 AWS、GCP 以及 Azure 都支援),換句話說,只要我們在本地的電腦設定好雲端平台對應的存取工具(以 AWS 來說就是 aws-cli
),我們就能使用 Terraform 管理 infrastructure。
Iac 的好處不單單只是避免工人智慧,使用程式碼管理、更新 infra 的最大好處就是我們能對它做版本控制,舉裡來說:在私有的 Terraform 專案上使用 Git 進行版本控制後,我們想要 review 最近 infrastructure 的改變,或是想退回更動之前都非常容易。
在學習 Terraform 之前,我們需要釐清一些觀念:
Scope
:描述專案中的 infrastructureAuthor
:為 infrastructure 撰寫 HCLInit
:安裝 infrastructure 所需要的 Terraform 插件(plugins)Plan
:預覽 Terraform 將對現有的 infra 帶來什麼改變Apply
:套用這些更動有了這些基本觀念後,我們就可以更近一步認識 Terraform 啦!
HashiCorp 的官方網站上有各個平台的安裝方式,以個人常用的 Mac 來說,我們可以使用 brew
來安裝 Terraform:
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
執行完上述命令後,在終端機輸入 terraform
就能看到以下訊息:
如果相關訊息有正常顯示,那麼就代表 terraform 已經順利的安裝在你的個人環境上囉。
補充:啟用自動補齊
Terraform 支援命令的自動補齊,使用者可以在終端機輸入以下命令啟用它:$ terraform -install-autocomplete
作者的話:練習 Terraform 的使用之前,請先確保你有對應的雲端環境能夠使用。
首先,請先建立一個資料夾,用來存放你的專案程式碼:
$ mkdir myFirstTerrProject
$ cd myFirstTerrProject
接著,產生一個 main.tf
檔案,並且存入以下內容:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.5.0"
}
}
}
provider "aws" {
profile = "default"
region = <AWS_SERVICE_REGION>
}
resource "aws_instance" "example" {
ami = <YOUR_AMI_IMAGE>
instance_type = <EXPECTED_INSTANCE_TYPE>
}
觀察上方的程式碼,可以發現它由三個區塊所構成:
1. terraform:描述你會使用到的插件,以 main.tf
為例,我們希望用 Terraform 自動部署一個 EC2 到 AWS 上,所以我們會使用到 hashicorp/aws
套件。
2. provider:為你的 infra 提供資源的平台。
provider "aws" {
profile = "default"
region = <AWS_SERVICE_REGION>
}
上方程式碼之中的 region 對應到 AWS 的 region,舉例來說,當我們打開 AWS 並且嘗試新增 S3 Bucket 時也會有很多區域供我們選擇:
3. resource:描述 provider 上需要部署什麼樣的資源。
resource "aws_instance" "example" {
ami = <YOUR_AMI_IMAGE>
instance_type = <EXPECTED_INSTANCE_TYPE>
}
以上方程式碼來看,它是為了讓我們建立一個 EC2 Instance(沒有接觸過 AWS 的人可以把它想成是 Virtual Machine),而其中的參數則為分別我們決定了:
ami
:EC2 Instance 執行的作業系統以及環境。參考上圖,在新增 EC2 Instance 時,AWS 有提供許多 AMI 供我們選擇。此外,我們也可以客製化自己的 AMI,以網路服務的部署來說,我可以將 Application
+ Environment
+ OS
打包成一個 AMI,這樣 EC2 啟動的同時,我們也完成了新服務的部署(理想情況下啦)。
instance_type
:EC2 的硬體資源,可參考下圖:了解 main.tf
和 AWS 的部分概念後,我們就能把剛剛的保留欄位填充到 main.tf
內:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "3.5.0"
}
}
}
provider "aws" {
profile = "default"
region = "ap-northeast-1"
}
resource "aws_instance" "example" {
ami = "ami-0461b11e2fad8c14a"
instance_type = "t2.micro"
}
在專案新增 main.tf
後,在終端機輸入 terraform init
可以幫助我們完成專案的初始化:
輸入 terraform init
後也不難發現,這個步驟對應到了剛剛提到的 Init
階段。
作者的話:
如果需要對 infrastructure 做版本控制,也別忘記了git init
。
完成初始化後,對應到我們一開始提到的 Plan
階段:
$ terraform plan
terraform plan
的執行結果如上圖,這邊可以發現這個 infra 對 terraform 來說是沒有更動的(因為我們根本還沒做第一次的部署)。
看完 infra 的更動後,如果覺得沒有問題就能夠 apply 這些更動啦:
$ terraform apply
作者的話:
產出並部署 infra 後,如果想要將它們銷毀,可以使用以下命令:$ terraform destroy
本篇文章簡單介紹了 IaC 的概念以及 Terraform 的使用方法,內容涵蓋了 IaC 大部分的觀念與實作,但如果讀者想要部署一個比較複雜的架構,那麼可能要把變數也加入到組態設定檔案之中。
如果筆者之後有機會碰到 Terraform 的進階技巧(像是 TerraSpace 之類的),我會再找時間把內容補上。