0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TerraformでAWS3層構成を構築してみた(VPC / ALB / EC2 / RDS)

0
Posted at

はじめに

本記事ではTerraformを用いてAWSの3層構成を構築してみました。

インフラの構成は以下です。

  • VPC
  • Public / Private Subnet
  • Application Load Balancer
  • EC2
  • RDS
  • CloudWatch Alarm

IaC(Infrastructure as Code)の学習として
Terraform moduleを用いて構成を作成しました。

システム構成

Aws構成図.png

本来の本番構成では、EC2はPrivate Subnetに配置し、
Systems Manager(SSM)や踏み台サーバを経由して管理アクセスを行うことが一般的です。
今回は学習環境のため、EC2をPublic Subnetに配置し、
自分のIPアドレスのみSSH接続を許可する構成としました。

今回構築したアーキテクチャ

Internet
   ↓
ALB
   ↓
EC2 (Application Server)
   ↓
RDS (MySQL)

ネットワーク構成

VPC
├ Public Subnet (ap-northeast-1a)
│   ├ ALB
│   └ EC2
│
├ Public Subnet (ap-northeast-1c)
│   └ ALB
│
├ Private Subnet (ap-northeast-1a)
│   └ RDS
│
└ Private Subnet (ap-northeast-1c)

ALBは2つのPublic Subnetに関連付け、
EC2インスタンスへトラフィックを分散します。

Terraformディレクトリ構成

今回のTerraform構成

terraform-study
│
├ modules
│   ├ network
│   ├ security
│   └ app
│
└ env
    └ dev

modules

module 内容
network VPC / Subnet / IGW
security SecurityGroup
app ALB / EC2 / RDS

Terraformではmoduleを用いることで
インフラ構成を再利用可能な部品として管理できます。

  • 再利用性
  • 可読性
  • 管理性

が向上します

Terraformコード例

VPC作成

resource "aws_vpc" "this" {
  cidr_block           = var.vpc_cidr
  enable_dns_support   = true
  enable_dns_hostnames = true

  tags = {
    Name = "${var.name_prefix}Vpc"
  }
}

ALB構築

resource "aws_lb" "this" {
  name               = "${var.name_prefix}ALB"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [var.alb_security_group_id]
  subnets            = [var.public_subnet_1a_id, var.public_subnet_1c_id]

  tags = {
    Name = "${var.name_prefix}ALB"
  }
}

EC2構築

resource "aws_instance" "app" {
  ami                         = var.ami
  instance_type               = "t3.micro"
  key_name                    = var.key_name
  subnet_id                   = var.public_subnet_1a_id
  vpc_security_group_ids      = [var.ec2_security_group_id]
  associate_public_ip_address = true

  tags = {
    Name = "${var.name_prefix}EC2"
  }
}

CloudWatchアラーム

以下の監視を設定しました

監視対象 内容
EC2 CPUUtilization
ALB HTTPCode_ELB_5XX
RDS FreeStorageSpace

resource "aws_cloudwatch_metric_alarm" "ec2_high_cpu" {
  alarm_name        = "${var.name_prefix}-Ec2HighCpu"
  alarm_description = "EC2 インスタンスの CPUUtilization が 80% を 15 分間超えた場合に通知。"

  namespace           = "AWS/EC2"
  metric_name         = "CPUUtilization"
  statistic           = "Average"
  period              = 300
  evaluation_periods  = 3
  threshold           = 80
  comparison_operator = "GreaterThanThreshold"
  treat_missing_data  = "missing"

Terraform実行

terraform init
terraform plan
terraform apply

apply後に以下のリソースが作成されます

  • VPC
  • Subnet
  • EC2
  • RDS

工夫したポイント

今回のTerraform設計のポイント

module化

network
security
app

役割ごとに分離しました。

変数管理

variables.tf
terraform.tfvars

環境ごとに値を変更できるようにしました。

今後改善したい点

今後は以下を追加したいと思っています。

  • Terraform remote backend (S3)
  • CI/CD

まとめ

Terraformを用いることで

  • AWS環境をコード管理できる
  • 再現性のあるインフラ構築
  • チーム開発が容易

というメリットがあります。

学んだこと

今回の構築を通して以下を理解することができました。

  • Terraform moduleによるインフラの構造化
  • ALBを用いたロードバランシング
  • Public / Private Subnetによるネットワーク分離
  • CloudWatchによる監視設定

IaCを用いることで、
インフラ構築をコードとして管理できることを実感しました。

GitHub

今回使ったコードはこれです

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?