以前、AWSコンソールからEC2を作成し、Java 17とPostgreSQL 15を手動で導入しました。
今回はTerraformを使用して、EC2の作成からソフトウェアのインストール、削除までを自動化します。
TerraformとはAWSなどのインフラ構築自動化ツールで、IaCという略称で呼ばれたりもします。
関連記事:
0. 前提
今回の操作では、TerraformとAWS CLIを使用します。
事前にそれぞれインストールしておきます。
今回は下記構成になります。
| 項目 | 設定 |
|---|---|
| リージョン | 東京(ap-northeast-1) |
| OS | Amazon Linux 2023 |
| インスタンスタイプ | t3.micro |
| VPC | デフォルトVPC |
| Java | 17 |
| PostgreSQL | 15 |
1. AWSへログイン
まず、Macのターミナルを開いてAWS CLIからAWSへログインします。
aws login --profile personal --region ap-northeast-1
Terraformでも同じプロファイルを使用するように設定します。
export AWS_PROFILE=personal
2. SSH接続の準備
SSH接続用のキーペアを作成します。パスは空欄でも大丈夫です。
ssh-keygen -t ed25519 -C "terraform-study" -f ~/.ssh/terraform-study-ec2
続いて、SSH接続を自分のグローバルIPアドレスのみに制限するため、下記のコマンドを実行します。
export TF_VAR_ssh_cidr="$(curl -fsS https://checkip.amazonaws.com)/32"
3. Terraformの設定ファイルを作成
作業用ディレクトリとmain.tfを作成します。
mkdir -p ~/terraform-ec2-study
cd ~/terraform-ec2-study
touch main.tf
main.tfには、AWS Provider、EC2、セキュリティグループなどを定義しました。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.23"
}
}
}
provider "aws" {
# 東京リージョンを使用
region = "ap-northeast-1"
}
variable "ssh_cidr" {
type = string
}
# Amazon Linux 2023のAMIを取得
data "aws_ssm_parameter" "ami" {
name = "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64"
}
# SSH接続用キーペア
resource "aws_key_pair" "study" {
key_name = "terraform-study-ec2"
public_key = file(pathexpand("~/.ssh/terraform-study-ec2.pub"))
}
# セキュリティグループ
resource "aws_security_group" "study" {
name_prefix = "terraform-study-"
}
# 自分のIPアドレスからのSSH接続を許可
resource "aws_vpc_security_group_ingress_rule" "ssh" {
security_group_id = aws_security_group.study.id
cidr_ipv4 = var.ssh_cidr
from_port = 22
to_port = 22
ip_protocol = "tcp"
}
# 外向き通信を許可
resource "aws_vpc_security_group_egress_rule" "all" {
security_group_id = aws_security_group.study.id
cidr_ipv4 = "0.0.0.0/0"
ip_protocol = "-1"
}
# EC2インスタンスを作成
resource "aws_instance" "study" {
ami = data.aws_ssm_parameter.ami.value
instance_type = "t3.micro"
key_name = aws_key_pair.study.key_name
vpc_security_group_ids = [aws_security_group.study.id]
associate_public_ip_address = true
# JavaとPostgreSQLを自動導入
user_data = <<-EOF
#!/bin/bash
set -e
dnf install -y java-17-amazon-corretto-headless postgresql15 postgresql15-server
postgresql-setup --initdb
systemctl enable --now postgresql
EOF
depends_on = [
aws_vpc_security_group_ingress_rule.ssh,
aws_vpc_security_group_egress_rule.all
]
tags = {
Name = "terraform-study-ec2"
}
}
# パブリックIPアドレスを出力
output "public_ip" {
value = aws_instance.study.public_ip
}
今回はuser_dataを使用して、EC2の初回起動時にJava 17とPostgreSQL 15を自動インストールします。
また、PostgreSQLの初期化と自動起動設定もまとめて実行します。
.sh分離も可能ですが、逆に管理が煩雑になりそうな規模感なので1ファイルに纏めています。
4. EC2インスタンスを作成
最初にTerraformを初期化します。
terraform init
続いて、EC2インスタンスを作成します。
terraform apply
作成予定のリソースが表示されるため、内容を確認してyesを入力します。
正常に完了すると、下記のような結果が表示されます。
Apply complete! Resources: 5 added, 0 changed, 0 destroyed.
また、作成したEC2のパブリックIPアドレスが出力されます。
AWSコンソールからも、EC2インスタンスが作成されていることを確認できます。

5. Java 17とPostgreSQL 15を確認
作成したEC2にSSH接続します。
ssh -i ~/.ssh/terraform-study-ec2 ec2-user@$(terraform output -raw public_ip)
初回接続時は接続先のホスト鍵を確認します。
接続後、下記のコマンドで初期設定の完了を確認します。
sudo cloud-init status --wait
続いて、JavaとPostgreSQLのバージョンを確認します。
java -version
psql --version
PostgreSQLの起動状態も確認します。
systemctl is-active postgresql
activeと表示されれば正常に起動しています。
これで、EC2の作成からJava 17・PostgreSQL 15の導入まで自動化できたことを確認できます。
6. EC2インスタンスを削除
確認が完了したら、SSH接続を終了します。
exit
Macのターミナルに戻り、今回作成したAWSリソースを削除します。
terraform destroy
確認画面でyesを入力すると、Terraformで作成したリソースが削除されます。
正常に完了すると、下記のように表示されます。
Destroy complete! Resources: 5 destroyed.
※EC2のルートEBS(ストレージ)に保存されたデータも削除されます。ローカルのSSH鍵は残ります。
7. まとめ
今回はTerraformを使って、EC2の作成からJava 17とPostgreSQL 15の導入、削除までを自動化しました。
以前はAWSコンソールでEC2を作成し、SSH接続後に手動でソフトウェアをインストールしていましたが、Terraformを使用することで、これらの作業をまとめて実行できました。
また、構成をmain.tfに記述しておくことで、同じ環境を簡単に再作成できます。
- 閲覧数 64
コメントを追加