フューチャー技術ブログ

はじめてのTerraform 0.12 ~環境構築~

はじめに

こんにちはー
TIG DXチーム 1のゆるふわエンジニアの前原です。

最近は、プラットフォームを新規で構築するプロジェクトや、既存の環境を運用改善していくプロジェクトに従事しています。その中で私はクラウドインフラ部分を担当しており、アーキテクチャデザインや、Terraform・Ansible・Packerといった構成管理ツールを利用したAWSやGCP環境の構築をしています。

本記事では、最近バージョンアップしたTerraform 0.12の構文がこんな感じで変わったよー的な話を伝えていきます。

大きくは以下の流れで進めます。

  1. Terraformの事始め (今回の記事です)
  2. Terraform 0.12でVPCを構築する (次回の記事で説明します!)

これからTerraformを触っていきたいといった方にもわかるように書いていきます。
そのため少し長めの内容になってしまいますが、お付き合いください。

Terraformとは

Terraformは、HashiCorpによって開発された構成管理ツールで、主にクラウド環境(クラウド以外でも利用可能)を構築するときに利用します。

Terraformなどのツールを利用しない場合は、ブラウザを通してGUIから構築するケースがあるかと思います。その場合は、作業ミスをなくすために設定手順書やパラメータシートを元に構築するかとおもいますが、規模が大きくなったり関わる人が多くなってくると、人による設定ミスなどが発生することも多いのでは無いでしょうか。ミスを回避するために、各種施策やドキュメントの陳腐化を防ぐ方法に時間を費やすことも多々あるでしょう。

そういったケースにTerraformのような構成管理ツールを利用することで、インフラの構成をコードに落とし込み、状態を定義できるようになります。

これにより誰が実行しても結果が同じになることで、ミスを低減することが可能です。また、コードを見ることで常にインフラの最新状態を把握できます。また、コード化しているため、Gitなどのバージョン管理システムで管理することもできます。

…と、ここまでメリットについて書きましたが、いざTerraformを使用するとそれなりに学習コストが必要となります。

Terraformの事始め

ここでは、Terraformを実行するための環境をつくります。

環境

Terraformを体験するために以下の環境で行います。

  • AWS
  • Terraform: 0.12.6 & 0.11.14
  • tfenv: 1.0.1
  • MacBook Pro Mojave or Windows10 64bit

Terraformのインストール

Terraformのインストールを行います。

Mac OSの場合

Terraformの実行環境を準備します。
今回は、バージョンの切り替えを楽にしてくれるtfenvを利用します。

### Install tfenv
$ brew install tfenv
$ tfenv -v
tfenv 1.0.1

tfenvでterraformをインストールし、使用可能なバージョンを確認します。

$ tfenv install latest
$ tfenv install 0.11.14
$ tfenv list
* 0.12.6 (set by /usr/local/Cellar/tfenv/1.0.1/version)
0.11.14

バージョンの切り替えは、useを利用することで簡単に切り替えることができます。

$ tfenv use 0.11.14
[INFO] Switching to v0.11.14
[INFO] Switching completed

tfenvを使用しない場合は、こちらのサイトを確認してください。

Windowsの場合

Terraformをダウンロードします。
ダウンロードしたファイルを解凍し、C:¥Windows配下にterraform.exeを配置します。
コマンドプロントもしくはお使いのターミナルを開き、以下のコマンドを発行します。

$ terraform version
Terraform v0.12.6

ここでは試しておりませんが、Windowsもtfenv(only Git-bash)に対応しているので興味のある方は試して頂ければと思います。

Terraform を実行するまでにやること

環境変数の設定

AWSのAPIを発行するために必要な設定です。
AWSのIAM Userであらかじめユーザを作成し、アクセスキーとシークレットキーを環境変数にセットします。

# MacOSの場合
$ export AWS_ACCESS_KEY_ID=xxx
$ export AWS_SECRET_ACCESS_KEY=xxx

# Windowsの場合
$ set AWS_ACCESS_KEY_ID=xxx
$ set AWS_SECRET_ACCESS_KEY=xxx

Mac OSの場合に限りますが、複数のAWSアカウント扱っている場合は、direnvを利用するとディレクトリ単位で環境変数を切り替えることができるため便利です。

もし、HTTP Proxy配下の環境で実行したい場合は以下のオプションも追加で設定ください。

# MacOSの場合
export HTTPS_PROXY=https://proxy.example.com:443

# Windowsの場合
set HTTPS_PROXY=https://proxy.example.com:443

tfstateファイルの管理について

