Kの備忘録

実に忘れっぽいので色んなこと書いてます

terraformに入門しました

こんにちは

錦織圭ジョコビッチに負けてしまいましたね。残念。 また次のグランドスラム頑張って欲しいなぁ〜

さて雑談はこの辺にして、今更terraformに入門したので、忘れないうちに覚えたことを書いておこうと思います。 ここを読んだ感じです。 www.terraform.io

本当はクラメソさんの記事を読もうとしたんですけど、無性に英語で読みたくなったので。。。 まぁ、途中で眠たくなって寝たんですが笑

インストール

リンク先ではbinaryを落としてきて、インストールしてるっぽいんですが、 パッケージ管理ツール下におきたかったので、brew使いました(Mac使ってます)

$ brew install terraform
ゴニョゴニョ
$ terraform -v
Terraform v0.11.8

Build Infrastructure

  • とりあえずprovider awsは書いておく
  • 設定ファイルは Terraform format(.tf) あるいは JSON(.tf.json)で書ける
    • Terraform format is more human-readable, supports comments, and is the generally recommended format
    • JSON は機械向け
  • 最初はとりあえずterraform initする
    • providerに応じたプラグインがインストールされる
    • プラグインのバージョンが勝手に上がることがあるので、嫌ならバージョン固定する記述を書くこと(具体的にどう書くかは未調査)
  • applyしたとき
    • は実行してからわかる
  • statefileで状態を管理する
    • S3とかremoteに置いておくことをオススメする

Change Infrastructure

  • リソースによっては一度作って再生成する場合がある
  • 交換できる場合はそんなことしない

Destroy Infrastructure

  • 淡々と破壊するだけ

Resource Dependencies

  • リソース間に依存関係をつけることで、リソースを作成する順番を解決する
    • Implicit(暗示的): Terraformが勝手に読み取ってくれるパターン
      • "${aws_instance.example.id}"などと書く(interpolationて言う。)
    • explicit(明示的): Terraform管理外の部分(e.g. アプリのデプロイ順等)なので、Terraformユーザが指定するもの
      • resource定義の中に「depends_on = ["aws_s3_bucket.example"]」などと書く
  • 依存関係のないリソースは並行して作ってくれる

Provision

  • リソース作った後等、何か処理をさせられる
  • 色々種類がある。
    • local-exec: リソース作った後にterraformの実行環境で何かする
    • destory: リソースを破壊した後に後片付け処理をする。普通他に代替手段があるので使わないと思われる
  • 複数個同じ種類のprovisionerを動かすこともできる
  • bootstrap的なやつなので、configuration management toolの代替にはならない
  • configuration managementツールを使ってるなら、provisionerはそれをキックするのに使うべき

  • taintedリソースは作成に失敗した(と思われる)リソース。腐ってる。

  • Terraformはtaintedなリソースができた時は、ただ警告っぽいのを出すだけ。
  • 次に terraform apply をした時にrecreateする

Input Variables

  • variables.tf に変数を定義できる。
  • terraform.tfvars に変数の値を代入できる
  • variables.tfの値はそれ以外にも以下の方法で代入できる
  • defaultからルックアップ的に値を代入できる

Output Variables

  • *.tf の任意の場所で 任意の値を出力できる。
  • ユースケース的にはほぼdynamicな値であろう

Modules

  • Terraformには Module Registry と言う仕組みがあり、知らない人が作ったModule(インフラ)を自分のインフラに組み込める
    • Dockerで言う所の Docker Hub的な?
  • sourceだけ指定すること。あとは 使う対象のModule次第で使えるパラメータが変わる
  • 足したら terraform init すること
  • Moduleには出力可能なoutputが定義されていて、さっきのやり方でコンソールに出力できる
  • こんな感じの文法で
    • ${module.NAME.OUTPUT}
    • NAMEはモジュール名
    • OUTPUTは対象モジュールで出力したいoutput
  • 高くつく構成なので終わったら忘れずにDestroy

Remote Backends

  • ステートファイルをS3とかにおくことで、同じインフラ構成をチームで管理できるようになる
  • Terraform Enterpiseあるよ!いろいろできるお!
  • やるときは terraform init を忘れずに
  • remote backends を使っている間、stateファイルはリモートにある。ローカルにはない(本当に?)
  • 管理をローカルに戻したい場合は、Remote Backendsの設定を消して、terraform init すること。そしたら戻る

わからなかったこと

  • 結局providerって何?
  • State Locking はステートの更新をロックするもの?それともインフラの更新の排他制御をするもの?