- Published on
初探 Infrastructure as Code
- Authors
- Name
- 米K朗基羅
- @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 執行。
類似的工具有很多,像是 CloudFormation、CDK、Pulumi、Terraform 等等,做了簡單的評估後,發現 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 開始吧!
謝謝你的閱讀。
參考資料
基本介紹
- IaC(Infrastructure as Code) における Declarative vs. Imperative — Qiita
- Infrastructure-as-code 如何改善我們的生活品質? — KKStream — Medium
官方教學
AWS Provider 範例
- terraform-provider-aws/examples at master · terraform-providers/terraform-provider-aws · GitHub
- Creating a CI/CD pipeline with a git repository in ~30 seconds using Terraform and AWS
各家工具評比