terraform - taka512/memo GitHub Wiki

terraformとはGCP,AWSなどのクラウドサービスの構成管理ツール

マニュアル

コマンド

初期化
terraform init
構文チェック
terraform validate
インデント調整
terraform fmt
計画実行(dry-run)
terraform plan
適用
terraform apply
現在の状態表示
terraform show
リソースの廃棄(削除)
terraform destroy

状態管理用ファイル

  • 何もしないとローカルに適用状態を管理するファイルが出力される
    • terraform.tfstate
  • S3に置くように設定する事は可能
terraform {
  backend "s3" {
・・・
  }
}

記法

output

グローバル変数

outputを定義
// config/hoge.tf
output "cidr_hoge" {
  value = "10.10.0.0/16"
}

variables.tf に定義すると
// variables.tf 
module "global_var" {
  source = "../config"
}

下記のようにアクセスできるようになる
module.global_var.cidr_hoge

locals

locals {
  pub_left  = cidrsubnet(module.global_var.cidr_xxx, 8, 1)
  pub_right = cidrsubnet(module.global_var.cidr_xxx, 8, 2)

以下のようにアクセスできる
local.pub_right

variable

  • マニュアル: https://www.terraform.io/language/values/variables
  • 特徴
    • Input Variableは実行時にファイル・環境変数・オプション・対話的入力など、様々な注入方法を利用して- 外部から値を設定・上書きできる。
  • 課題
    • 他のVariableを参照して新しいVariableを定義できない。
    • 関数を利用できない。
「.tfvars」などで外部から値を指定
$ terraform apply \
  -var-file="secret.tfvars" \
  -var-file="production.tfvars"

リスト

variable "cidrs" {
  description = "cider"
  type    = list(string)
  default = []
}

cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]

マップ

variable "amis" {
  type = map(string)
  default = {
    "us-east-1" = "ami-b374d5a5"
    "us-west-2" = "ami-4b32be2b"
  }
}

resource "aws_instance" "example" {
  ami           = "${lookup(var.amis, var.region)}"
  instance_type = "t2.micro"
}

for_each

resource "aws_iam_user" "the-accounts" {
  for_each = toset( ["Todd", "James", "Alice", "Dottie"] )
  name     = each.key
}

module "bucket" {
  for_each = toset(["assets", "media"])
  source   = "./publish_bucket"
  name     = "${each.key}_bucket"
}

tomap

tomap({"a" = 1, "b" = 2})

merge

merge({a="b"}, {a=[1,2], c="z"}, {d=3})

data

外部リソースを定義
data "aws_ami" "web" {
・・・
}
以下のようにで「ata.aws_ami.xxx」でアクセスできるようになる
resource "aws_instance" "web" {
  ami           = data.aws_ami.web.id
  instance_type = "t1.micro"
}

cidrsubnet

> cidrsubnet("172.31.0.0/16", 8, 0)
"172.31.0.0/24"

> cidrsubnet("172.31.0.0/16", 8, 1)
"172.31.1.0/24"

明示的依存

resource "aws_instance" "example" {
  ami           = "ami-2757f631"
  instance_type = "t2.micro"

  # Tells Terraform that this EC2 instance must be created only after the
  # S3 bucket has been created.
  depends_on = ["aws_s3_bucket.example"]
}

link