Terraformに入門しました。以前Windows環境で少し操作したことがありましたが、あたらめてMacで環境を構築しつつ概念や動作を確認していきます。
前回の記事ではTerraformの環境構築をしました。今回はTerraformを用いてEC2を起動していきます。
【関連記事】
【参考URL】
- 【AWS】Infrastructure as Code 談議 2022 ~ #AWSDevLiveShow
- 【初心者向け】MacにTerraform環境を導入してみた
- 【Terraform公式】What is Terraform?
- 【AWS公式】Terraform
【コードはこちら】
手動で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で構築していきます。