IaC初心者必見!Terraform1年生の教科書的ハンズオン
みなさま、こんにちは。
enaminです。
本日は、Terraform初めて触るぞ...!!というそこのあなたに向けて、
ハンズオン形式で基礎的な使い方をご紹介していきます。
実は去年の秋頃、社内でIaC入門のハンズオン勉強会を実施しました。
その際に用意していたハンズオンドキュメントを、最近他のメンバーが使ってくださっていて嬉しくなり(照)、調子に乗ってこのような形で公開する運びとなりました。
「AWSコンソールも触り慣れてないのに、IaC怖いなあ...なんとなく難しそう...」
という人たちにも、
「意外と難しくないやん」
と思ってもらうことを目指した構成です。
はじめに(不要な方はSKIP!)
用語のおさらいです。
IaC (Infrastructure as Code)とは
IaC(Infrastructure as Code)とは、サーバーなどのシステムインフラの構築を、コードを用いて行うことです。
AWS基盤をコードで構築しよう!と思っても、さまざまなIaCツールが存在していますので、プロジェクトの状況に合わせて選定していくことになります。
Terraformとは
IaCを実現するためのツールの一つです。
Go!で書かれていて、AWS,Azure,GCPなどさまざまなクラウドプラットフォームに対応しています。
IaC化のメリット
IaC化のメリットには以下のようなものが挙げられます。
1.再現性
コードで管理するので再現、デプロイがスムーズにできます。
webブラウザ上での操作に比べ、本番、検証、開発など環境ごとのリソース作成・設定もれを防止できるようになります。
人の手によるミスを減らすことで、障害防止にもつながります。
また検証環境を必要な時だけ立てるなど、コストの削減のために活用することも可能です。
2.運用・管理のしやすさ
プログラムと同じように一元的にバージョン管理が可能で、レビューができるようになります。
複数人が集まって、同期的に同じ画面を見ながら慎重に作業する必要はありません。
事前のレビューが実施できる、切り戻しが容易にできることで、運用効率の向上につながります。
また、実装がそのままドキュメントになるため、途中から参画したメンバーでもリソースの全体像を把握しやすく、
設定の確認をしたい時などは、IDEで簡単に検索できるためとてもスムーズです。
ハンズオンしてみよう
Terraformを使ってAWSリソースを作成する
VPCとEC2インスタンスを作成してみましょう。
Terraform用ユーザーを作成
事前に、AdministratorAccess権限を付与したIAMユーザーを作成してください。
アクセスキーを作成します。
なお、よりセキュアな形でデプロイしたいというそこのあなたは、
shoの書いたこちらのブログをご覧ください。
Terraform用のAWSアクセスキーの権限管理を、スイッチロール形式で最適化する方法
環境構築
READMEに沿って、環境を構築してください。
https://github.com/mmmcorp/tf-handson
設定初期化
Dockerを開いて、以下のコマンドを実行してください。
docker compose run terraform init
terraform init
コマンドで、Terraform設定を新規作成・更新時に初期化することができます。
VPCを作成してみよう!
VPCを作成してみます。
属性なしでplan→applyしてみましょう。
vpc.tfの1行目と11行目のコメントアウトを外してください。
変更内容を確認してみましょう。
docker compose run terraform plan
terraform plan
は、AWS環境の変更内容を、わかりやすく表示してくれるコマンドです。
実業務では一番使用頻度が高いと感じています。
terraform plan
を実行すると、新しくVPCを作成しようとしていることがわかります。
では実際に作成してみましょう。
terraform apply
で、planで確認した変更を適用することができます。
docker compose run terraform apply
Error: error creating EC2 VPC: MissingParameter: Either 'cidrBlock' or 'ipv4IpamPoolId' should be provided.
status code: 400, request id: f468ec45-6213-4242-9721-d2feb5cd67fb
cidrBlock
かipv4IpamPoolId
のどちらかが欲しいと怒られてしまいました。
各リソースには必須で指定するべき属性と、オプショナルの属性があります。
必須設定を指定しないままplan(またはapply)すると、エラーで跳ね返されてしまいます。
どの属性が必須設定なのかは、リファレンスで確認できます。
必須設定を追加しapplyしてみましょう。
vpc.tf
の2-5行目のコメントアウトを外してください。
今回はcidrBlock
を指定してみます。
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
無事に作成できました!
コンソールで確認してみます。
できてますね!
名前をつけてみましょう
名前がないとかわいそうなので、任意設定のNameタグをつけてみましょう。
vpc.tf
の7-10行目のコメントアウトを外してください。
plan結果(長いので割愛しますが)をみると、すでに存在するリソースの設定を変更しようとしていることがわかります。
良さそうであれば、applyしてみてください。
おめでとうございます!
無事に名前をつけることができました。
サブネットを作成してみよう!
次にサブネットを作成します。
リファレンス
パブリックサブネットを作成してみましょう
先ほどの要領で、他のリソースも作成できてしまいます。
vpc.tf
の13-22行目のコメントアウトを外してください。
名前も初めからつけてあげましょう。
applyしたらコンソールで確認します。
サブネットなんかは複数作成する機会が多いですよね。
一個作ってしまえば、それをベースにコピペでさっとできちゃうのが、IaCのいいところです。
EC2を作成してみよう!
次に作成したサブネットにEC2インスタンスを置いてみましょう。
VPC・サブネットを指定してインスタンスを作成してみましょう
ec2.tf
の1-19行目のコメントアウトを外してください。
先ほどの要領で、必須設定とつけたい名前、サブネットを属性として指定しています。
今回は配置するサブネットをデフォルトではなく、自分で作成したものを指定します。
その際に、コードにあるように変数で指定することができます。
便利ですね。
詳しくはこちら→Define Input Variables
既にコンソールで作ったリソースをTerraform配下に持ってくる
コードからコンソールに反映させる方法を学んできましたが、
逆にコンソールで作成したものを、Terraform管理下に置くこともできます。
EC2をTerraform管理下に
コンソールでもう一台EC2を作成してみましょう
コンソールを開いて、新しいEC2インスタンスを作成します。
Name : terraform-import-test
VPC, サブネットは先ほど作成したものを指定、あとは全てデフォルトで作成してみてください。
コンソールにあるものをTerraform管理下にしてみましょう。
前提として、Terraformを採用しているからといって、そのAWSアカウント内にある全てのリソースがTerraformの管理下にあるということではありません。
コンソールで作成したものは、意図的にインポートして初めてTerraform管理下に置かれます。
それでは早速先ほど作ったEC2インスタンスをインポートしてみます。
ec2.tf
の19-21行目のコメントアウトを外してください。
terraform import
を使用して、リソースをインポートできます。
第一引数には、リソース種別
.Terraformで管理する時の名前
を指定します。
resource "aws_instance" "test_import" {
}
の場合は、aws_instance.test_import
です。
第二引数の指定方法は、リソースの種類により決められています。
各リファレンスの一番下に書いてあります。EC2リファレンス
EC2インスタンスの場合はIDを指定してやるみたいですね。
よって今回のコマンドは以下のようになります。
docker compose run terraform import aws_instance.test_import {インスタンスid}
無事インポートできました!
現環境とTerraformの差分を解消してみましょう
このままでは、さっき出てきた必須属性が抜けていますし、
コンソールで行った設定が全く反映できていません。
なのでここから属性を追加していきたいと思います。
何を足したらいいか考えながら、terraform plan
をしたときにNo changesと出るまで、調整してみましょう!
解答例コードはこちら
```
# インポートテスト用EC2インスタンス
resource "aws_instance" "test_import" {
# 必須設定
instance_type = "t2.micro"
# amiまたはlaunch_templateセクションが必須。
# 今回はAMIを指定します
ami = "ami-0f36dcfcc94112ea1"
# 任意設定
tags = {
Name = "terraform-import-test"
}
subnet_id = "${aws_subnet.public_a.id}"
}
```
※他にも効率的にインポート→設定の反映をする方法はありますが、今回は初心者向けなのでまた別のブログで書けたらと思います!
作成した環境を削除する方法
では最後の締めとして、寂しいですが今回作成したリソースを削除したいと思います。
docker compose run terraform destroy
全部消えているか、ぜひコンソールで確認してみてください。
安全な運用を
プログラミングスクールを卒業したての頃、なんとなくTerraformって難しそうだし怖いなあと思っていたのですが、
いざ触ってみるととても直感的に書けて、IaC初心者こそ触りやすいツールだと思います。
とはいえ、簡単に展開できてしまうからこそ、実業務では慎重さが必要ですよね?
shoが以前書いてくれたterraform applyをより安全に実行するためにできることには、DWSで実践している運用Tipsがまとめられていますので、ぜひ合わせてご覧ください!
参考
Infrastructure as Code ―クラウドにおけるサーバ管理の原則とプラクティス | Kief Morris (著)