Terraform Tips & Tricks

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" {
  }
}

書き始めがしんどい

わかる。

お勧め手順:本来の作業対象とは別の、安全な別アカウントで実施する

  1. 手で作る(例:AWS Management Consoleで作る)
    • 試行錯誤する
  2. tfに resource を書く。名前とか必須項目だけでよい
    • IAMの各種Policy Attachmentを忘れがちなので注意(importしても terraform plan で差分として出てこない)
    • コンソールの場合は自動的に生成されるリソース(IAM Policyなど)を漏らしがちなので注意
  3. terraform import で取り込む
  4. terraform plan で差分が出なくなるようtfに書き加えていく
  5. 可能なら一度 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とか?

おわりに

思いついたら足すかもしれない。

何かいい感じのやつがあったら教えてください。

Cloud 

See also