ここ最近、業務で AWS 環境でのインフラ構築を Terraform を用いて
実施する機会があったため、その基本的な導入方法について備忘録に残しておきます。
そもそもTerraformとは?
まずはじめに、そもそも Terraform は何かということについて記載しておきます。
ご存知の方は飛ばしてください。
Terraform は、HashiCorp 社 が開発した
Infrastructure as Code (IaC)を実現することができるOSS です。
いわゆる、インフラストラクチャ定義ツールと呼ばれるもので、
ファイルにインフラ構成を記述し、Terraform コマンドでそのファイルを実行すると、
その構成通りのインフラが クラウド上に構築されます。
イメージとしては、テキストファイルに
- 10.0.0.0/16 の VPC を1つ作成する
- 10.0.0.0/17 のサブネットを1つ作成する
- t2.micro の Linux EC2 を1つ作成する・・・
などの情報を記載しておき、Terraform に読み込ませてあげることで、
AWS 上に上記のリソースが自動的に構築される、という感じです。
ちなみに Infrastructure as Code は、サーバやネットワーク、DB などのリソースを
コードによって構築・管理する技術のことで、インフラ構成をコード化することで、
以下のようなメリットがあります。
- Gitなどのバージョン管理システムで変更履歴を管理可能
- 構成のレビューが容易になる
- インフラ構成の再利用が可能(開発・ステージ・本番でコードを使いまわせる)
- 人為的ミスを防ぐことができる
Terraform でインフラ構築する際に使用する設定ファイル群は、
JSON形式もしくは、Terraform 独自形式(拡張子 tf) で記載します。
使ってみた感想としては、Terrafrom 形式の方がJSON 形式よりも分かりやすく、書きやすかったです。
コード中にコメントを記載することもできるので、複数人でコードを更新する際にも便利ですね。
1つ注意点としては、AWS の最新のサービス (例えば WAF V2など)は
Terraform ではまだ対応されておらず、手動で作成する必要があるようでした(2020/03/27 現在)
大抵のものはコード化できますが、構築したい環境によっては
手動作成が必要な箇所が出てくる可能性もありますので、事前調査が必要です。
|
|
Terraform 実行環境の準備
Terraform は事前に、環境構築したいAWSアカウント内のEc2インスタンス、
または、ローカルPCから 各種Terraformコマンドを実行することで環境構築することができます。
今回は、EC2インスタンスに Terraform をインストールし、
そのEC2インスタンス上から Terraform コマンドを実行することで
各種リソースを構築してみました。
その準備として、以下2点を満たしている Terraform 実行環境Ec2インスタンスを作成します。
- インターネット接続可能であること
- Administrator権限を持っていること
Aministrator 権限と書いていますが、Terraform から構築したリソースへの
操作権限を持っていれば、Admin権限でなくてもよいです。
僕は面倒なので Administrator 権限を付けていますw
本筋から離れるため割愛しますが、以下の手順でLinuxのEc2インスタンスを用意しました。
- AWSコンソールから VPCを作成する
- AWSコンソールから 上記 VPC においてサブネットを1つ作成する
- AWSコンソールから InternetGateway を作成する
- 作成した IGW を上記 VPC へアタッチする
- 作成したサブネットを Publicサブネットとして扱う
- Publicサブネットのルートテーブルにて、IGW との紐づけを行う
- SecurityGroup を作成し、インバウンドルールにSSH接続許可設定を行う
- EC2インスタンスを作成し、前手順で作成したSecurityGroupをアタッチする
- IAMロールを作成し、AdministratorAccess ポリシーをアタッチする
- EC2インスタンスに、前手順で作成したロールをアタッチする
以上の手順で作成した EC2 インスタンスに対し、
ログインできること、インターネット接続ができることを確認しておきます。
|
|
Terraform のインストール
Terraform インストールに入ります。
大まかな手順は以下です。
- Terraform 用ディレクトリ作成
- Terraform インストールモジュール取得
- モジュール解凍
以下、順を追って説明していきます。
Terraform 用ディレクトリ作成
まず先ほど作成した EC2 インスタンスに Teraterm などでログインし、
適当なディレクトリ配下で以下のコマンドを実行し、terraform ディレクトリを作成します。
ここで作成した terraform 用ディレクトリを、ワークスペースとして使います。
1 2 3 |
mkdir .terraform ; cd .terraform ; pwd |
ディレクトリ名は何でも良いですが、Terraform 用ディレクトリであることが
一目でわかるようにしておくと良いです。
Terraform インストールモジュール取得
以下のコマンドを実行し、Terraform の公式サイトから
Terraform のモジュールを Ec2 インスタンス上へダウンロードします。
1 2 3 |
wget https://releases.hashicorp.com/terraform/0.12.20/terraform_0.12.20_linux_amd64.zip |
terraform のバージョンについては、随時更新がはいっているようなので
適宜変更してからコマンド実行してください。
(2020/03/28 時点で v0.12.24 が最新バージョンのようです。: Terraform 公式 ダウンロードページ)
以下は実行ログです。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[ec2-user@XXXXX Terraform]$ wget https://releases.hashicorp.com/terraform/0.12.20/terraform_0.12.20_linux_amd64.zip --2020-03-19 01:50:12-- https://releases.hashicorp.com/terraform/0.12.20/terraform_0.12.20_linux_amd64.zip Resolving releases.hashicorp.com (releases.hashicorp.com)... 151.101.109.183, 2a04:4e42:1a::439 Connecting to releases.hashicorp.com (releases.hashicorp.com)|151.101.109.183|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 16207833 (15M) [application/zip] Saving to: ‘terraform_0.12.20_linux_amd64.zip’ 100%[===============================================================================>] 16,207,833 62.5MB/s in 0.2s 2020-03-19 01:50:12 (62.5 MB/s) - ‘terraform_0.12.20_linux_amd64.zip’ saved [16207833/16207833] |
ダウンロードできたことを確認したら、zip を解凍していきます。
モジュール解凍
以下のコマンドを実行し、先ほどダウンロードしたファイルを解凍します。
解凍したファイルを直接 /usr/local/bin/ 配下へ設置することで、
Terraform コマンドとして登録します。
1 2 3 |
sudo unzip ./terraform_0.12.20_linux_amd64.zip -d /usr/local/bin/ |
以下は実行ログです。
1 2 3 4 5 |
[ec2-user@XXXXX Terraform]$ sudo unzip ./terraform_0.12.20_linux_amd64.zip -d /usr/local/bin/ Archive: ./terraform_0.12.20_linux_amd64.zip inflating: /usr/local/bin/terraform |
unzip が完了したら、Terraform コマンドが使用できることを確認するため、
以下のコマンドを実行します。
1 2 3 |
terraform -v |
以下は実行ログです。
1 2 3 4 |
[ec2-user@XXXXX Terraform]$ terraform -v Terraform v0.12.20 |
|
|
main.tf ファイルを設置
Terraform をインストールし終わったら、初期設定を行っていきます。
Terraform 用ディレクトリ内へ移動後、以下のコマンドを実行し、
main.tf ファイルを作成します。
1 2 3 |
touch main.tf |
ファイル名は何でも良いですが、拡張子は必ず “.tf” としてください。
作成したファイルを vim コマンドなどで開き、以下をコピペして保存してください。
(東京リージョンの場合)
1 2 3 4 5 6 7 |
provider "aws" { access_key = "" secret_key = "" region = "ap-northeast-1" } |
(アクセスキーとシークレットキーの値は、
Terraform 実行用EC2に Administrator ポリシーがアタッチされていれば記載は不要です。
ローカルマシン上から Terraform を実行する場合は、
別途 IAM のアクセスキーを発行し、上記パラメータに設定してください。)
Terraform は AWS 以外にも Azure や GPC などのクラウドサービスに対応しているため、
この main.tf ファイルの記載によって、 AWS を使用するということをTerraform に教えてあげています。
|
|
Terraform の初期化
Terraform 用ディレクトリ内で、以下のコマンドを実行し、Terraform を初期化します。
1 2 3 |
terraform init |
このコマンドにより、ワークスペース(今回でいえば Terraform ディレクトリ内)を
初期化し、.tf ファイルで利用している各種プラグインがダウンロードされます。
この処理は必須なので、忘れずに実施します。
初期化が完了すると、.terraform という隠しディレクトリが作成され、
その中に各種ダウンロードされたファイル群が設置されます。
1 2 3 |
ls -la .terraform |
以上で初期化は完了です。
長くなってしまうため、Terraform の主な使用方法や変数の使用方法については
別記事で上げることにします。
感想
僕自身、クラウドを触り始めてまだ日数が立っていないこともあり、
IaC のイメージがあまりついていなかったのですが、
Terraform を導入して少しいじったことで、ある程度イメージをつかむことができました。
個人的には、AWS Cloudformation よりも、Terraform の方が
使い勝手がよく、構築時の負担も少ないように思いました。
今後は積極的に利用し、インフラ構築の時間を短縮していきたいですね。
(対応していない AWS サービスも少なからずあるので、そこら辺は臨機応変にする必要ありますが。。。)
コメント