Apple Silicon (M1) で Terraform を使う

公開:2021/01/07
更新:2021/01/07
4 min読了の目安(約4100字TECH技術記事

公式の方法ではありません。公式対応されるまでの対応方法を紹介します。

はじめに

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

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

前提として、ターミナルは Rosetta 2 を使用しないで起動し、 Homebrew/opt/homebrew にインストールされているものとします。

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

brew install golang

Terraform のインストール

Terraform も --build-from-source option を付けることでソースからビルドしてインストールが可能です。

brew install --build-from-source 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)!