Young Leaves

WSL2 からterraform apply やterraform destory 実行時に固まる時の対処法

Terraform のapply やdestroy 実行時にコマンドが進まず固まった状態になったり完了するまでとても時間がかかったことはありませんか?今回はWSL2 からTerraform のコマンドを実行時、固まってコマンドが進まない時の対処法について説明します。

実施環境

WSL OS

Ubuntu-220.4

Terraform

1.7.0

発生した事象

Windows のWSL 上にTerraform を導入し学習していたところ、「terraform apply」や「terraform destroy」コマンド実行時にコマンドが固まり正常にリソースのプロビジョニングや削除が行われない事象が発生しました。

kdkwakaba@Wakaba001:~/$ terraform destroy
<省略>
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes

<ここから固まる>

Terraform ではtfstate ファイルで状態を管理しており、状態変更中はファイルをロックするため、コマンド実行時に「Ctrl + C」などで中断するとロックされた状態のままになります。そのままの状態ではtfstate ファイルがロックされることにより、新たにリソースのプロビジョニングや削除ができない状態となってしまいます。

原因

Ubuntu 22-04 の /etc/resolv.conf はデフォルトで以下の設定となっています。

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateRsolvConf = false
nameserver 172.24.16.1

WSL 内の /etc/resolv.conf の名前解決が正常に実施されていないことにより、Terraform のapply やdestroy 実行時に正常に名前解決できず固まるまたは実行時間が遅くなるのが原因となります。 /etc/resolv.conf のデフォルト設定では nameserver にローカルのIP アドレスが設定されています。パッケージのインストールなどを行う時には問題なく通信できますが、一部の外部通信では正常に名前解決ができないことがあります。

対処法

WSL 上の/etc/resolv.conf と/etc/wsl.conf の修正、属性の変更を行うことで、本事象を解決できます。最初に/etc/resolv.conf の設定を修正します。今回はGoogle のパブリックDNS を設定していますが、業務などで設定を行う場合は適切なDNS サーバーを指定するようにしてください。

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateRsolvConf = false
nameserver 8.8.8.8

/etc/resolv.conf の修正だけではWSL2 の再起動時に再度 /etc/resolv.conf をデフォルトの値で再生成してしまうため、次に /etc/wsl.conf の設定を修正し /etc/resolv.conf を再生成しないようにします。/etc/resolv.conf の再生成を防止するには「generateResolvConf」の値をfalse に設定します。

[boot]
systemd=true

[network]
generateResolvConf = false

wsl.conf の修正でresolv.conf の再生成は行われませんが、今度はWSL2 再起動時に /etc/resolv.conf が消える事象が発生します。この事象を解決するには、/etc/resolv.conf のファイル属性を削除できないように変更する必要があります。

# /etc/resolv.confの属性を削除できないように変更する
sudo chattr +u /etc/resolv.conf

上記コマンドでは /etc/resolv.conf の属性を削除できないように修正していますが、変更自体を抑止したい場合は「+i」オプションの実行で /etc/resolv.conf の変更をできないようにもできます。

手動でTerraform のtfstate ファイルのロックを解除する場合

もし、Terraform のapply などで固まってしまい、「Ctrl + C」などで強制的に終了させてしまった場合は手動でtfstate ファイルのロックを解除する必要があります。手動でTerraform のtfstate ファイルのロックを解除する場合、以下のコマンドで解除できます。lock 時に表示されたID はエラーとなった時に表示されるID となります。

# Terraformのロック状態を強制的に解除する
terraform force-unlock <lock時に表示されたID>

まとめ

  • WSL2 上でTerraform を実行する場合、外部への名前解決が正常にできる必要がある
  • WSL2 の /etc/resolv.conf はデフォルトでは再生成される設定のため、/etc/wsl.conf の設定と /etc/resolv.conf のファイル属性を変更する必要がある

参考資料