元茹でガエルなエンジニアの記録

ちょっとやってみたことや考えたことなどを不定期に書き残していきます

Terraformコマンド備忘録

AWS環境のIaCのために、terraformを初めて導入してみたので、コマンドなどを忘れないようにメモ。ちなみに、CloudFormationとどちらを今後使い込んでいくか迷っているのですが、CloudFormationは数年間に少し触ってすごく面倒だった(当時)ので、遠ざかっていましたが、あれからだいぶたってYAMLにも対応したので使いやすくなっているかも、、。

基本のセット

terraform init
terraform plan
terraform apply
terraform destroy

initは本当の最初に一度だけ実行すると思っていたのだが、新たなproviderを使う構成にしたときなど、ときどき必要になる。

planで現在の状態とtfファイルとを比較して、実行計画を立てる。どこに差分があって、追加するのか変更で良いのか、削除するのか、といったことが計画される。 applyでも内部的にはplan相当のことをやったのちに、本当に実行するかを確認してくれるので、plan→applyの流れが必須というわけではない。 destroyで環境を削除する。

-targetオプションを使用することで、特定のリソースだけを構築したり削除することができる。 terraform destroy -target=aws_instance.web

terraform fmt # tfファイルのフォーマット整形
terraform console

terraform graph | dot -Tsvg > graph.svg
# 依存関係の可視化

便利関数

サブネットのCIDR

cidrsubnet("10.0.0.0/16", 8, 0)
# → 10.0.0.0/24

cidrsubnet("10.0.0.0/16", 8, 1)
# → 10.0.1.0/24

cidrsubnet("10.0.0.0/16", 8, 100)
# → 10.0.100.0/24

ホストのIPアドレス(のCIDR表現)

cidrhost("10.0.100.0/24", 3)
# → 10.0.100.3/32

実際の使いどころとしては、CIDRをベタ書きしたくないときに便利。 VPCのCIDRを基準にして、サブネットCIDRとその中に配置するホストのIPアドレスを表現することが出来る。

# VPC CIDRが10.1.0.0./16とする
cidrsubnet(aws_vpc.vpc.cidr_block, 8, 1)
# →10.1.1.0/24
cidrhost(aws_subnet.public_subnet, 25)
# →10.1.1.25/32

VPCのCIDRを変更したときにサブネットやホストのCIDRを書き換えなくても良いので、IaCが捗ります。

既存の構成のterraformへの取り込み

terraform import

しかし、importコマンドを使うやり方は、手順が多くて、やや面倒くさい。 そこで、terraformingがおすすめ。 全てのリソースには対応していないが、対応しているものはterraformingのほうが使いやすい