【備忘録】Terraformがぶっ壊れて右往左往しました

■はじめに

昨日からTerraformでapply出来なくて、めちゃくちゃハマっていました。。
本当は毎日ブログの更新だけは欠かすまい!と思ってやってたのですが昨日はエントリ書けず、まぢでくやちい。

せめてブログにして供養しよう。

■何が起こったか

とはいえ、完全に整理できてないので起こった事象と解決した方法を簡潔に。

①まずterraform destroyが失敗する

ちょっと前のエントリ

さて、次回はやっとですがここからGgr〜selenoid環境構築につなげます。


とか書きましたが、大事なこと忘れてた。
このままだと毎回VM建ててプロビジョニングしないとならないので流石に手間すぎる。

一度構築したらイメージを作っておかないと面倒ですよね。
ということでpackerを準備してimageを作成しようかなと思ったのですが、実はpackerの導入でちょっと手こずってしまい、この時にこの問題がpackerなのかAzure側なのかを切り分けたくなったわけです。

まぁTerraformファイルもansibleのプレイブックも準備してるし、スクラップ&ビルドは簡単だよね!
と思ってterraform destroyをしました。が。。。
まずdestroyでコケた。

Error: Error creating Network Interface "ネットワークインターフェイス名" (Resource Group "リソースグループ名"): network.InterfacesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="PublicIPAddressInUse" Message="Resource /subscriptions/サブスクリプションID/resourceGroups/リソースグループ名/providers/Microsoft.Network/networkInterfaces/ネットワークインターフェイス名/ipConfigurations/tfNicConfiguration is referencing public IP address /subscriptions/サブスクリプションID/resourceGroups/仮想ネットワーク名/providers/Microsoft.Network/publicIPAddresses/FQDN that is already allocated to resource /subscriptions/サブスクリプションID/resourceGroups/仮想ネットワーク名/providers/Microsoft.Network/loadBalancers/ロードバランサー名/frontendIPConfigurations/primary." Details=[]

Azure Portalを覗きにいくとVMは綺麗に消えているのですが、リソースグループから先が一部消えずに残っていました。

で、ボクとしては安直にAzure Portalから手動で削除したわけです。
ここから色々狂いはじめます。

②成功していたTerraformファイルでplanが起動しなくなる

さて、改めてterraform planを実行したところ、消したはずの仮想ネットワークを探しに行ってplan(もちろんapplyも)が失敗するようになります。

 % 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.

(中略)

Error: Network Interface "myNIC01" (Resource Group "testResourceGroup") was not found!

手動で削除した情報がTerraformで生きている??

③別名でリソースグループ名を設定する

ここが一番ハマりました。

上記のような感じなのでボクとしてはじゃあ一旦別名でリソース作ればいいか、と安直に考えて作成・実行してみる。
結論:同じエラーが発生する!
この辺からボクは相当迷走しました。

何で仮想ネットワークが消えずに残ってるんだっけ?
から以下のissueに辿り着き(結論からいうと、これでは解決しなかった)

github.com

そこからbackend-address-poolを無理くり仕込んでみたり

www.terraform.io

でも動かず、terraformのバージョンを疑ってtfenvで別バージョンインストールしたり、terraform自体をアンインストールしてみたり。

④(解決)tfstateファイルを消す

あれもこれも上手くいかず最後にフォルダごとサヨナラして再構築。

動いたーーー!!!

実はplanを実行するとtfstateファイルができるので、関係ないだろって高を括ってたのが間違いだったのですが、こいつに古いprovider情報がしっかり残ってて全然新しいtfファイルの構成で実行してくれませんでした。
どう考えてもAzureの構成関係ないよなーとは思っていたものの放置していたのですが、まさかこれが原因とは。
Terraformの内部構造をもう一度しっかり確認して、改めて後日エントリにしようと思います。
(完全に知識不足を露呈。。)

あ、ちなみにterraform destroyがこけたのは恐らくこいつのせいです。
DNSを手動で入れる前はふっつーにdestroyできるのに、DNS入れるとこける!
IaCを徹底していないボクの愚かさが2重3重に原因となっていたわけですね。


疲れたー。。
ではでは。