terraformといえばapplyした時にできるtfstateファイルができるのですが、
これがないと他のメンバーがメンテナンスするときに同じインスタンスが作成されたり、
挙動おかしくなったりなど大変なことがおきます。(経験済みw)
これを回避するために「Gitで管理しちゃえばいいじゃんー。」
と安易に考えるのですが、中身はJSONなので
コンフリクト起きた場合死にます。(これぞ悲惨な性質を持つファイル….)
こういうのはGitで管理してはダメです!
v0.9から非常に簡単になったのでブログします。
■v0.8以前は?
S3を使ってtfstateファイルを管理することができました。
しかし、以下のようにapplyからの毎回コマンドを打ってS3に投げないといけません。
1 |
$ terraform remote config -backend=S3 -backend-config="terraform-file" -backend-config="key=dev/terraform.tfstate" |
非常にめんどくさい。。
■v0.9以降は?
https://www.terraform.io/docs/backends/index.html
上記のようにremoteコマンドがなくなり、Backendsという概念に変わりました。基本、
「tfstateを管理するための仕組み」
だけです。どのように管理していくか以下にまとめます。
■config.tf
https://www.terraform.io/docs/backends/types/s3.html
1 2 3 4 5 6 7 8 |
$ cat config.tf terraform { backend "s3" { bucket = "terraform-file" key = "dev/terraform.tfstate" region = "ap-northeast-1" } } |
上記のように各環境にS3と紐付けるためにバケット名をぶち込みます。(事前にバケットを作りましょう)
以前のremoteコマンドをファイル化した感じ。
・ローカルでaws configureの設定
クレデンシャルはterraformのを利用しちゃいましょう。
適当にぶち込みます。
・terraform init
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
$ terraform init Initializing the backend... Do you want to copy state from "local" to "s3"? Pre-existing state was found in "local" while migrating to "s3". No existing state was found in "s3". Do you want to copy the state from "local" to "s3"? Enter "yes" to copy and "no" to start with an empty state. Enter a value: yes Successfully configured the backend "s3"! Terraform will automatically use this backend unless the backend configuration changes. Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your environment. If you forget, other commands will detect it and remind you to do so if necessary. |
initは初期化という意味ですが、
EC2などは消えないので大丈夫w(最初は焦った)
まずinitをすることでローカルのtfstateファイルがS3に同期されます。
・terraform plan
1 2 3 4 5 6 7 8 |
$ terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. aws_vpc.xx_vpc: Refreshing state... (ID: vpc-xxxxxxx) aws_subnet.public-c: Refreshing state... (ID: subnet-xxxxxxxxx) ~省略~ |
相違ないかdry runします。
大丈夫であればapply!
・terraform apply
1 2 3 4 |
$ terraform apply aws_vpc.xx_vpc: Refreshing state... (ID: vpc-xxxxxxxxx) aws_internet_gateway.xx_GW: Refreshing state... (ID: igw-xxxxxxx) ~省略~ |
なんとapply時にtfstateファイルもS3に投げてくれます。
これは便利!
・S3にあるか確認
ちゃんとある!
・他のメンバーが設定変更したとき
1 2 3 4 5 6 7 8 9 10 11 12 |
$ terraform init Initializing the backend... Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your environment. If you forget, other commands will detect it and remind you to do so if necessary. |
これで同期されるので問題なし。
神か!!!!!!!!
■まとめ
terraform熱い。
ローカルのaws configure環境ごとに簡単に変えられないかな…
ansibleのawsモジュールはどうやって管理してるんだろ….
参考
https://blog.lorentzca.me/summary-of-terraform-v0-9/
2件のコメント
ゆるキャン · 2017/07/18 7:48 pm
> initが上記の用に完了したらローカルのtfstateファイルは名前変更しちゃいましょう。
バックエンドを使うと、ローカルのtfstateファイルは引き続きバックエンドの情報を保管するのに利用されるので、名前変更してはあかんです。
こんな感じで。
{
“version”: 3,
“serial”: 0,
“lineage”: “0a998281-703a-48b2-b026-d4c8bb68e8da”,
“backend”: {
“type”: “s3”,
“config”: {
“bucket”: “hello-0-9”,
“key”: “infra/terraform.tfstate”,
“region”: “ap-northeast-1”
},
“hash”: 4951114416268900123
},
“modules”: [
{
“path”: [
“root”
],
“outputs”: {},
“resources”: {},
“depends_on”: []
}
]
}
あだちん · 2017/07/18 10:34 pm
>ゆるふわキャンパーさま
$ terraform initしまする