Appleシリコン (M系チップ) を搭載したMacでterraformコマンドを実行した際、応答が返ってこなくなる問題に遭遇したので備忘録として残しておく。
現象
Apple M2 Proチップを搭載するmacOSで terraform plan
を叩いたところ、無限に応答が返ってこない状態になった。
イメージ
$ terraform plan (永遠なる静寂)
terraform
Terraform v1.10.1 on darwin_amd64
macOS
$ uname -a Darwin xxx.local 23.6.0 Darwin Kernel Version 23.6.0: Mon Jul 29 21:13:04 PDT 2024; root:xnu-10063.141.2~1/RELEASE_ARM64_T6020 arm64
macOS Sonoma 14.6.1 (23G93)
調べたこと
上記の記事で紹介されている GODEBUG=asyncpreemptoff=1
という環境変数を設定して terraform plan
を叩き直したところ、確かに問題は解消した。
Go 1.14からgoroutine周りに「非同期プリエンプション」と呼ばれる仕様変更があったらしい。
go.dev Go 1.14のリリース日は2020年2月。
考察
状況的に、Goの非同期プリエンプションとAppleシリコンの相性が良くないっぽい。だからプリエンプションを以前の仕様に戻す環境変数を設定することで問題が解消した模様。この環境変数を設定することでCPU効率が悪くなって実行時間が遅くなる可能性はあるが、今のところ体感できるほどの差はない。
2020年上旬ごろのアップデートによる影響をなんで今 (2024年12月) 受けているんだ...という謎はありつつ、最近terraform本体や依存モジュールのバージョンアップをしたのでそのへんに理由があるのかも。
回避策 (workaround)
環境変数を設定する
export GODEBUG=asyncpreemptoff=1
たまに踏んでイラッとしてしまうので、自分は .bash_profile
に上記を追加した。