Terraform小ネタ集。
手元の terraform version は v1.0.7 です。
Tips & Tricks
特定のリソースだけ別のリージョンを使いたい(1つのtfのなかで複数のproviderを利用する)
alias
を使いましょう。
provider "aws" {
region = "ap-northeast-1"
}
provider "aws" {
# Usage (in data, resource):
# provider = aws.us_east_1
alias = "us_east_1"
region = "us-east-1"
}
一時的にstate backendをlocalにしたい
override.tf
を使いましょう。 .gitignore
に入れておくといいかな。
必要に応じて terraform init -reconfigure
しましょう。
Override Files - Configuration Language - Terraform by HashiCorp https://www.terraform.io/docs/language/files/override.html
terraform {
backend "local" {
}
}
書き始めがしんどい
わかる。
お勧め手順:本来の作業対象とは別の、安全な別アカウントで実施する
- 手で作る(例:AWS Management Consoleで作る)
- 試行錯誤する
- tfに
resource
を書く。名前とか必須項目だけでよい- IAMの各種Policy Attachmentを忘れがちなので注意(importしても
terraform plan
で差分として出てこない) - コンソールの場合は自動的に生成されるリソース(IAM Policyなど)を漏らしがちなので注意
- IAMの各種Policy Attachmentを忘れがちなので注意(importしても
terraform import
で取り込むterraform plan
で差分が出なくなるようtfに書き加えていく- 可能なら一度
terraform destroy
して作成したリソース・関連するリソースが全て削除されるか確認する- 削除されない=terraform管理下に置かれていない=漏れている
ディレクトリレイアウトどうしよう
いまのところの身近な無難なパターンはこちら。
環境ごとの共通化は自作モジュールでやる。
terraform.tf
にproviderやbackendの設定をさっと書いて、まずは main.tf
を育てて、あとからファイル分割していく。
/README.md
/dev/
/terraform.tf
/main.tf
/variables.tf
/{some_resource}.tf # ex: iam.tf
/{other_resource}.tf # ex: s3.tf
/{another_resource}.tf # ex: cloudwatch.tf
/stg/
/...
/prd/
/...
/modules/
/{some_module}/
/README.md
/terraform.tf
/main.tf
/variables.tf
/{other_module}/
/...
パブリックモジュールは使いますか?
実感として、労多くして功少なしなので避けています。
自分で小さなモジュールを作るほうが見通しが良く素直に利用できるので。
個人的に、あるいは周囲が、easyよりsimpleを好む傾向が大きいという背景があるかもしれない。
管理するリソースすべてにタグをつけたい
default_tags
が使えます。
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
Project = var.project_name
AppEnv = var.app_env
}
}
}
書く時にコード補完とかしてほしい
わたしはnvim + terraform-ls を使っています。
vim-lsp-settingsをいれておけば、 :LspInstallServer terraform-ls
でOK。
stateファイルを置くためのS3 BucketをTerraformで作りたいんですがその時のstateファイルはどこに置けば...
諦めてlocal。
もしくはTerraform Cloudとか?
おわりに
思いついたら足すかもしれない。
何かいい感じのやつがあったら教えてください。