Terraformを使ってGoogle Cloud Runにコンテナをデプロイするまでの手順
環境
- M1 Mac
- macOS Ventura 13.2.1
- Homebrew 4.0.4
- Neovim v0.8.3
- terraform-ls v0.80.3
- williamboman/mason-lspconfig.nvim
- williamboman/mason.nvim
- jose-elias-alvarez/null-ls
- aquasecurity/tfsec
Terraformをインストールする
1. HomebrewでTerraformをインストールする
↓を見ながら
brew tap hashicorp/tap
brew install hashicorp/tap/terraform
2. Zshでtab補完できるようにする
.zshrc
にこれを書くだけ
terraform -install-autocomplete
TerraformでGCPリソースをいじくるための準備
↓を見ながら
これに沿いつつ
- GCPのProject => もう作ってあった
- GCE => 今回はCloud Runを使うので無視
- Service Account Key => 作ってなかったので作った
*.tf
を書いていく準備
*.tf
をTerrafromのファイルとして認識させる
1. Neovimに↓をNeovimの設定のどこかに書いておけばOK
vim.cmd("autocmd BufNewFile,BufRead *.tf set filetype=terraform")
2. Lspとしてterraform-lsを使う
terraform-lspとterraform-lsのどっちをLSPとして使う?っていう話があるけど、
- terraform-lspは2022/05でメンテが止まっている(2023/03/04観測時点)
- terraform-lsはHashiCorp公式がメンテしている
という理由からterraform-lsを選択。
まぁそもそもあんまり機能の違いがわかっていないという話もあり...
保存時の自動Formatをnull-lsを経由したterraform fmt
を使ってやりたいので、
terraform-ls側のFormatは無効化しつつこういう設定にした
require("mason-lspconfig").setup_handlers({
function()
require("lspconfig").terraformls.setup({
on_attach = function()
client.server_capabilities.document_formatting = false
client.server_capabilities.document_range_formatting = false
end
capabilities = require("cmp_nvim_lsp").default_capabilities(),
filetypes = {
"terraform",
"tf",
},
})
end,
})
end
3. tfsecをインストールする
null-ls側に設定するterraformのbuiltinを調べていたら、tfsecを発見した。
tfsec uses static analysis of your terraform code to spot potential misconfigurations.
tfsecは、terraformのコードを静的解析して、潜在的な設定ミスを発見します。
良さそう
Features
☁️ Checks for misconfigurations across all major (and some minor) cloud providers
⛔ Hundreds of built-in rules
🪆 Scans modules (local and remote)
➕ Evaluates HCL expressions as well as literal values
↪️ Evaluates Terraform functions e.g. concat()
🔗 Evaluates relationships between Terraform resources
🧰 Compatible with the Terraform CDK
🙅 Applies (and embellishes) user-defined Rego policies
📃 Supports multiple output formats: lovely (default), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
🛠️ Configurable (via CLI flags and/or config file)
⚡ Very fast, capable of quickly scanning huge repositories
🔌 Plugins for popular IDEs available (JetBrains, VSCode and Vim)
🏡 Community-driven - come and chat with us on Slack!
うーん読めば読むほど入れ得っぽい。
Macを使っているので、Homebrewで一発。
brew install tfsec
4. null-lsに設定を追加
この内容をNeovimのどっかで読み込む
-- lua/null-ls/init.lua
local nls = require("null-ls")
local lspconfig = require("lspconfig")
local completion = nls.builtins.completion
local diagnostics = nls.builtins.diagnostics
local formatting = nls.builtins.formatting
local code_actions = nls.builtins.code_actions
-- コード保存時の自動フォーマットを有効化
local function sync_formatting_on_save(client, buffer_number)
if client.supports_method("textDocument/formatting") then
vim.api.nvim_clear_autocmds({ group = augroup, buffer = buffer_number })
vim.api.nvim_create_autocmd("BufWritePre", {
group = augroup,
buffer = buffer_number,
callback = function()
vim.lsp.buf.format(nil, 3000)
end,
})
end
end
nls.setup({
diagnostics.terraform_validate,
diagnostics.tfsec,
formatting.terraform_fmt,
on_attach = function(client, buffer_number)
sync_formatting_on_save(client, buffer_number)
end,
capabilities = require("cmp_nvim_lsp").default_capabilities(),
})
結果
いい感じ!
Google Cloud Storage(GCS)でtfstateを管理する準備
↓を見ながらやる
GCSにtfstate管理用のBucketを作る
これは手動でやる。Console上でポチポチすればOK。
main.tf
に追記
Terraform Backendの情報を結果こうなるはず
(バケット、USリージョンで作っちゃった...)
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "4.51.0"
}
}
backend "gcs" {
bucket = "<bucket-name>"
prefix = "terraform/state"
}
}
provider "google" {
credentials = file("<credentials-json-file-name>")
project = "<project-name>"
region = "asia-northeast1"
}