TerraformでEC2のNginxをIaC化してみよう!

eyecatch-iac-terraform-ec2-nginx
目次

概要

Terraform

TerraformはHashiCorp社によって開発されたオープンソースのIaCツールになります。IaCツールの中でもよく利用されるツールであり、ITエンジニアであればどの職種であっても需要がある人気スキルの1つになります。

Terraformについては下記に基本的な仕組みをまとめましたのでよかったからご参考ください。

バージョン管理

Terraformはバージョンが変わると既存のリソースやプラグイン(プロバイダー)が非互換になる場合があります。古いバージョンで書かれたコードが新しいバージョンでうまく動作しないことがあるため、バージョンを明示的に指定することで、プロジェクト全体で互換性の問題を回避できます。

Terraformのバージョン管理を行うツールとして有名なものはasdfやtfenvがあります。asdfはさまざまなプログラミング環境のバージョン管理を行うことができるツールであり、tfenvはTerraformを始めとしたHashiCorp社のツールのバージョン管理を行うことに特化しているツールです。本記事ではさまざまなプログラミング環境のバージョン管理ができるようにasdfを用いてバージョン管理をしたいと思います。

ちなみにバージョン管理ツールというとGitを思い浮かべるかもしれませんが、Gitはソースコードのバージョン管理を行うツールであり、asdfやtfenvはプログラミング環境のバージョン管理を行うツールになります。

環境構築とEC2作成

前提

AWS EC2(ubuntu、t2.micro、SSH利用可)が作成済
WindowsでVS codeで検証済
Terraform 1.3.8

環境構築

unzipのインストール

EC2の初期ubuntuにはunzipがインストールされていません。asdfを利用する上で必須なのでこのコマンドをインストールします。下記のコマンドを実施し、unzipコマンドのバージョンが表示されることを確認してください。

sudo apt update
sudo apt install unzip
unzip -v

asdfのインストール

公式サイトを参考にasdfのインストールを実施していきます。公式サイトを参考に必要な手順を下記にまとめましたので参考にしてください。

## 1.asdfのダウンロード
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1

## 2.bashrcに追記
vi ~/.bashrc
# .bashrcの最後に下記2行を追記
. "$HOME/.asdf/asdf.sh"
. "$HOME/.asdf/completions/asdf.bash"
# .bashrcを再読み込み
source ~/.bashrc

## 3.バージョン確認しバージョンが表示されることを確認
asdf version
v0.13.1-0586b37

asdfでTerraformインストール

asdfを利用してTerraformのバージョン1.3.8をインストールします。

## 1.terraformのプラグインインストールし、利用できるterraformバージョンを確認
asdf plugin add  terraform
asdf list all terraform

## 2.バージョン指定ファイルの作成⇒.tool-versions以下でのみterraform1.3.8が有効
mkdir terraform
cd terraform/
vi .tool-versions
# Terraformのバージョンを指定
terraform 1.3.8

## 3.Terraformのインストール、バージョン、コマンド参照先を確認
asdf install
terraform -v
Terraform v1.3.8
which terraform
/home/ubuntu/.asdf/shims/terraform

EC2作成

ここからEC2生成のための.tfファイルを.tool-versionsと同階層に記述していきます。このセクションでは.tfファイルはprovider.tfmain.tfuserdata.shvariables.tfoutputs.tfの5つを作成していきます。本記事で記述した.tfファイルやTerraformの仕組みを理解したい方は下記の関連記事を読んでみると理解が深まると思います。

1つ目はprovider.tfです。このファイルにはどのプロバイダー情報(AWSやAzureなどのプラットフォームのこと)を記述します。ここでは4-8行目でawsを利用すること、12-14行目で東京リージョンを利用することを明示しています。

terraform {
  required_version = "1.3.8"

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.54.0"
    }
  }
}

provider "aws" {
  region = "ap-northeast-1"
}

