Published on

初探 Infrastructure as Code

Authors
  • avatar
    Name
    米K朗基羅
    Twitter
    @kvzl_

本文首次發表於 medium

Hi,我 Kevin 啦。身為一個不務正業的前端,偶爾幫隊友用 AWS 開幾台機器也是很合理的吧。

對 App 層的工程師而言,infrastructure 可以說是截然不同的關注點,有許多細節像是網路配置、權限管理,其實是開發時不太需要關注的。

然而根據需求和規模來搭建合適的架構,其實不是一件容易的事情,因此我們需要適當的工具來幫助我們快速達成目的。

今天來聊聊 AWS 操作上的一些通點,以及初次接觸 IaC 的一些心得。

Infrastructure as Code

對 Web App 而言,infra 就像陽光、空氣、水一樣,是不可或缺的基本要素。我們可以透過 AWS 輕易的搭建出需要的服務架構,而不需要維護實體機房和設備。

然而仔細回想過去,那些和 AWS 打交道的日子:

  • 手抖填錯參數
  • 忘記之前填了什麼,再跑回去查設定
  • 隊友離開一定會沒交接好*(當初根本沒寫下來,怎麼交接 ¯_(ツ)_/¯)*

雖然流程和制度一定有能改善的地方,但這多少體現了人類其實充滿 bug,這時不正是自動化介入的好機會嗎?

infra 就是你的 code!

為了讓這整件事情可以自動化,我們可以透過 code 來定義用到的 AWS 服務,將 code 視為 Single source of truth 進行統一管理。如此一來不但能避免許多手動、重複性的操作,同時也降低了人為疏失的可能性。

code 的抽象能力不但能表達整個 cloud 架構,組合、重複使用的能力也提供了更多了可能性,隨便舉幾個使用情境:

  • 免洗架構,demo 完就丟掉
  • 複製測試環境,而且參數幾乎一摸摸一樣樣
  • 輕鬆管理 Multi-Cloud,如果你用的是沒有 vendor lock-in 的 IaC 工具

以上操作都不用親自透過 UI 執行。

類似的工具有很多,像是 CloudFormationCDKPulumiTerraform 等等,做了簡單的評估後,發現 Terraform 使用的人夠多、資料也算好找,決定馬上來試試看 Terraform!

嘗試 Terraform

定義 infra

按照文件準備好環境後,將官方提供的例子稍做修改,在自己電腦上練習一下吧。建立 main.tf 檔案,定義以下內容:

# Specify the provider and access details
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "web" {
  instance_type = "m1.small"
  ami = "ami-21f78e11"

  # This will create 4 instances
  count = 4
}
resource "aws_elb" "web" {
  name = "terraform-example-elb"

  # The same availability zone as our instances
  availability_zones = aws_instance.web.*.availability_zone

  listener {
    instance_port     = 80
    instance_protocol = "http"
    lb_port           = 80
    lb_protocol       = "http"
  }

  # The instances are registered automatically
  instances = aws_instance.web.*.id
}

只要有一點 AWS 操作經驗,就會發現它的配置其實蠻好懂的,對吧對吧。

Init

使用 terraform init 初始化專案,幫你安裝 provider 的執行檔(如 AWS CLI)。

Plan

terraform plan 告訴你會有哪些變更,請你過目。

(中間略過)

Apply

terraform apply 還是會再跟你確認一次,ok 就摧落去。

(中間略過)

到這裡為止,我們已經成功建好 4 台 EC2 instance 及 1 個 ELB 了,花不到 5 分鐘!

Destroy

玩完了肯定要隨手把垃圾帶走。使用 terraform destroy 確認沒問題後幫你收拾乾淨,給你方便,但不隨便

(中間略過)

掰!

實際運用上可能會遇到的問題

但不得不說,現實中的 infra 絕對不是一般在網路上看到的例子那麼簡單,實際用起來肯定問題一大堆,像是:

  • 怎麼把已經存在的 infra 寫成 Terraform?
  • Module 的職責大小?要涵蓋哪些 infra?
  • 如何整合 CI/CD ?
  • 怎麼避免同時有多人執行 apply ?
  • 怎麼搭配 Serverless Framework

等等諸如此類還有很多,這些問題有機會再來探討,這邊就先不展開~

使用心得

實際使用一段時間後的一點小小心得:

需要一點時間習慣語法

「如果能跟一般的程式語言一樣就好了」

之類的想法偶爾會浮現出來,但其實習慣了就還好啦。

經常翻閱文件

或許是我對 AWS 熟悉度不夠,基本上撰寫的過程中,電腦都會開著Terraform 文件和 AWS Console。

即使 Terraform 有 editor plugin 可以提供 auto-complete,我還是會想要確認 AWS 介面上有哪些配置選項,以及對應的 Terraform 參數是什麼。

自動化就是讚

輸入 terraform apply 並按下 enter,等他跑完的那個瞬間:

「死巴拉系! _(゚∀゚)_))」*

讓人欲罷不能 ><

總結

把 Terraform 寫好不代表以後就一帆風順了,這只是 IaC、甚至整個 DevOps 的一個小環節。

不論如何,先從盤點你的 infra 開始吧!

謝謝你的閱讀。

參考資料

基本介紹

官方教學

AWS Provider 範例

各家工具評比