Terraformのチュートリアルを読む
https://gyazo.com/8b0ed77769f80f9bf49344f12f9b9045
2021-03-04 追記 このドキュメントは古い
2019年5月にTerraform v0.12以降はHCL2が導入された
内部実装はほぼ別物なんですが、表面上はかなりの互換性を保っています
公開日:2018/2/11
目標
公式チュートリアルを読む
インストール
バイナリを落としてパスを通す
Build Infrastructure
設定ファイル(configuration)の拡張子は.tf
.tfが複数あると全部読まれる
設定ファイルはJSONにできるけど機械的に出力する時のみそうするほうがいい(読みやすい?)
設定(完成版)
code:tf
provider "aws" {
access_key = "ACCESS_KEY_HERE"
secret_key = "SECRET_KEY_HERE"
region = "us-east-1"
}
resource "aws_instance" "example" {
ami = "ami-2757f631"
instance_type = "t2.micro"
}
鍵がハードコートされているがあとで切り出す
provider(例だとAWS)はリソースの作成と管理に責任を持つ
複数あるのは普通
resourceはインフラのリソースを定義する
EC2インスタンスとか
resource ${リソース種別} ${名前} で定義する。
リソース種別には${provider_name}_のプレフィックスがついている
terraform planで実行計画を見られる
必須パラメータを設定しわすれているとコケる
バリデーションはされない(例:regionは必須だけどその値が正しいかは気にしない)
terraform applyで適用される
同時にterraform.tfstateを書き出す
resourceのメタデータを実際のIDにmappingする
secretとか入っているのでGitHubに公開してはいけない
terraform showで状態がわかる
ここまででインフラができた。イメージベースならこれでおしまい。
Change Infrastructure
~ だと非破壊の状態変化
-/+ だと破壊後に再構築
疑問:スケールさせる方法はないの?
Destroy Infrastructure
terraform plan -destroy で破壊の実行計画
terraform destroyで実行
Resource Dependencies
依存関係をグラフでもっているので基本的によしなにしてくれる
リソース同士の依存関係を明示したい場合は depends_on を使う
terraform graph でグラフが確認できる
依存してないものは、当然依存関係のないグラフになっている
Provision
resourceブロックにprovisionerブロックを追加する
Chefとか
リソースが作成されたときだけ実行される
リソースつくったけどプロビジョニングがこけた場合、terraformはエラーを出して "tainted"マークをつける。
安全性が保証されないため、次の実行計画のときには同じリソースのプロビジョニングをやろうとしない
代わりに、taintedリソースを取り除いて新しいリソースを作成してプロビジョニングする。
実行計画に反するので、自動でリソースをロールバックしたり破壊したりしない
実行計画はリソースをつくれといったが消せとは言ってない
でも、"tainted"がついた状態で実行計画をたてるとリソースを消せというので実行時にも消えるよ
破壊するときだけ実行することもできる(システムのクリーンアップやデータの保存)が、init scriptみたいなリソースにビルトインしているやつを使うのがおすすめ
Input Variables
ハードコードされたキーをなんとかする方法
変数を設定していちいち入力する
ファイルから読む
Mapをつかってリージョンごとに秘密の値を指定したりもできる
usリージョンならami-hogeを使う、ukリージョンならami-fugaをつかう
Output Variables
確認のために特定の値を簡単に出力できる(IPとか)
個人で小さなアプリで使う分にはこれで十分