【Terraform第2回】EC2をTerraformで起動→Nginxを起動→動作確認→環境削除まで

【Terraform第2回】EC2をTerraformで起動→Nginxを起動→動作確認→環境削除まで

Terraformに入門しました。以前Windows環境で少し操作したことがありましたが、あたらめてMacで環境を構築しつつ概念や動作を確認していきます。

前回の記事ではTerraformの環境構築をしました。今回はTerraformを用いてEC2を起動していきます。

【関連記事】


【参考URL】


【コードはこちら】

GitHub

手動でEC2を起動→Nginxの動作確認をしてみる

AWSマネジメントコンソールに接続

AWSマネジメントコンソールに接続し、[VPC] > [セキュリティグループ]に遷移します。

デフォルトVPCを作成

このハンズオンでは、シンプルにTerraformの動作確認をしていきますので、複雑なネットワークの設定は割愛します。

そのため、デフォルトVPCを利用します。なければ作成、あればそのまま使用します。

セキュリティグループを作成

以下の要件でセキュリティグループを作成します。

名前 yyyymmdd-terraform-ec2-sg
インバウンドルール ssh ソース 0.0.0.0/0(どこからでも許可)
http ソース 0.0.0.0/0(どこからでも許可)
アウトバウンドルール そのまま

最小構成でEC2を起動

以下の要件でセキュリティグループを作成し、起動します。

OS ubuntsu
名前 yyyymmdd-terraform-ec2
インスタンス t2micro
キーペア 任意のキーペアを使用(なければ作成して、ローカルにダウンロードしておく)
パブリックIP 自動割り当て 有効
セキュリティグループ yyyymmdd-terraform-ec2-sg(前の項目で作成したものを適用)

EC2にSSH接続

Macのローカルターミナルで、以下の手順でSSH接続します。

前の手順で作成し、ダウンロードしたキーペアに適切な権限を付与し、SSH接続します。

# 初回手順例
# HOMEディレクトリ配下に以下のディレクトリを作成
$ mkdir ~/.ssh/keys
$ chmod 777 ~/.ssh/keys

# デスクトップにダウンロードしたキーペアを「.ssh/keys」に格納
$ cp ~/Desktop/conti-2.cer ~/.ssh/keys/

# 適切な権限を付与
$ chmod 400 ~/.ssh/keys/conti-2.cer

# SSH接続を実施
# IPアドレスは起動したEC2のパブリックIPアドレスを使用する
$ ssh -i ~/.ssh/keys/conti-2.cer ubuntu@<<public-IP>

