@kyanny's blog

商品にならぬ技術は役に立たない - トーマス・エジソン

Learn Terraform - GET STARTED - AWS 練習メモ

Learn Terraform - GET STARTED - AWS 練習メモ

Introduction to Infrastructure as Code with Terraform

  • HashiCorp Configuration Language (HCL)

Install Terraform

  • anyenv 経由の tfenv` でインストールした
    • tfenvrbenv などと結構違う
  • terraform -install-autocomplete

Build Infrastructure

Change Infrastructure

  • -/+ destroy and recreate the resource
  • ~ some attributes can be updated in-place

Destroy Infrastructure

  • Destroying your infrastructure is a rare event in production environments. But if you're using Terraform to spin up multiple environments such as development, test, QA environments, then destroying is a useful action.

Resource Dependencies

  • Implicit dependencies interpolation
    • resource.name.attribute
    • aws_instance.example.id
  • Explicit dependencies
    • depends_on
    • depends_on = [aws_s3_bucket.example]

Provision

  • Terraform でインスタンスのプロビジョニングもできる、が...
  • local-exec provisioner はローカルマシン上でコマンドを実行する
  • terraform init && terraform applylocal-exec provisioner が実行されるかのように書いてあるが、実行されない
    • terraform destroy && terraform apply が必要
    • チュートリアルの下の方に書いてあるが...
  • command = "echo ${aws_instance.example.public_ip} > ip_address.txt" でファイルはつくられたけど中身が空...
  • provisioning でエラーが発生したリソースは tainted
    • When you generate your next execution plan, Terraform will not attempt to restart provisioning on the same resource because it isn't guaranteed to be safe. Instead, Terraform will remove any tainted resources and create new resources, attempting to provision them again after creation.
    • tainted なリソースをうっかり実運用にのせてしまうと後で意図せず消されてしまう、みたいな落とし穴がありそう
  • terraform taint
    • taint 前後で terraform show の diff
    • -# aws_instance.example:
    • +# aws_instance.example: (tainted)

Input Variables

  • -var 'key=value'
  • terraform.tfvars
    • 自動で読み込まれる
  • *.auto.tfvars
    • 自動で読み込まれる
  • *.tfvars
    • 自動で読み込まれない
    • -var-file オプションで指定して読み込む
  • -var-file='secrets.tfvars'
    • -var-file は複数回指定可能
    • -var-file='production.tfvars'
      • Tip: This is one way to provision infrastructure in a staging environment or a production environment using the same Terraform configuration.
  • export TF_VAR_name
    • Note: Environment variables can only populate string-type variables. List and map type variables must be populated via one of the other mechanisms.
  • var が未指定かつデフォルト値も未定義の場合、プロンプトで入力を促される
    • Terraform version <= 0.11
      • UI input は string type のみ
    • Terraform version >= 0.12
      • UI input は List, Map type もいける
  • List type
    • variable "cidrs" { default = [] }
    • variable "cidrs" { type = list }
    • cidrs = [ "10.0.0.0/16", "10.1.0.0/16" ]
  • Map type
variable "amis" {
  type = "map"
  type = "map"
  default = {
    "us-east-1" = "ami-b374d5a5"
    "us-west-2" = "ami-4b32be2b"
  }
}
  • lookup
    • ami = var.amis[var.region]
    • var.amis["us-east-1"]
  • -var で map 指定
    • terraform apply -var 'amis={ us-east-1 = "foo", us-west-2 = "bar" }'
    • Note: Even if a map's data is set in a tfvar file, the variable must be declared separately with either type="map" or default={}.
      • これハマりそう
  • 最後の output の例が出力されない
    • 存在しない ami ID 指定して実行時エラーになってるから?

Output Variables

  • terraform apply 後に terraform outputoutput で指定した値を取得できる
    • terraform output で全部
    • terraform output varname で一個指定

Remote State Storage

Next Steps

  • ついにラスト!
  • ただのリンク集
  • 別のチュートリアル
  • ここまでやってたのが Get Started
  • 次のステップが Operations and Development Tracks

宿題

  • local-execip_address.txt の中身が空だった件
  • terraform init 再実行時に .tfstate.backup ファイルができたがそのあたりの挙動の確認