RDSの検証環境を気軽に作成、利用したいと思い、terraformのコードを作成しました。terraform apply
には約8分。terraform destroy
には約4分かかります。
こちらのコードを実行するには、下記記事で作成したVPCやサブネットのidが必要となります。【Terraform】AWSのネットワークを構築する
参考動画
ファイル構成
ファイル構成は以下のようになります。
01_network
02_database
├── config.ty
├── variables.tf
└── rds.tf
データベースの作成には前回作成した01_network
のoutputs.tfの情報を使用します。
01_networkの構築参考: 【Terraform】AWSのネットワークを構築する
config.ty
terraformを使用するための基本設定です。
data "terraform_remote_state"
を設定すると、前回構築した01_network
の情報をS3に保存したterraform.tfstate
ファイルから読み込み、使用することができます。
terraform {
required_version = "~> 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
random = {
source = "hashicorp/random"
version = "~> 3.0"
}
}
# S3にterraform.tfstateを保存する設定
backend "s3" {
# backetは事前に作成しておく必要がある
bucket = "tfstate-lab-20220417"
key = "aws/02_database/terraform.tfstate"
region = "ap-northeast-1"
}
}
provider "aws" {
region = var.region
}
# 事前に作成しておいたVPCやサブネットの情報をS3に保存したtfstateファイルから取得する
data "terraform_remote_state" "network" {
backend = "s3"
config = {
bucket = "tfstate-lab-20220417"
key = "aws/01_network/terraform.tfstate"
region = "ap-northeast-1"
}
}
variables.tf
rds.tfで使用する変数の設定を行なっています。
variable "project" {
default = "test"
}
variable "enviroment" {
default = "lab"
}
variable "create_date" {
default = "20220416"
}
rds.tf
RDSでmysqlを構築している部分です。
ソースが長いので、各設定の説明はコメントて記述しています。
#----------------------------------------
# RDS parameter group
#----------------------------------------
resource "aws_db_parameter_group" "mysql_parameter_group" {
name = "${var.project}-${var.enviroment}-mysql-param-standalone"
family = "mysql8.0"
# データベースに設定するパラメーター
parameter {
name = "character_set_database"
value = "utf8mb4"
}
parameter {
name = "character_set_server"
value = "utf8mb4"
}
}
#----------------------------------------
# RDS option group
#----------------------------------------
resource "aws_db_option_group" "mysql_option_group" {
name = "${var.project}-${var.enviroment}-mysql-option-standalone"
engine_name = "mysql"
major_engine_version = "8.0"
}
#----------------------------------------
# RDS subnet group
#----------------------------------------
resource "aws_db_subnet_group" "mysql_subnet_group" {
name = "${var.project}-${var.enviroment}-mysql-subnet-standalone"
# subnetの設定
subnet_ids = [
# subnetの設定(01_networkのoutputs.tfの情報を利用)
data.terraform_remote_state.network.outputs.private_subnet_1a_id,
data.terraform_remote_state.network.outputs.private_subnet_1c_id
]
tags = {
Name = "${var.project}-${var.enviroment}-mysql-option-standalone"
Project = "${var.project}"
Env = "${var.enviroment}"
}
}
#----------------------------------------
# RDS instance
#----------------------------------------
# ランダム文字列の初生成時はinitが必要
resource "random_string" "db_passwrod" {
length = 16
special = false
}
# DBの作成(前回の作成時間:8m10s、削除時間:3m55s)
resource "aws_db_instance" "mysql_standalone" {
# 使用するDBを設定
engine = "mysql"
# 使用するDBのバージョンを設定
engine_version = "8.0.20"
# dbの名前(任意)
identifier = "${var.project}-${var.enviroment}-mysql-standalone"
# dbユーザー名
username = "admin"
# パスワード。上記で生成したランダムな文字列を設定
password = random_string.db_passwrod.result
# インスタンスクラスの設定
instance_class = "db.t2.micro"
# ストレージの大きさ。デフォルトのサイズ(GB)を設定
allocated_storage = 20
# ストレージの自動拡張サイズ(GB)を設定
max_allocated_storage = 50
# ストレージタイプ。デフォルトはgp2
storage_type = "gp2"
# ストレージの暗号化を行うかどうか設定
storage_encrypted = false
# マルチAZの設定を行うかどうか設定する
multi_az = false
# マルチAZを行わない場合は、DBの配置先を指定する
availability_zone = "ap-northeast-1a"
# サブネットグループを設定する(上記で作成したもの)
db_subnet_group_name = aws_db_subnet_group.mysql_subnet_group.name
# セキュリティグループの設定をする(01_networkのoutputs.tfの情報を利用)
vpc_security_group_ids = [ data.terraform_remote_state.network.outputs.aws_security_group_db_id ]
# publicアクセスを許可するか設定
publicly_accessible = false
# ポート番号を設定
port = 3306
# データベース名を設定
name = "labDB"
# パラメーターグループ名を設定(上記で作成したもの)
parameter_group_name = aws_db_parameter_group.mysql_parameter_group.name
# オプショングループ名を設定(上記で作成したもの)
option_group_name = aws_db_option_group.mysql_option_group.name
# -- DBの管理設定。maintenance_windowは、backup_windowの後の時間に設定する
# バックアップを行う時間を設定
backup_window = "04:00-05:00"
# バックアップの保存期間(日)を設定
backup_retention_period = 0
# DBインスタンスまたはクラスターのエンジンバージョンの更新、OS更新があった場合に更新作業を行う時間を設定
maintenance_window = "Mon:05:00-Mon:08:00"
# 自動的にDBのマイナーバージョンアップグレードを行うか設定する
auto_minor_version_upgrade = false
# -- 削除設定
# 削除操作を受付るかを指定。削除させない場合はtrue
deletion_protection = false
# インスタンス削除時にスナップショットをとるかを設定
skip_final_snapshot = true
# DBインスタンスが削除されたときに保存するスナップショットの名前 skip_final_snapshot = falseの時に指定
final_snapshot_identifier = "final-snapshot-lab"
# データベースの変更をすぐに適用するか、次のメンテナンスウィンドウ中に適用するかを指定する
apply_immediately = true
# -- タグの設定
tags = {
Name = "${var.project}-${var.enviroment}-mysql-option-standalone"
Project = "${var.project}"
Env = "${var.enviroment}"
}
}