Terraform Provider 開發紀錄
2022 年終於要結束了,今年仍舊是在精神時光屋中度過…
在新的工作內容中恰好碰到了客製化 Terraform Provider
的需求,所以寫一篇文章來記錄一下開發和 Release 的流程,本篇文章假設已經對於 Terraform
這套 IaC
工具使用有基礎的了解,如果沒有聽過或使用過的人可以先拜讀 Che-Chia (David) Chang 大大的 2021 鐵人賽文章 - Terraform Workshop - Infrastructure as Code for Public Cloud 疫情警戒陪你度過 30 天,有助新手們由淺入深了解這套深度整合各大公有雲的 IaC
工具。
環境以及使用版本
- Terraform Version: v1.3.6
- Go Version: go1.19.3 darwin/arm64
前置準備
對於 Providers
概念不夠清晰的人可以先從 Terraform - Plugin Development 看起,如下圖所示,基本上 Providers
就是一個連接 API
和 Terraform
的橋樑。
接下來要準備開發,首先確認環境有安裝 Go
。
1 | 確認你的 Go 安裝路徑 |
本篇會以 terraform-provider-stripe 來示範,可以直接 Clone
下來輸出執行檔:
1 | go build -o terraform-provider-stripe |
接下來我們要打開 ~/.terraformrc
這個 Terraform
命令列設定檔設定本機測試 Provider
的路徑,範例如下,並且要注意 Provider 的命名規則:
1 | # 這邊要把 Provider 路徑指到剛剛得到的 Go 環境變數,dev_overriders 會在本機開發時直接引用這個環境變數下的 Go 執行檔 |
接下來把剛剛輸出的 Go
執行檔複製到 Go
的執行目錄下:
1 | cp terraform-provider-stripe ${GOPATH} |
就可以開始寫我們測試用的 Terraform Code:
1 | terraform { |
本機測試成功!直接執行就會呼叫 Stripe
的 API
新增一項測試的 tax rate
⚠️ 備註 ⚠️
之前有搜尋到教學文章說要放在 ~/.terraform.d/plugins
底下,這的確是較多文章寫的標準做法,但是這個命名規則就有點冗長,就像以下範例:
1 | ~/.terraform.d/plugins/terraform-example.com/exampleprovider/example/1.0.0/linux_amd64/terraform-provider-example |
然後 provider
要這樣寫:
1 | terraform { |
思來想去覺得麻煩,就走了個比較簡便的方式來開發了。
如何 Release 寫好的 Provider
開發完之後,如果想要推送到 Terraform Registry,可以參考 Terraform - Publishing Providers 的步驟來 Release
。
準備好
Providers
的文件,具體可以參照 Terraform - Provider Documentation在根目錄下建立一份
terraform-registry-manifest.json
檔案,範例如下:
1 | # 因為 fork 的原作者 Release 的版本是 1,這邊為了做出區別,我從 2 開始 |
- 為你的
GitHub Provider Repo
建置CI/CD
工具
我這邊選擇使用 GitHub Action
當我的 CI/CD
工具,可以從 Terraform - Publishing Providers #github-actions-preferred 開始看。
基本上就是直接拷貝 .goreleaser.yml & .github/workflows/release.yml 這兩個檔案,並且按照目錄結構放置就好。
- 準備
gpg key
並且分別設定在GitHub Repo
和Terraform Registry
可以參考 GitHub Doc - generating-a-new-gpg-key 產生 Private Key
& Public Key
1 | # 產生公鑰和私鑰,我這邊是選擇 (1) RSA and RSA |
公鑰貼在 GitHub > Settings > SSH and GPG keys > New GPG Key
私鑰貼在 Terraform Registry > Settings > Signing Keys > New GPG Key
- 把
Release Tag
打上去,然後推到remote repo
就會自動Release
到Terraform Registry
了
1 | git tag v2.0.2 |
Actions
標籤裡可以看到有 Release Workflow
在跑:
Release
之後可以在 Terraform Registry > Publish > Provider 列表裡面看到結果:
- 使用已經
Released
的Provider
示範 `Terraform code 如下:
1 | terraform { |
之後只要添加新功能,就打新的 Tag Version
就可以 Release
新版了,其實蠻方便的。
Reference
🍀 Lukasaron - Terraform-provider-stripe
🍀 Terraform - Plugin Development
🍀 MY FIRST TERRAFORM PROVIDER
🍀 Terraform - CLI Configuration File
🍀 Terraform - How to Develop a Custom Provider in Terraform
🍀 StackOverflow - Terraform cannot init custom provider written in Go
🍀 GitHub Doc - generating-a-new-gpg-key