💻

Apple Silicon (M1) で Terraform を使う

2021/01/08に公開

追記

04/08

まだ terraform の Apple Silicon 対応のバイナリはリリースされていませんが、 hashicorp/terraform-provider-awshashicorp/terraform-provider-google が対応したことで、自前でビルドする必要はなくなりました 🎉
https://github.com/hashicorp/terraform/issues/27257

はじめに

プライベートで昨年12月に購入した M1 MacBook Pro を使用しています。
まだ正式にリリースされていませんが、Go も Docker も動くのでプライベートの開発ではあまり困っていません。

最近 Terraform を使う際に嵌ったので、現時点 (2021/1) での対応方法を紹介します。

Go は 1.16beta1 が公開 され、M1 でも動くようになりました。
現在、M1 環境下で Homebrew により go をインストールすると go1.16beta1 がインストールされます。

brew install go

Terraform のインストール

Terraform も --build-from-source option を付けることでソースからビルドしてインストールが可能です。
terraform 0.14.7 以降は Homebrew で Apple Silicon 向けのバイナリが配布されるようになったので、ソースからビルドする必要はありません。

brew install terraform
$ terraform version
Terraform v0.14.4

これで terraform 自体は動きますが、aws や gcp の provider が対応されていないため、 terraform init の実行で失敗します。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 3.22.0"...

Error: Incompatible provider version

Provider registry.terraform.io/hashicorp/aws v3.22.0 does not have a package
available for your current platform, darwin_arm64.

Provider releases are separate from Terraform CLI releases, so not all
providers are available for all platforms. Other versions of this provider may
have different platforms supported.

Terraform Provider のマニュアルインストール

別途、必要な provider をソースからビルドして、plugins directory に配置することで、動かすことができます。

terraform-provider-aws

ソースからビルドして、 ~/.terraform.d/plugins に配置します。
バージョン 3.22.0 の箇所は必要に応じて変更してください。

$ git clone git@github.com:hashicorp/terraform-provider-aws.git
$ cd terraform-provider-aws
$ git checkout v3.22.0
$ make build
$ mkdir -p ~/.terraform.d/plugins/registry.terraform.io/hashicorp/aws/3.22.0/darwin_arm64
$ cp $(which terraform-provider-aws) ~/.terraform.d/plugins/registry.terraform.io/hashicorp/aws/3.22.0/darwin_arm64/terraform-provider-aws_v3.22.0

これで、 terraform init が成功します。

$ terraform init

Initializing the backend...

Initializing provider plugins...
- Finding hashicorp/aws versions matching "~> 3.22.0"...
- Installing hashicorp/aws v3.22.0...
- Installed hashicorp/aws v3.22.0 (unauthenticated)

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform-provider-google

こちらも同様です。

$ git clone git@github.com:hashicorp/terraform-provider-google.git
$ cd terraform-provider-google
$ git checkout v3.51.0
$ make build
$ mkdir -p ~/.terraform.d/plugins/registry.terraform.io/hashicorp/google/3.51.0/darwin_arm64
$ cp $(which terraform-provider-google) ~/.terraform.d/plugins/registry.terraform.io/hashicorp/google/3.51.0/darwin_arm64/terraform-provider-google_v3.51.0

トラブルシューティング

Terraform Cloud を使用する場合にエラーが出る

Terraform Cloud を Execution Mode: Remote で使用する場合、次のエラーが発生し terraform plan が失敗します。

Error: Failed to install provider

Error while installing hashicorp/google v3.51.0: the current package for
registry.terraform.io/hashicorp/google 3.51.0 doesn't match any of the
checksums previously recorded in the dependency lock file

エラーメッセージの通り、 .terraform/.terraform.lock.hcl に記載されている checksum と一致しないので provider のインストールに失敗します。
この場合、 .terraform/.terraform.lock.hcl を削除することで解消します。

Homebrew でインストール時にエラーが出る

次のエラーが出る場合は、ターミナルを Rosetta 2 を使って起動している可能性があります。
例えば、VSCode を Rosetta 2 で起動している場合、Integrated Terminal で Homebrew を使ってインストールを実行することはできません。

Error: Cannot install in Homebrew under Rosetta 2 in ARM default prefix (/opt/homebrew)!

tfenv を使用している場合

terraform 1.0.1 以下のバージョンでは、公式で arm64 向けの binary が配布されていないため、tfenv install 1.0.1 のように実行すると失敗します。

tfenv で terraform のソースからビルドする術は無く、terraform 1.0.1 以下のバージョンを使う場合は amd64 向けの binary をインストールして Rosetta 2 で実行する必要があります。

TFENV_ARCH=amd64 tfenv install 1.0.1

参考: https://github.com/tfutils/tfenv#tfenv_arch

これで、terraform 1.0.1 以下の amd64 向けの binary がインストールされます。

Discussion