TerraformでGCPのPub/Subを作成する①-Terraformをインストール

GCP,Terraform

はじめに

今まで GCP のリソースをシェルスクリプトで作成していましたが、いい加減クラウド環境構築のデファクトスタンダードである Terraform に移行しようと思っていました。

時間ができたので、ようやく重い腰をあげようかと思います。

とはいえ、想定外に時間がかかってしまったので、今日は Terraform を自分の MacBookPro にインストールするところまでにしておきます。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)

$ brew --version
Homebrew 3.0.5-12-g94431ce
Homebrew/homebrew-core (git revision e6ce0b2835; last commit 2021-03-10)
Homebrew/homebrew-cask (git revision cdab18c620; last commit 2021-03-10)

Terraform ってなに?

Terraform by HashiCorp から抜粋します。 ( 2021-03-10 現在 )

Terraform is an open-source infrastructure as code software tool
that provides a consistent CLI workflow to manage hundreds of cloud services.
Terraform codifies cloud APIs into declarative configuration files.

英語が苦手ですが、頑張って読む限り
クラウドサービス環境を構築する際には CLI(command line interface)を順番に呼び出して構築するけど、そんな「手順型のスクリプト」みたいな方法ではなく、「宣言型の設定ファイル」を作ったらそれに合わせて環境つくれる というツールのようです。
(間違っていたらごしてください。)

イメージは Kubernetes の各種リソースのマニフェストファイルみたいなもの、と見ました。

Terraform のメリットは?

IaC ( Infrastructure as Code )

インフラ設定をコード化できます。
以下のようなメリットが生まれます。

  • インフラ設定をバージョン管理できる
  • 同じインフラ設定を使って、本番環境、ステージング環境、開発環境など複数環境を容易に作成できる
  • なにかのサービスを構築する際に利用した設定ファイルを新しく別サービスを作る際に再利用できる

インフラそのもののバージョン管理

インフラ設定ファイルをバージョン管理できるだけでなく、 インフラ設定ファイルを適用済みの環境をを 1 つ前の状態に戻す といったこともできます。

実行プラン機能

「受け取った設定ファイルだと、こんな環境を作るよ。実行していいよね?」という、適用直前の状態まで準備してくれます。
そのタイミングで「実際に計画通りに実行させる」か、「やっぱり実行をやめる」かはユーザがそのタイミングで判断を下せるようです。

kubectl diff のようなイメージでしょうか?

設定情報の反映は自動

「賽は投げられた」ら、後は完了を待つだけの手軽さ。

Terraform のインストール

では早速 Terraform のインストールに進みます。
Homebrew を使ってインストールしていきます。

まずは、 HashiCorp から提供されている tap をインストールします。

$ brew tap hashicorp/tap

これで、 Homebrew を使って Terraform をインストールできます。

思ったよりも時間がかかります。気長に待ちましょう。

$ brew install hashicorp/tap/terraform

ちなみに、2021-03-10 現在、僕の MacBookPro では上記コマンド実行でエラーが発生しました。解決の仕方は後述します。

インストール後に最新版にアップグレードしたい場合には以下のコマンドを実行します。

$ brew upgrade hashicorp/tap/terraform

以下のコマンドが正常に動作すれば、インストール成功です。
( ハイフンが 1 つなので注意! )

