淺談 Infrastructure as Code - ianchen0119/Introduce-to-5GC GitHub Wiki

IaC(Infrastructure as Code)是近年來很夯的技術名詞之一,它的概念是為了更好的整合維運以及開發,舉例來說: 在 IaC 出現之前,當 Developer 交付新的程式碼後或是我們需要針對不同的需求、客戶來部署一個新的服務,可能會需要一個全新的環境部署這個服務,假設這個服務是部署在 GCP 好了,那麼開發者或是維運者至少需要手動的進行以下步驟:

  • 設定 VM 的網路環境(CIDR、Gateway、Firewall...)
  • 為它建立新的 VM Instance
  • 建立 Instance 的存取方法

而 IaC 正式為了解決大量人工部署所提出的概念。

Terraform 介紹

image

Terraform 是由 HashiCorp 推出的開源專案,它是一個 IaC 的解決方案(有廣大的社群資源和討論熱度,不怕出問題時求助無門),透過撰寫 terraform 的組態檔案,讓我們可以用寫程式的方式去部署我們的 infrastructure。

Terraform 的支援度

Terraform 支援多個熱門的雲端平台(至少 AWS、GCP 以及 Azure 都支援),換句話說,只要我們在本地的電腦設定好雲端平台對應的存取工具(以 AWS 來說就是 aws-cli),我們就能使用 Terraform 管理 infrastructure。

IaC 的優勢

Iac 的好處不單單只是避免工人智慧,使用程式碼管理、更新 infra 的最大好處就是我們能對它做版本控制,舉裡來說:在私有的 Terraform 專案上使用 Git 進行版本控制後,我們想要 review 最近 infrastructure 的改變,或是想退回更動之前都非常容易。

進入正題:如何使用 Terraform?

在學習 Terraform 之前,我們需要釐清一些觀念:

  • Terraform 使用的程式語言為 HCL(HashiCorp Configuration Language),它是一個用於描述架構的組態語言。
  • 使用 Terraform 部署與管理 infra,可以分成幾個階段:
    • Scope:描述專案中的 infrastructure
    • Author:為 infrastructure 撰寫 HCL
    • Init:安裝 infrastructure 所需要的 Terraform 插件(plugins)
    • Plan:預覽 Terraform 將對現有的 infra 帶來什麼改變
    • Apply:套用這些更動

有了這些基本觀念後,我們就可以更近一步認識 Terraform 啦!

安裝 Terraform

HashiCorp 的官方網站上有各個平台的安裝方式,以個人常用的 Mac 來說,我們可以使用 brew 來安裝 Terraform:

$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform

執行完上述命令後,在終端機輸入 terraform 就能看到以下訊息:

image

如果相關訊息有正常顯示,那麼就代表 terraform 已經順利的安裝在你的個人環境上囉。

補充:啟用自動補齊 Terraform 支援命令的自動補齊,使用者可以在終端機輸入以下命令啟用它:

$ terraform -install-autocomplete

建置 Terraform 專案

作者的話:練習 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 時也會有很多區域供我們選擇:

image

3. resource:描述 provider 上需要部署什麼樣的資源。

resource "aws_instance" "example" {
  ami           = <YOUR_AMI_IMAGE>
  instance_type = <EXPECTED_INSTANCE_TYPE>
}

以上方程式碼來看,它是為了讓我們建立一個 EC2 Instance(沒有接觸過 AWS 的人可以把它想成是 Virtual Machine),而其中的參數則為分別我們決定了:

  • ami:EC2 Instance 執行的作業系統以及環境。

image

參考上圖,在新增 EC2 Instance 時,AWS 有提供許多 AMI 供我們選擇。此外,我們也可以客製化自己的 AMI,以網路服務的部署來說,我可以將 Application + Environment + OS 打包成一個 AMI,這樣 EC2 啟動的同時,我們也完成了新服務的部署(理想情況下啦)。

  • instance_type:EC2 的硬體資源,可參考下圖:

image

了解 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 可以幫助我們完成專案的初始化:

image

輸入 terraform init 後也不難發現,這個步驟對應到了剛剛提到的 Init 階段。

作者的話: 如果需要對 infrastructure 做版本控制,也別忘記了 git init

完成初始化後,對應到我們一開始提到的 Plan 階段:

$ terraform plan

image

terraform plan 的執行結果如上圖,這邊可以發現這個 infra 對 terraform 來說是沒有更動的(因為我們根本還沒做第一次的部署)。

看完 infra 的更動後,如果覺得沒有問題就能夠 apply 這些更動啦:

$ terraform apply

作者的話: 產出並部署 infra 後,如果想要將它們銷毀,可以使用以下命令:

$ terraform destroy

總結

本篇文章簡單介紹了 IaC 的概念以及 Terraform 的使用方法,內容涵蓋了 IaC 大部分的觀念與實作,但如果讀者想要部署一個比較複雜的架構,那麼可能要把變數也加入到組態設定檔案之中。 如果筆者之後有機會碰到 Terraform 的進階技巧(像是 TerraSpace 之類的),我會再找時間把內容補上。

References