『Pragmatic Terraform on AWS』のハマりどころと回避方法 #技術書典

技術書典6で頒布した『Pragmatic Terraform on AWS』ですが、ハマりどころがあるので、理由と回避方法を説明します。

kosmos.booth.pm

5/20追記

2019年5月現在の最新版であるTerraform 0.12.0-rc1以降では不要な手順になります。なにも考えずに terraform init を叩いてもらってOKです。

4/22追記

なんと本記事を後悔した翌日に、「Terraform 0.12 Beta 2」が出てしまいました。Beta 2の場合の設定手順を別途記事にしているので、Beta 2については下記の記事をご参照ください。

nekopunch.hatenablog.com

長いので先に結論

書籍に掲載しているコードを、macOSでそのまま動かしたい場合は、terraform-provider-aws_1.60.0-dev20190216H00-dev_darwin_amd64.zipをダウンロードして解凍してください。解凍すると、バイナリファイルが出てくるので、それを ~/.terraform.d/plugins に配置すれば動きます。なお14章のみ、もう一つファイルが必要ですが、そちらについては後述します。

また、もう一つ回避方法があります。Terraform v0.11をインストールして、v0.11版のサンプルコードを参照しながら書籍を読み進める、という方法です。こちらのほうが最初は手軽かもしれません。

いきなり結論から書きましたが、下記で詳細を説明します。

Terraformのバージョン

前提として、Terraformには現在、大きく2つのバージョンが存在します。2019/4/18現在の正式版であるv0.11と、まだBeta版のv0.12です。v0.12は事実上のメジャーバージョンアップであり、言語仕様が大きく拡張されています。

『Pragmatic Terraform on AWS』の執筆時、本が出る頃にv0.12の正式版が出ていると想定していました。そのためBeta版でのみ必要となる手順を省略しています。しかし、想定通り正式版リリースがされていないため、本の通りに terraform init を実行するとエラーに見舞われます。下記のようなエラーになるはずです。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...

No available provider "aws" plugins are compatible with this Terraform version.

From time to time, new Terraform major releases can change the requirements for
plugins such that older plugins become incompatible.

Terraform checked all of the plugin versions matching the given constraint:
    (any version)

Unfortunately, none of the suitable versions are compatible with this version
of Terraform. If you have recently upgraded Terraform, it may be necessary to
move to a newer major release of this provider. Alternatively, if you are
attempting to upgrade the provider to a new major version you may need to
also upgrade Terraform to support the new version.

Terraform v0.12.0-beta1 was released before all providers were updated for
compatibility. For more information on provider availability for beta1,
including workarounds for testing with not-yet-supported providers, please see
the release announcement:
    https://www.hashicorp.com/blog/announcing-terraform-0-1-2-beta1


Error: no available version is compatible with this version of Terraform

いきなりこんなエラーメッセージ見せられたら混乱してしまいますね。正式版では出ないはずのエラーです。著者の想定が甘かったため、Terraform初心者に優しくない初見殺しの本になっています。申し訳ありません。

何が起きているか

『Pragmatic Terraform on AWS』でも簡単に説明していますが、Terraformを動かすためには、対応するプロバイダのバイナリファイルが必要です。Beta版であるv0.12では、このプロバイダのバイナリファイルを、自分でインストールする必要があります

v0.12の正式版がリリースがされれば terraform init コマンドを叩くだけでよくなりますが、Beta版の間はそういうわけにはいきません。v0.12ではコードが大幅に書き換えられており、内部実装だけみるとほとんど別物です。そのため、v0.11とv0.12は互換性がありません。その余波で、v0.12と互換性がないプロバイダがあるとエラーが発生するという状況が生まれています。

解決策

記事の冒頭で書いた結論の繰り返しになりますが、解決策は大きく2つです。「Terraform v0.12を使えるようにセットアップする」か「Terraform v0.11を使う」です。

Terraform v0.12を使えるようにセットアップする

ここではmacOS前提で説明します。

書籍掲載バージョンであるTerraform v0.12で動かしたい場合は、プロバイダのバイナリファイルを自分でインストールします。インストールといっても、バイナリファイルを所定のディレクトリに置くだけです。まずはバイナリの配置先となるディレクトリを作成します。

$ mkdir -p ~/.terraform.d/plugins

『Pragmatic Terraform on AWS』に掲載されているコードを動かすには、AWSプロバイダのバイナリファイルが必要です。

また、14章に限り、追加でGitHubプロバイダのバイナリファイルが必要です。

そしてzipファイルをダウンロードして解凍したら ~/.terraform.d/plugins ディレクトリにファイルを置いてください。するとTerraform v0.12でも、terraform init が正しく動くようになります。

なお、macOS以外の場合は、リンク先から適宜対応するファイルをダウンロードしてください。

Terraform v0.11を使う

Terraform v0.11で動かす場合は簡単です。単純にTerraform v0.11をインストールして terraform init コマンドを叩けば動きます。

ただし、書籍掲載のコードはv0.12版なので、写経する場合はGitHubのサンプルコードを参照していただく必要があります。下記のリポジトリv0.11 というディレクトリがあるので、そちらをご覧ください。

ちなみに書籍には、v0.12固有の説明はほとんどないので、v0.11のコードを見ながらでも読み通せるはずです。

注意事項

前述のとおり、v0.12はBeta版です。したがって、本番環境では、v0.12はまだ使わないようにしましょう。本番投入は、正式版が出てからでお願いします。

また、本記事はv0.12がBeta版の間だけ必要な情報を記載しています。v0.12の正式版が出れば、本記事記載のメンドウな手順は不要になる見込みです。

よもやま話

事前のアナウンスなどを勘案し、遅くとも4月の上旬にはv0.12が正式リリースされるだろうと踏んでいました。そこで、正式版が出てる前提でセットアップ手順を説明したのですが、それが裏目に出ました。

どうせ近々正式版がリリースされるし、言語仕様も拡張されるし、v0.12対応にしたほうが長く役に立つだろうと思ったので、入稿二週間前に相当ムリしてv0.12に対応させました。しかしそのせいで、自分で書いた本のハマりどころについて解説するハメになるとは予想していませんでした。

ままならないものですが、これもまた人生ということで。

参考リンク