Terraformとは

Terraformとは

HashiCorpが手がける、インフラ構築や設定をコード(テンプレートファイル)を使って自動化するためのツールです。 AWSのほか、複数のプロバイダー(クラウドサービスやツール)に対応しているのが特徴の1つです。

Terraformの開発は非常に活発で、毎月、あるいはそれ以上のペースで新バージョンがリリースされています。 https://github.com/terraform-providers/terraform-provider-aws/blob/master/CHANGELOG.md

事前準備

Terraformのインストールは、homebrewでインストールして下さい。 同時に、tfenvもインストールして下さい。tfenvを導入するとTerraformのバージョンの切替が容易になります。 v0.11.x以下のバージョンがある際は、切り替えが必須となります。

IAM ユーザー

Terraformのバージョン管理ツール https://github.com/tfutils/tfenv ※rbenvのようなものです。

Terraformのインストール

前提条件

Homebrewの導入が終了していること。Homebrewとは「macOS 用パッケージマネージャー」のこと。

▼インストール方法
https://brew.sh/index_jaのサイトに行き、インストールコマンドをコピーする
Macのターミナルを起動して、コピーしたコマンドを実行する

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

terraformのインストール手順

$ brew install terraform

tfenvのインストール手順

# tfenvが導入されているかを確認
$ brew list | grep tfenv
$ 

# tfenvのインストール実施
$ brew install tfenv

# tfenvがインストールされたか確認
$ brew list | grep tfenv
tfenv
$ 

# git cloneで、tfenvをホームディレクトリ配下にチェックアウトする
$ git clone https://github.com/tfutils/tfenv.git ~/.tfenv

# cloneされたことを確認する
$ ls ~/.tfenv/
CHANGELOG.md    README.md   libexec     test
LICENSE     bin     share
$ 

# 「.bash_profile」にPATHを通す
$ echo 'export PATH="$HOME/.tfenv/bin:$PATH"' >> ~/.bash_profile

# 最新版のTerraformをインストールする
$ tfenv install latest

# 最新版(ここでは0.12.9)のTerraformがインストールできたかを確認する
$ terraform --version
Terraform v0.12.9

# 既存環境で利用しているTerraformバーション(0.11.13)を、インストールする
$ tfenv install 0.11.13

# Terraformバーション(0.11.13)がインストールされたかを確認
$ terraform --version

Terraformバーションの切替

# Terraformのバージョン一覧を取得する(アスタリスク(*)が付いているのが現在のバージョン)
$ tfenv list
* 0.12.9 (set by /Users/user.name/.tfenv/version)
  0.11.13
$ 

# Terraformバーションのを確認
$ terraform --version
Terraform v0.12.9
$

# Terraformバーションの切替(0.11.13)に切り替える
$ tfenv use 0.11.13
$ terraform --version
Terraform v0.11.13

# Terraformバーションの切替(0.12.9)に切り替える
$ tfenv use 0.12.9
$ terraform --version
Terraform v0.12.9

参考URL

https://github.com/tfutils/tfenv

環境変数の定義

Terraformを利用する場合、環境変数の管理が必要となります。 環境変数の管理理由は、Terraformを実行する度に、顧客毎のクレデンシャル情報を変更する手間などが発生します。 それらを管理するために利用するのがhttps://github.com/direnv/direnvとなりåçます。 direnvを利用する事で、特定のディレクトリのみ有効な環境変数や設定を行う事が出来るアプリケーションです。 これは非常に便利な反面、コードを「git」などで管理する際に注意が必要となります。 ディレクトリ内にある ''クレデンシャルが含まれたファイルが外部に漏れないように'' Git pushされないように設定します。

# direnvのインストール
$ brew install direnv
==> Pouring direnv-2.20.1.mojave.bottle.tar.gz
 /usr/local/Cellar/direnv/2.20.1: 9 files, 5.5MB

# 現在、自分のPCで利用しているshellを確認する
$ echo $SHELL
/bin/bash

# 「./bashrc」にdirenv用のhook出来るように1行追記する
$ echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
$ cat ~/.bashrc
source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
eval "$(direnv hook bash)"

# 「./bashrc」を再読み込みを実施
$ source ~/.bashrc
$

参考URL

https://github.com/direnv/direnv

.tfファイルを作成

公式ドキュメント https://www.terraform.io/docs/providers/aws/index.html

設計方針 (サンプル)

・Gitでソースを管理 ・ディレクトリ階層ごとにtfstateを分離 ・開発環境/本番環境/その他グローバルなもので3階層 ・tfstateはS3管理 ( Backend S3を用いて同アカウントのS3にtfstateを保存 )

.
├── README.md
└── terraform
    ├── dev <== 開発環境のリソース
    │   ├── aws_vpc.tf
    │   ├── provider.tf
    │   ├── terraform.tf
    │   └── variables.tf
    ├── global <== 開発環境・本番環境以外のリソース
    │   ├── aws_acm.tf
    │   ├── aws_iam.tf
    │   ├── aws_route53.tf
    │   ├── aws_s3.tf
    │   ├── provider.tf
    │   └── terraform.tf
    └── prd <== 本番環境のリソース