はじめに
本記事ではTerraformを用いてAWSの3層構成を構築してみました。
インフラの構成は以下です。
- VPC
- Public / Private Subnet
- Application Load Balancer
- EC2
- RDS
- CloudWatch Alarm
IaC(Infrastructure as Code)の学習として
Terraform moduleを用いて構成を作成しました。
システム構成
本来の本番構成では、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
今回使ったコードはこれです
