Open5

terraformを用いてAPPサーバー(EC2)とDBサーバー(RDS)を起動する

O.SO.S

ゴール

  • 以下のサーバーをterraformを用いて用意する。
  • APP(WEBも兼ねる)
    • EC2
  • DBサーバー
    • RDS(MySQL)
    • マルチAZは無しにする。(作成したprivateサブネットが一つなので。)

前提

以下の記事で作成したネットワークが存在するものとする。
https://zenn.dev/ochi_shoichi/scraps/1e224c1501cc29

参考にする記事

EC2サーバーの立ち上げ
https://qiita.com/inayuky/items/a57451fa86a7045ee64c

EC2からRDSへの疎通確認
https://dev.classmethod.jp/articles/sales-rds-ec2-session/

展望

  • webサーバーも用意する
    • ALBもしくは自前のnginx?
O.SO.S

1. EC2サーバーを立ち上げる

事前にキーペアを作成しておく

$ ssh-keygen -N "" -f ec2_key

terraformのコード

resource "aws_key_pair" "app_server" {
  key_name   = "ec2_key"
  public_key = file("~/Downloads/ec2_key.pub")
}

resource "aws_instance" "app_server" {
  ami           = "ami-0dfa284c9d7b2adad"
  instance_type = "t2.micro"
  subnet_id     = aws_subnet.public_1a.id

  key_name               = aws_key_pair.app_server.key_name
  # セキュリティグループを紐づける
  vpc_security_group_ids = [aws_security_group.app_sg.id]

  tags = {
    Name = "app_server"
  }
}
O.SO.S

2. RDSを立ち上げる

概要

  • サブネットをもう一つ作成する
    • サブネットグループを作成するために必要なため。
  • RDSの起動
    • サブネットグループを作成する
    • セキュリティグループはサブネット1aのものを使用する。
    • MySQL8.0
    • 無料枠のインスタンスタイプ

terraformのコード

サブネットの作成

private_1cでもNATゲートウェイ必要な場合、同じAZのパブリックサブネットが必要になってくるけど今回は省略した。


resource "aws_subnet" "private_1c" {
  vpc_id = aws_vpc.main.id

  availability_zone = "ap-northeast-1c"
  cidr_block        = "10.0.20.0/24"

  tags = {
    Name = "basic_network-private-1c"
  }
}

RDS起動

resource "aws_db_subnet_group" "test_db" {
  name        = "test-db-subnet-group"
  description = "For Test DB Subnet Group"

  # 既存のprivateサブネットを指定する
  subnet_ids = [aws_subnet.private_1a.id, aws_subnet.private_1c.id]

  tags = {
    Name = "TestDBSubnetGroup"
  }
}

resource "aws_db_instance" "test_db" {
  allocated_storage      = 20    # 無料枠の制限内
  storage_type           = "gp2" # SSDにする
  engine                 = "mysql"
  engine_version         = "8.0"
  instance_class         = "db.t3.micro" # 無料枠のインスタンスタイプ
  db_name                = "mydb"
  username               = "admin"
  password               = "password"
  parameter_group_name   = "default.mysql8.0"
  db_subnet_group_name   = aws_db_subnet_group.test_db.name
  vpc_security_group_ids = [aws_security_group.db_sg.id]

  backup_retention_period = 7
  skip_final_snapshot     = true

  # シングルAZ配置を指定
  multi_az = false
}
O.SO.S

3. EC2からRDSにアクセスする

EC2上でmysqlクライアントのインストール

$ apt-get update && apt-get -y install mysql-client

EC2上からmysqlコマンドで接続する

# RDS_USER: RDSに設定したユーザー
# RDS_ENDPOINT: RDSのエンドポイント
$ mysql -u RDS_USER -p -h RDS_ENDPOINT
O.SO.S

4. EC2へPORT80でhttp通信できるか疎通確認する

WEBサーバーとしての役割を持たせる

nginxをインストールする

$ sudo apt update && sudo apt install -y nginx

nginxを起動する

# 起動させる
$ sudo systemctl start nginx

# 疎通確認
$ sudo systemctl status nginx

nginxのインストールに関する参考文献

https://monologu.com/nginx-ubuntu/

ブラウザから確認

http://[EC2サーバーのパブリックIPアドレス]/

でアクセスする