tfstateファイルは、Terraformで管理しているインフラの状態を管理するためのファイルです。
このファイルは非常に大切です。

通常、tfstateファイルを保存する場所を指定しない場合は、Terraformを実行したディレクトリに保存されます。
そのため、複数人でTerraformを実行する環境や、可用性を意識するとローカルでの保存はイケてないです。

そこで、tfstateファイルを管理するためのS3 バケットを用意します。
AWS CLIが実行できることを前提とします)。
また、バケットはバージョニングの設定をします。
バージョニングすることでtfstateファイルに予期せぬ更新や、壊してしまった時に戻せるようにするためです。

### バケットの作成
$ aws s3 mb s3://example-bucket --region ap-southeast-2
### バージョニングの設定
$ aws s3api put-bucket-versioning --bucket example-bucket --versioning-configuration Status=Enabled
### バージョニングの設定ができていることを確認します
$ aws s3api get-bucket-versioning --bucket example-bucket
{
"Status": "Enabled"
}

リージョンの選択

リージョンは適切に選択してください。
もし学習用途であればバージニア(us-east-1)を利用することを個人的におすすめします。
理由は、単純に安いからです!

ただ、本記事は諸事情によりシドニーで構築しています(ap-southeast-2)

Terraformのディレクトリ構成

以下のようなフラットなディレクトリ構成で、1つのディレクトリにtfファイルを配置する設計にします。

以下の3つのtfファイルについては、次章以降で説明します。

  • backend.tf
  • provider.tf
  • versions.tf
.
├── backend.tf
├── provider.tf
├── versions.tf
└── ...(次回の記事で説明します)

Backendの指定

tfstateファイルをS3 バケットで管理するため、Backend用のtfファイルを作成します。
先ほどAWS CLIで作成したバケットを指定します。

backend.tf
terraform {
backend "s3" {
bucket = "example-bucket"
key = "state/service"
region = "ap-southeast-2"
}
}

Providerの指定

Terraformは、AWSだけでなく、GCP、Alibaba Cloudなど様々なプロバイダに対応しています。
今回は、AWSを利用するための定義をします。
また、リージョンを指定します。

provider.tf
provider "aws" {
region = "ap-southeast-2"
}

Versions

このファイルはなくても問題ないのですが、Terraform 0.12から構文が変わっているため、明示的に記述します。
以下により0.12以上のバージョンでないと実行できないようになっています。
(Terraformのアップグレードコマンドで0.12にした場合は、自動で作成されます)

versions.tf
terraform {
required_version = ">= 0.12"
}

Terraform init

準備が整ったので、Terraformを実行します。
まず、Terraformのワークスペースの初期化や、プラグインをダウンロードするためにterraform initを実行します。

terraform init

問題がなければ以下のようなメッセージが出力されます。

Terraform has been successfully initialized!

仮に0.11.14terraform initを実行すると以下の結果になります。

$ terraform init

Initializing the backend...
Backend configuration changed!

Terraform has detected that the configuration specified for the backend
has changed. Terraform will now check for existing state in the backends.



Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Error: The currently running version of Terraform doesn't meet the
version requirements explicitly specified by the configuration.
Please use the required version or update the configuration.
Note that version requirements are usually set for a reason, so
we recommend verifying with whoever set the version requirements
prior to making any manual changes.

Module: root
Required version: >= 0.12
Current version: 0.11.14

Workspaces の準備

本構成は、stgprd の2つの環境を構築します。
stgはStaging(検証環境)、prdはProduction(本番環境)の略です。

Terraformでは、複数の環境を構築するにあたって便利なWorkkspaceがあります。
Workspaceを使うことで、ディレクトリで環境を分けることなく、コード内で識別することが可能となります。

それでは、Workspaceコマンドでstgprdを作成します。

$ terraform workspace new stg
Created and switched to workspace "stg"!
$ terraform workspace new prd
Created and switched to workspace "prd"!

現在のWorkspaceを確認します。

$ terraform workspace show
prd

最後に作成したprdが対象になっているため、変更します。

$ terraform workspace select stg
Switched to workspace "stg".
$ terraform workspace show
stg

まとめ

これで、いよいよTerraformで環境構築できる準備が整いました。
次回の記事では実際のAWSリソースのTerraform定義から、VPCを作成する手順を説明していきますのでお楽しみに!

  • はじめてのTerraform 0.12 ~実践編~

    1. 1.Technology Innovation Groupの略で、フューチャーの中でも特にIT技術に特化した部隊です。その中でもDXチームは特にデジタルトランスフォーメーションに関わる仕事を推進していくチームです。