TerraformでEC2を作成し、Java 17とPostgreSQL 15を自動導入してみた

  •  
 
MAXIMUM が に投稿

タグ

以前、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に記述しておくことで、同じ環境を簡単に再作成できます。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。
画像
実行中リソース