エラー対応 SSHがNGとなるパターンは以下が多いです

  • セキュリティグループの設定不備
  • SSHコマンドのタイポ
  • IPアドレス違い
  • キーペア違いかキーペアの権限違い
  • ユーザー名違い(Amazon-linuxの場合、デフォルトのユーザー名は「ec2-user」ですが、ubuntuの場合は「ubuntu」です。

Nginxの起動と動作確認

EC2にSSH接続ができたら、以下のコマンドでNginx(WEBサーバー)を起動し、ブラウザから動作確認します。

#!/bin/bash

$ sudo apt update
$ sudo apt install -y nginx

# プロセスの確認
$ ps -ef | grep nginx

ブラウザでURLに以下を入力し、「Welcome to Nginx」と表示されればOKです。

http://<public-IP>

TerraformでEC2を起動→Nginxの動作確認をしてみる

ここまで手動でEC2を起動し、Nginxのインストールと動作確認をしましたが、ここからはTerraformを利用して同様のことを実施していきます。

1. tfファイルの作成

TFファイルとは?

  • TerraformのTFファイルは、Infrastructure as Code(IaC)ツールであるTerraformでインフラストラクチャを定義するためのファイル形式
  • TFファイルは、HCL(HashiCorp Configuration Language)という言語で書かれている
  • resourceブロックは、Terraformのリソースを定義するためのブロック
  • ここではAWS EC2インスタンスを定義しています。amiやinstance_type、tagsなどのパラメータは、インスタンスの設定を定義している

ディレクトリの構成

最終的に以下のようになりました。初めに「main.tf」を作成します。

# work-dirでTerraformをインストールしています。
$ cd ~/work-dir/
$ ls -la
total 40
drwxr-xr-x 7 yoshi staff 224 Mar 28 08:36 .
drwxr-xr-x 6 yoshi staff 192 Mar 28 07:10 ..
drwxr-xr-x 3 yoshi staff 96 Mar 28 07:30 .terraform
-rw-r--r-- 1 yoshi staff 1377 Mar 28 07:30 .terraform.lock.hcl
-rw-r--r-- 1 yoshi staff 915 Mar 28 08:32 main.tf
-rw-r--r-- 1 yoshi staff 181 Mar 28 08:36 terraform.tfstate
-rw-r--r-- 1 yoshi staff 6076 Mar 28 08:35 terraform.tfstate.backup

「main.tf」の作成

$ vim main.tf

tfファイルの記載内容は以下の通り

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

resource "aws_instance" "terraform_ec2" {
ami = "ami-0b828c1c5ac3f13ee"
instance_type = "t2.micro"
key_name = "conti-2"
vpc_security_group_ids = ["sg-0944e366cf3684556"]

tags = {
  Name = "20230328-terraform-test"
}

connection {
  type = "ssh"
  user = "ubuntu"
  private_key = file("~/.ssh/keys/conti-2.cer")
  host = self.public_ip
}

provisioner "remote-exec" {
  inline = [
    "sudo apt-get update",
    "sudo apt-get install -y nginx"
  ]
  }
}

resource "aws_security_group" "instance" {
name_prefix = "2023-terraform-sg"
ingress {
  from_port = 22
  to_port = 22
  protocol = "tcp"
  cidr_blocks = ["0.0.0.0/0"]
  }
}

output "public_ip" {
  value = aws_instance.terraform_ec2.public_ip
}

 

recourceについて

ここではEC2インスタンスを作成するためのものです。

ami 手動でEC2を立てた時に使った値を記載
key_name 手動でEC2を立てた時に使った値を記載
Name 手動でEC2を立てた時に使った値を記載

次に各種パラメータでインスタンスの設定を定義していきます。

connection

private_key ~/.ssh/keys/キーペア名(拡張子不要)


AMI IDの確認方法

  • 手動で作成したAMI IDを確認し、記載すればOK
  • 改めてubuntuを起動する場合は以下の通り
-> Amazonマネジメントコンソール > EC2 > インスタンス > インスタンスを起動
-> アプリケーションおよび OS イメージ (Amazon マシンイメージ)
-> ubuntuを選択しAMI IDを確認

provisioner

Nginxを自動起動するコマンドを記載


「output “public_ip”」

割り当てられたパブリックIPをアウトプットし、SSH接続します。

2. Terraformの初期化

  • Terraformを初期化し、AWSプロバイダーと必要なモジュールをダウンロードします。2回目以降は初期化不要です
  • コマンドは以下の通り
$ terraform init

3. 計画の作成

  • Terraformによる変更の計画を作成
  • terraform planコマンドを使用して、main.tfファイルで指定されたリソースを確認します
  • コマンドは以下の通り
$ terraform plan

4. インスタンスの作成

  • terraform applyコマンドを使用してEC2インスタンスを作成します
  • コマンドは以下の通り
$ terraform apply

インスタンスが起動したかどうか、AWSマネジメントコンソールから確認します。

問題なく起動してたら、ブラウザでURLに以下を入力し、「Welcome to Nginx」と表示されればOKです。

http://<public-IP>

5. インスタンスの削除

  • 最後に、不要な課金を防ぐため、インスタンスを削除します
  • コマンドは以下の通り
$ terraform destroy

コマンドが終了したら、インスタンスが終了したかどうかAWSマネジメントコンソールから確認します。

以上でハンズオン完了です。次回はVPCやルートテーブルなどネットワーク周りも含めてTerraformで構築していきます。