$ terraform -help
Usage: terraform [-version] [-help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

(注意) brew install hashicorp/tap/terraform でエラーが発生してしまった場合

僕の環境では、 brew install hashicorp/tap/terraform で以下のようなエラーが出てしまいました。最近 macOS のアップグレードが行われた ので、そのためかもしれません。
(解決までなかなか長い道のりでした。一連の操作が完了するまで数時間かかったので、のんびり行きましょう!)

$ brew install hashicorp/tap/terraform
==> Installing terraform from hashicorp/tap
==> Downloading https://releases.hashicorp.com/terraform/0.14.8/terraform_0.14.8_darwin_amd64.zip
######################################################################## 100.0%
Error: Your Command Line Tools (CLT) does not support macOS 11.
It is either outdated or was modified.
Please update your Command Line Tools (CLT) or delete it if no updates are available.
Update them from Software Update in System Preferences or run:
  softwareupdate --all --install --force

If that doesn't show you any updates, run:
  sudo rm -rf /Library/Developer/CommandLineTools
  sudo xcode-select --install

Alternatively, manually download them from:
  https://developer.apple.com/download/more/.

Error: An exception occurred within a child process:
  SystemExit: exit
brew install hashicorp/tap/terraform  3.14s user 1.99s system 72% cpu 7.035 total

メッセージにある通り、 コマンドラインツールをアップグレードしないと利用できない ということなので、アップグレードします。

$ sudo rm -rf /Library/Developer/CommandLineTools
$ sudo xcode-select --install

$ softwareupdate --all --install --force

再度実行しても、以下のようにエラーが出ました。 gcc がとのこと。

$ brew install hashicorp/tap/terraform
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 2 taps (homebrew/core and homebrew/cask).
==> Updated Formulae
Updated 2 formulae.
==> Updated Casks
Updated 2 casks.
xcrun: error: active developer path ("/Library/Developer/CommandLineTools") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
See `man xcode-select` for more details.

==> Installing terraform from hashicorp/tap
==> Downloading https://releases.hashicorp.com/terraform/0.14.8/terraform_0.14.8_darwin_amd64.zip
Already downloaded: /Users/toshiaki_wakabayashi/Library/Caches/Homebrew/downloads/8109387c4220d1a89bfa58537a63c2c31e73377e0872da46013ed80f740611f9--terraform_0.14.8_darwin_amd64.zip
xcrun: error: active developer path ("/Library/Developer/CommandLineTools") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
See `man xcode-select` for more details.
Error: An exception occurred within a child process:
  CompilerSelectionError: hashicorp/tap/terraform cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc

では、 gcc をインストールしてみる、ということで実行したところ、 ソースコードからビルドしてください とのことでした。

$ brew install gcc
Error: gcc: the bottle needs the Xcode CLT to be installed.
You can try to install from source with:
  brew install --build-from-source gcc
Please note building from source is unsupported. You will encounter build
failures with some formulae. If you experience any issues please create pull
requests instead of asking for help on Homebrew's GitHub, Twitter or any other
official channels.

ソースコードからビルドしてみると、 Xcode で使っているコマンドラインツールのパスが変更されているので、見つかりません。正しいところにパスを貼り直してね というメッセージ。
たらい回し。。。

$ brew install --build-from-source gcc
==> Downloading https://homebrew.bintray.com/bottles/isl-0.23.big_sur.bottle.tar.gz
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/77907a43a415210de713d9e82588b452e5546a31b42194c7c75e07486d319a51?response-content-disposition=attachment%3Bfilename%3D%22isl-0.
######################################################################## 100.0%
==> Downloading https://homebrew.bintray.com/bottles/libmpc-1.2.1.big_sur.bottle.tar.gz
######################################################################## 100.0%
==> Downloading https://raw.githubusercontent.com/Homebrew/formula-patches/6a83f36d/gcc/bigsur_2.patch
######################################################################## 100.0%
==> Downloading https://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.xz
######################################################################## 100.0%
==> Installing dependencies for gcc: isl and libmpc
==> Installing gcc dependency: isl
==> Pouring isl-0.23.big_sur.bottle.tar.gz
🍺  /usr/local/Cellar/isl/0.23: 72 files, 5MB
==> Installing gcc dependency: libmpc
==> Pouring libmpc-1.2.1.big_sur.bottle.tar.gz
🍺  /usr/local/Cellar/libmpc/1.2.1: 13 files, 425.0KB
==> Installing gcc
xcrun: error: active developer path ("/Library/Developer/CommandLineTools") does not exist
Use `sudo xcode-select --switch path/to/Xcode.app` to specify the Xcode that you wish to use for command line developer tools, or use `xcode-select --install` to install the standalone command line developer tools.
See `man xcode-select` for more details.
Error: An exception occurred within a child process:
  CompilerSelectionError: gcc cannot be built with any available compilers.
Install GNU's GCC:
  brew install gcc

以下のコマンドを実行して、 Xcode のコマンドラインツールのパスを最新版に更新

$ sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

今度は手応えがありそうです。 gcc のインストールに戻ります。
ビルド中は MacBookPro のファンが元気に回っていました。

$ brew install --build-from-source gcc

ようやくもともとやりたかった、 Terraform のインストールまで戻ってきました。
以下のコマンドを実行します。

$ brew install hashicorp/tap/terraform

Terraform のオートコンプリート(補完)機能を有効化

BashZsh を利用している場合は、Tab キーを押したときにオートコンプリートで候補が表示されるようにしておくと便利です。

$ terraform -install-autocomplete

実行後は、ターミナルのセッションを一度立ち上げ直しましょう。

ひとこと

次回は Terraform を使って GCP に環境を構築していきたいと思います。

GCP,Terraform