📝

Plugin did not respond | terraform planでエラー | M1 Mac

2022/05/19に公開

Terraform でエラーが出た時の対処録です。

対処法

.zshrcに以下の一文を追記します。

#Golangでgoroutine、非同期関連の機能をオフ。一時対応
export GODEBUG=asyncpreemptoff=1

この一文でgoroutine、非同期関連の何か(asynchrnous preemption)をオフにしている模様です。

ターミナルで開いているタブで.zshrcを反映します。

$ source ~/.zshrc

これで自分の場合は解消できました。

エラー

以下のようなエラーがランダムに出るので結構厄介です。

error1

 Error: Plugin did not respond
│ 
│   with provider["registry.terraform.io/hashicorp/aws"],
│   on providers.tf line 1, in provider "aws":
│    1: provider "aws" {
│ 
│ The plugin encountered an error, and failed to respond to the plugin.(*GRPCProvider).ValidateProviderConfig call. The plugin logs may contain more details.

error2

│ Error: Unrecognized remote plugin message: 
│ 
│ This usually means that the plugin is either invalid or simply
│ needs to be recompiled to support the latest protocol.

原因

M1のRosetta2とgolangのasynchronously preemptibleが絡み合ってエラーになっているようです。Terraformでgolang使っているのかな?
前述の通り根本的な解決法ではないと思うので今後この機能をオフにしなくても有効にできるようになれば今回の.zshrcへの記述は削除しても良いかもしれません。

デバッグログ

自分の場合以下の流れで調べていきましたのでまとめてみます。

  • terraform planを実行。error2が表示される。
  • TF_LOG=DEBUG terraform planを実行。rpc error: code = Unavailable desc = transport is closingが表示されるが今度は最後までplanが通る。
  • rpc error: code = Unavailable desc = transport is closingで検索するも有益な情報に辿り着けず。Golangの記事をちらほら見かける。
  • 再度terraform planを実行。error1が表示される。
  • error1の最後の二行で検索、下記zennの記事を発見。
  • asyncpreemptoffは何をやっているか知りたくなり検索。さらに参考記事を見つけ原因がなんとなくわかる。

最初に出たエラーメッセージと原因、解決法が結構遠く、ハマっていてもおかしくないエラーでした。危なかった&運が良かった。

環境

M1Mac
OS:12.3.1
Terraform v1.1.9

参考

同様の問題でわかりやすく解説していただいておりました。

https://zenn.dev/bun913/articles/m1-mac-terraform-unstable

日本語でasyncpreemptoffについてわかりやすく解説してくれている貴重なサイトでした。

https://hidetatz.io/articles/2021/03/28/goroutine_preemption_ja/

他英語のサイト、こちらの情報も大変参考になりました。

https://yaleman.org/post/2021/2021-01-01-apple-m1-terraform-and-golang/

https://github.com/golang/go/issues/42700

https://github.com/hashicorp/terraform/issues/27350

Discussion