🐳

M1 MacのTerraform(docker経由)が遅いのをなんとかする

2022/04/27に公開

この記事は、下記の記事をベースに、自分のワークフローにマッチする形にカスタマイズしただけなので、まずはこちらを見るのが良いと思います。

https://zenn.dev/keitap/articles/bbb7c295af5962

はじめに

Terraformを使うときはプロジェクトによって使用バージョンが異なるため、実務ではtfenvかdocker経由で実行することになると思います。

今の仕事場ではこんな感じのMakeコマンドを作って、透過的にdockerコマンドを使用できるようにしています。

# 実際は使っているクラウドサービスによって認証情報が必要
terraform=docker run -it --rm -v $$(pwd):/app/ -w /app/ hashicorp/terraform:1.1.7

tf-init: ## terraform init
	$(terraform) init

tf-plan: ## terraform plan
	$(terraform) plan

...

これはこれで非常に便利なのですが、hashicorp/terraformのイメージはarmアーキテクチャをサポートしておらず、一応動作はするもののエミュレータ経由なので少し遅いです。

毎回こんなWARNINGも出るのでどうにかしたい。

WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested

自前でビルドする

ということで、自前でビルドしちゃいます。

Dockerfileはこんな感じ(公式を少し変えただけ)。

FROM alpine:latest as build

ARG TERRAFORM_VERSION=UNSPECIFIED

RUN apk add --no-cache curl git openssh && \
    curl -O https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_arm.zip && \
    unzip terraform_${TERRAFORM_VERSION}_linux_arm.zip -d /bin

FROM alpine:latest as final
ARG TERRAFORM_VERSION=UNSPECIFIED

RUN apk add --no-cache git openssh

COPY --from=build ["/bin/terraform", "/bin/terraform"]

ENTRYPOINT ["/bin/terraform"]

ビルドして、公式リポジトリと同じタグを打ちます。

docker build -t hashicorp/terraform:1.1.8 --build-arg TERRAFORM_VERSION=1.1.8 .

問題無くビルドできたら、Makefileで使用しているバージョンのイメージを作成しておきます。

これで、Makefileはそのままで、M1用のイメージを使ってTerraformを叩くことができます。

Discussion