Terraform実行時に「TLS handshake timeout」が出たときの対処法

こんにちは。 エキサイト株式会社の三浦です。

Terraformは非常に有名なIaCであり、クラウドに触っているなら使っている方も多いのではないでしょうか。

非常に便利なのですが、稀に以下のようなエラーが出ることがあります。

Error: error reading ***: RequestError: send request failed
caused by: Post "https://events.ap-northeast-1.amazonaws.com/": net/http: TLS handshake timeout

今回は、実際に私がこの状況になってしまったときに試した対処法について説明します。

Terraformでの TLS handshake timeout エラー

先ほど説明した以下のエラーは、いわゆるランタイムエラーです。

Error: error reading ***: RequestError: send request failed
caused by: Post "https://events.ap-northeast-1.amazonaws.com/": net/http: TLS handshake timeout

以下の流れで起きます。

  1. Terraformのコード自体に問題があるわけではない
  2. そのため、実行開始自体は問題なく出来る
  3. 実行中にある部分で止まり、そこからほとんど進まなくなる
  4. 待っていると、最終的に上記のエラーが発生して終了

これが起きると、実行エラーになってしまうという問題はもちろん、エラーが起きて終了するまでの待ち時間がかなり長いので、多くの時間を浪費してしまいます。

また、コードの問題ではなくネットワークが原因のエラーであるため、対処にも非常に困るものとなっています。

では、どのような対処法を取ればよいのでしょうか。

エラーの対処法

このエラーの対処法として色々と試しましたが、結論として私の環境で問題だったのは、おそらく IPv6 だったと思われます。

IPv6を使わない

IPv6対応のWiFi環境でTerraformを実行すると上記のエラーが起きていたのですが、ふと思い立ってテザリングで実行してみたところ、何の問題もなくするっと実行することができました。

またその後、IPv6非対応のWiFiで実行してみても問題なく動くことが確認できました。

もしかしたら、PCのOSやセキュリティソフト等の兼ね合いがあったり、Terraformのバージョンの問題(このときは v0.13 を使っていた)というのもあるのかもしれませんが、何にせよ回避策としては IPv6 を使わない、というものが有効でした。

効果がなかったもの

その他、少なくとも以下は私の環境では効果がありませんでした。

  • PCの再起動
  • WiFiのオンオフ
  • VPN接続のオンオフ
  • TerraformのDocker Image / Container 入れ直し

ただしこれはあくまで私のケースの話なので、場合によっては効果があるかもしれません。

最後に

コード自体は問題がないのになぜかエラーが起こる、というのはかなりストレスフルな現象です。

今回はさらに待機時間も長く繰り返し試行するのも大変なので、苦しい戦いでした。

もし同じエラーが起きてしまっている方は、ぜひ試してみていただければと思います。