メタップスアドベントカレンダー二日目の記事です。
terraformのバージョン1.6が出て約2カ月が経ちました。
今回のメジャーアップデートの注目ポイントとして、importブロックがありました。
こちらを使用してみての感想を書いてみます。
正直舐めてました。
importブロックとは
terraformにはimportという機能があります。terraformの管理下に無いリソースを管理下に置きたい場合使用します。
importブロックとは、terraform import
コマンドと同等のことをコードに書けるというものです。
importブロックは
import {
to = xxx.xxx
id = yyy
}
のように記載し、importコマンド
terraform import xxx.xxx yyy
と同じ結果になります。
利点
利点としては、
- importのし忘れを防げる
- importしていない状態でコードとの差分が見られる
- 実際にimportされるのはapplyコマンド実行時
が挙げられます。
importのし忘れを防げる
apply前にimportをしなければならず、その作業を忘れてしまう可能性は大いにあります。
それを防ぐことができるのは大きな利点と言えそうです。
importしていない状態でコードとの差分が見られる
importコマンドの場合、実際にimportしなければコードとの差分を確認することはできませんでした。
しかし、importブロックを使えば、実際にimportしていないにも関わらず差分を確認することができます。
実際にimportされるのはapplyコマンド実行時
importコマンドの場合、import作業とapply作業には多少なりとも間が空いてしまいますが、importブロックではimportとapplyが1操作でほとんど時間を開けず実行できます。
欠点
欠点としては、
- 一度applyしてしまうと不要なブロックになってしまう
- terraform importコマンドと大して手間は変わらない
が挙げられます。
一度terraform applyしてしまうと不要なブロックになってしまう
一旦applyしてしまえば不要なコードになってしまうため、どこかのタイミングで消した方が良いです。
terraform importコマンドと対して手間は変わらない
importブロックによって劇的に手間が省けるようになるかと言われると、特にそういう訳では無いです。
むしろ後々ブロックを消す手間の分余計な作業が増えてしまいます。
ユースケース
importブロックの恩恵を一番受けられる場面は
「複数人が並行でコードを変更している」
時です。
terraform importコマンドの最も怖い部分は、importした後コードに適切な変更が加わらないままapplyしてしまうところだと思います。
これはimportしたリソースを意図せず削除もしくは変更してしまうことになってしまうので避けなければなりません。
ただ、複数人が同時にコードに手を加えている場合、
- Aの変更のためにterraform importコマンドを実行
- Bの変更を適用する
- Aの変更を適用する
のような順番になってしまうとimportしたリソースが削除されてしまいます。
しかし、importしなければコードとの差分を見れないため、importとコード修正をほぼノータイムでできる場面は限られます。
また、PRをmergeしたタイミングで自動で変更が適用されるようなパイプラインを組んでいる場合、他の人がimportしていることに気づかずmergeしてしまうことも十分あり得ます。
このような場合、importブロックは有用です。
実際経験したこととして、リソースをimportしてPRを作成している間に緊急リリースをしなければならない時があり、慌てて緊急リリース用のPRをmergeしたところimportしたリソースが消えるという事がありました。
できるなら…
terraform state rm
コマンドもコード化できるようにしてほしい
まとめ
importブロックは複数人で開発している場合とても便利なものであることがわかりました。
感想
最初この新機能を知った時、大して手間が変わらないのになぜこの機能が実装されたのか疑問でしたが、使ってみるとなるほどと唸りました。正直舐めてました。
(リリースノート読めよというツッコミはなしでお願いします)