2つ目のコードはmain.tfです。このファイルにはEC2やEC2にアタッチするセキュリティグループの設定を記述します。1-13行目ではEC2の設定を記述しています。続いて15-17行目でセキュリティグループの設定を記述し、19-37行目でインバウンドルールとしてHTTP用の80番、SSH用の22番ポートを開放する設定を、39-46行目でアウトバウンドルールを設定しています。

また20行目のcount = var.allow_ssh ? 1 : 0では後述するvariables.tfに記述されたallow_sshの値によりSSH用のインバウンドルールを作成するかしないかを制御しています。

resource "aws_instance" "this" {
  ami           = "ami-0b828c1c5ac3f13ee"
  instance_type = "t2.micro"

  vpc_security_group_ids = [aws_security_group.this.id]

  user_data                   = file("${path.module}/user_data.sh")
  user_data_replace_on_change = true

  tags = {
    Name = "terraform-ec2"
  }
}

resource "aws_security_group" "this" {
  name = "terraform-ec2-sg"
}

resource "aws_security_group_rule" "ssh" {
  count = var.allow_ssh ? 1 : 0

  type              = "ingress"
  from_port         = 22
  to_port           = 22
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.this.id
}

resource "aws_security_group_rule" "http" {
  type              = "ingress"
  from_port         = 80
  to_port           = 80
  protocol          = "tcp"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.this.id
}

resource "aws_security_group_rule" "egress" {
  type              = "egress"
  from_port         = 0
  to_port           = 0
  protocol          = "-1"
  cidr_blocks       = ["0.0.0.0/0"]
  security_group_id = aws_security_group.this.id
}

3つ目のファイルはuserdata.shです。このファイルにはEC2の初回起動時に実行されるコマンドが記述されています。今回はEC2の起動を外部アクセスから確認するためnginxをインストールするコマンドを記述します。なお1行目の!/bin/bashも記述してください。

#!/bin/bash

sudo apt update
sudo apt install -y nginx

4つ目のファイルはvariables.tfです。このファイルにはセキュリティグループのssh接続有り無しを切り替えるための変数を記述します。

variable "allow_ssh" {
  type    = bool
  default = false
}

最後のファイルはoutputs.tfです。後述するterraform applyが完了した際にEC2のアクセス先をターミナルに出力させるための記述です。

output "url" {
  value = "http://${aws_instance.this.public_ip}"
}

動作確認

上記の5つのファイルを記述したら下記のコマンドを順次実行します。applyが完了するとhttp://xxx.xxx.xxx.xxxが表示されますのでこのURLをコピーしてブラウザのアドレスバーに入力しアクセスします。タイミングによってはアクセスできないことがありますが、その場合はEC2が完全に生成されたことを確認しアクセスを実施してみてください。

## 1.init実行
terraform init

## 2.plan実行
terraform plan

## 3.apply実行
terraform apply
Enter a value: yes
Outputs:

url = "http://xxx.xxx.xxx.xxx"

下記のようにnginxの初期画面が表示されれば成功です。

nginx

動作確認後、下記のコマンドを実施することでTerraformで生成されたEC2やセキュリティグループを一括で削除することができます。コマンド実行後に上記のhttp://xxx.xxx.xxx.xxxにアクセスできないこと、EC2とセキュリティグループが削除されていることを確認してください。

terraform testroy
Enter a value: yes

まとめ

この記事ではTerraformとEC2の環境構築手順を解説しました。EC2の環境構築をIaC化しておくことで簡単に同じEC2を作ることができるようになります。今回の手順を拡張することでチーム開発用の環境を用意したり、dev/stg/prdの各環境を簡単に構築できるようになります。ぜひマスターしてみてくださいね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Hack Luck Labの管理人hakula(ハクラ)です。2012年にSIerに新卒入社し、SE、新規事業、情シスを担当。その後、ITコンサルを経て、現在はバックエンドエンジニア。過去にはC#、SQL Server、JavaScriptで開発を行い、現在はPython、Rest Framework、Postgresql、Linux、AWSなどを使用しています。ノーコードツールやDX関連も興味あり。「技術は価値を生むために使う」ことが信条で、顧客や組織への貢献を重視しています。

目次