地味にややこしい「Terraform 0.12 Beta 2」の導入手順を解説してみる

事実上の次期メジャーバージョンである「Terraform 0.12」のBeta 2の公開がアナウンスされました。

本記事では、いち早くTerraform 0.12を体験するための手順を公開します。

tfenv

Terraform 0.12 Beta 2に限らず、Terraformをインストールするには「tfenv」がオススメです。tfenvはTerraformのバージョンマネージャです。tfenvを使うと、異なるバージョンのTerraformを簡単に扱えます。

macOSの場合、まずはHomebrewでtfenvをインストールします。

$ brew install tfenv

インストールできたか確認します。

$ tfenv --version
tfenv 0.6.0

Terraform 0.12 Beta 2

tfenvをインストールしたら、インストール可能なTerraformのバージョンを確認します。

$ tfenv list-remote
0.12.0-beta2
0.12.0-beta1
0.12.0
0.11.13

もちろん 0.12.0-beta2 をインストールします。

$ tfenv install 0.12.0-beta2

それではインストールできたことを確認しましょう。

$ terraform --version
Terraform v0.12.0-beta2

プロバイダのインストール

Terraformの実行にはプロバイダのバイナリファイルが必要です。AWSであればAWSプロバイダ、GCPであればGoogleプロバイダのバイナリファイルが必要です。詳しくは公式ドキュメントをご一読ください。

記事タイトルにもあるとおり、「Terraform 0.12」はまだBeta版です。しかも、0.11と0.12は互換性がなく、プロバイダの対応状況もまちまちです。そのため、プロバイダが0.12に対応しているかどうかでセットアップ手順が異なるという、ややこしい状況を生み出しています。

0.12対応済プロバイダ

「Terraform 0.12」に対応しているプロバイダは簡単です。いつもどおり terraform init コマンドを叩けば、対応するバイナリファイルが降ってきます。

たとえば、AWSプロバイダであれば下記のようにすればOKです。

$ echo 'provider "aws" {}' > aws.tf
$ terraform init

ちなみにBeta 1のタイミングでは、AWSプロバイダのようなメジャーなプロバイダも0.12対応が完了しておらず、手動インストールが必要でした

0.12未対応プロバイダ

「Terraform 0.12」未対応の場合は少しメンドウです。

まずはプロバイダのバイナリファイルの配置先ディレクトリを作成します。

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

次にdevelopment snapshotsから目当てのプロバイダを探します。たとえばGitHubプロバイダであれば「terraform-provider-github」です。

f:id:tmknom:20190421211442j:plain

リンクをクリックすると複数のリンクが並んでいますが、一番日付が新しい「terraform-provider-github_1.4.0-dev20190415H16-dev」をクリックします。名前はプロバイダによって若干異なりますが、ほぼほぼ 20190415 という日付になっていると思われます。

f:id:tmknom:20190421210502j:plain

するといくつかzipファイルが並んでいます。OSごとにファイルは異なります。macOSの場合は、末尾が darwin_amd64.zip という名前のzipファイルをダウンロードしましょう。GitHubプロバイダの場合はterraform-provider-github_1.4.0-dev20190415H16-dev_darwin_amd64.zipが該当します。

f:id:tmknom:20190421210515j:plain

ダウンロードしたら解凍して、最初に作成した ~/.terraform.d/plugins ディレクトリに配置します。

$ unzip ~/Downloads/terraform-provider-github_1.4.0-dev20190415H16-dev_darwin_amd64.zip -d ~/.terraform.d/plugins

あとは通常どおり terraform init すればOKです。

$ echo 'provider "github" {}' > github.tf
$ terraform init

ちなみにこの方法はThird-party Pluginsをインストールする方法として、公式ドキュメントで紹介されています。

0.12に対応済みか判断する方法

筆者が知る限り、完全な一覧はありません。おそらく現在進行系で0.12対応が行われており、刻一刻と状況が変化するためと思われます。

Announcing Terraform 0.12 Beta 2にも一覧がありますが、主要なモノのみ紹介しているようです。詳細はリンク先を見ていただきたいですが、TemplateプロバイダやRandomプロバイダ、Nullプロバイダなどのよく使われるものは対応済みです。

使いたいプロバイダが、0.12対応済みかどうかを調べるもっとも簡単な方法は、実際に terraform init を叩いてみることです。未対応なら下記のようなエラーが出ます。

$ terraform init

Initializing the backend...

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

No available provider "github" 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-beta2 was released before all providers were updated for
compatibility. For more information on provider availability for beta2,
including workarounds for testing with not-yet-supported providers, please see
the release announcement:
    https://www.hashicorp.com/blog/announcing-terraform-0-1-2-beta-2


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

このエラーメッセージが表示された場合は、自分でプロバイダのバイナリファイルをインストールする必要があります。

マイグレーション

本題とは少しズレますが、おまけ的にTerraform 0.11からTerraform 0.12へマイグレーションする方法を紹介します。たとえば、下記のようなコードがあったとします。

resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "example" {
  vpc_id     = "${aws_vpc.example.id}"
  cidr_block = "10.0.0.0/24"
}

Terraform 0.12では 0.12upgrade というマイグレーションコマンドが用意されてるので、これをおもむろに実行します。

$ terraform 0.12upgrade

するとコードは下記のようになります。差分は aws_subnet リソースの vpc_id の行です。

resource "aws_vpc" "example" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "example" {
  vpc_id     = aws_vpc.example.id
  cidr_block = "10.0.0.0/24"
}

このようにTerraform 0.12では、Terraform 0.11から簡単にマイグレーションできるように配慮されています。 ちなみに、技術書典6やBOOTHで頒布している『Pragmatic Terraform on AWS』も当初はTerraform 0.11で実装していましたが、0.12upgradeコマンドを使って、すべてTerraform 0.12に書き換えました。

注意事項

お約束ではありますが注意事項です。「Terraform 0.12」はまだBeta版です。したがって本番環境では、まだ使わないようにしましょう。

最後に宣伝

まだ正式版も出ていないですが、「Terraform 0.12」に対応した書籍『Pragmatic Terraform on AWS』をBOOTHで頒布しています。頒布価格は1,500円で、技術書としてはかなりお求めやすい価格になっています。

kosmos.booth.pm

無料サンプル版もありますので、ぜひご覧ください。

kosmos.booth.pm

また、目次を見たい方は詳細を記事にしてあります。

nekopunch.hatenablog.com

というわけで、『Pragmatic Terraform on AWS』もよろしくおねがいします。