Apple Silicon (M1) で Terraform を使う
追記
04/08
まだ terraform の Apple Silicon 対応のバイナリはリリースされていませんが、 hashicorp/terraform-provider-aws
や hashicorp/terraform-provider-google
が対応したことで、自前でビルドする必要はなくなりました 🎉
- hashicorp/terraform-provider-aws は v3.30.0 で対応しています。
- hashicorp/terraform-provider-google は v3.63.0 で対応しています。
はじめに
プライベートで昨年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