インフラ

IaC初心者必見!Terraform1年生の教科書的ハンズオン

enamin

みなさま、こんにちは。
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

cidrBlockipv4IpamPoolIdのどちらかが欲しいと怒られてしまいました。

各リソースには必須で指定するべき属性と、オプショナルの属性があります。
必須設定を指定しないまま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 (著)

AUTHOR
enamin
enamin
記事URLをコピーしました