今回はTerraformを使用して、RDS(PostgreSQL 15)の作成から確認、削除までを自動化します。
0. 前提
今回の操作では、TerraformとAWS CLIを使用します。
環境構築については、過去の記事を参照してください。
今回のAWSリソース構成は下記のとおりです。
| 項目 | 設定 |
|---|---|
| リージョン | 東京(ap-northeast-1) |
| VPC | デフォルトVPC |
| DBエンジン | PostgreSQL 15 |
| インスタンスタイプ | db.t3.micro |
| ストレージ | 20 GiB(gp3) |
| Multi-AZ | 無効 |
| 外部公開 | 無効 |
| DBパスワード | Secrets Managerで管理 |
デフォルトVPCとサブネットは既存のものを利用します。
前記事でも触れましたが、RDSは利用料金が発生するため、今回はMulti-AZを無効にした学習用の構成とします。
1. AWSへログイン
まず、ターミナルを開いてAWS CLIからAWSへログインします。
aws login --profile personal --region ap-northeast-1
Terraformでも同じプロファイルを使用するように設定します。
export AWS_PROFILE=personal
2. Terraformの設定ファイルを作成
作業用ディレクトリとmain.tfを作成します。
mkdir -p ~/terraform-rds-study && cd ~/terraform-rds-study && touch main.tf
main.tfには、AWS Provider、セキュリティグループ、DBサブネットグループ、RDSなどを定義します。
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.23"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
# デフォルトVPCを使用
data "aws_vpc" "default" {
default = true
}
# デフォルトVPCのサブネットを取得
data "aws_subnets" "default" {
filter {
name = "vpc-id"
values = [data.aws_vpc.default.id]
}
filter {
name = "default-for-az"
values = ["true"]
}
}
# RDSのセキュリティグループ
resource "aws_security_group" "rds" {
name_prefix = "terraform-study-rds-"
description = "Study RDS - no inbound access"
vpc_id = data.aws_vpc.default.id
}
# RDSで使用するサブネットグループ
resource "aws_db_subnet_group" "study" {
name_prefix = "terraform-study-"
subnet_ids = data.aws_subnets.default.ids
tags = {
Name = "terraform-study-db-subnets"
}
}
# PostgreSQL 15のRDSインスタンス
resource "aws_db_instance" "study" {
identifier = "terraform-study-postgres"
engine = "postgres"
engine_version = "15"
instance_class = "db.t3.micro"
allocated_storage = 20
storage_type = "gp3"
storage_encrypted = true
db_name = "appdb"
username = "appadmin"
manage_master_user_password = true
db_subnet_group_name = aws_db_subnet_group.study.name
vpc_security_group_ids = [aws_security_group.rds.id]
publicly_accessible = false
port = 5432
multi_az = false
backup_retention_period = 1
auto_minor_version_upgrade = true
deletion_protection = false
skip_final_snapshot = true
tags = {
Name = "terraform-study-postgres"
}
}
# RDSの接続先を出力
output "rds_host" {
value = aws_db_instance.study.address
}
# Secrets ManagerのARNを出力
output "rds_secret_arn" {
value = aws_db_instance.study.master_user_secret[0].secret_arn
}
上記ソースの内容は、下記のとおりです。
| 設定 | 内容 |
|---|---|
| engine | PostgreSQLを指定 |
| instance_class | DBインスタンスの性能を指定 |
| allocated_storage | ストレージ容量を指定 |
| storage_encrypted | ストレージを暗号化 |
| manage_master_user_password | パスワードをAWS側で管理 |
| publicly_accessible | インターネットへの公開を無効化 |
| multi_az | Multi-AZ構成を無効化 |
| skip_final_snapshot | 削除時の最終スナップショットを省略 |
DBのパスワードは直接記述せず、AWS Secrets Managerで管理するようにしています。
また、今回は構築確認のみ行うため、セキュリティグループにはインバウンドルールを設定していません。
3. RDSインスタンスを作成
最初にTerraformを初期化します。
terraform init
続いて、設定内容を検証します。
terraform validate
問題がなければ、RDSインスタンスを作成します。
terraform apply
作成予定のリソースが表示されるため、内容を確認してyesを入力します。
正常に完了すると、Apply complete!と表示されます。
4. RDSの作成結果を確認
AWS CLIから作成したRDSインスタンスの情報を確認します。
aws rds describe-db-instances --db-instance-identifier terraform-study-postgres --region ap-northeast-1 --query 'DBInstances[0].[DBInstanceStatus,Engine,EngineVersion,PubliclyAccessible]' --output table
実行結果で下記の内容を確認します。
| 項目 | 確認内容 |
|---|---|
| DBInstanceStatus | available |
| Engine | postgres |
| EngineVersion | 15.x |
| PubliclyAccessible | False |
availableと表示されていれば、RDSインスタンスは利用可能な状態です。
続いて、Terraformの出力からRDSの接続先を取得します。
terraform output -raw rds_host
RDSのエンドポイントが表示されればOKです。
また、下記のコマンドでSecrets ManagerのARNを確認できます。
terraform output -raw rds_secret_arn
これで、TerraformによるRDSの構築と作成結果の確認ができます。
5. RDSインスタンスを削除
確認が完了したら、今回作成したAWSリソースを削除します。
terraform destroy
確認画面でyesを入力すると、Terraformで作成したRDSやセキュリティグループなどのリソースが削除されます。
正常に完了すると、Destroy complete!と表示されます。
なお、今回は学習用のため、RDSの削除保護を無効にし、最終スナップショットも保存しない設定にしています。
削除するとデータは失われるため、本番環境ではバックアップや削除保護を設定する必要があります。
6. まとめ
今回はTerraformを使用して、RDS(PostgreSQL 15)の作成から確認、削除までを自動化する構成を作成しました。
Terraformで設定を記述しておくことで、RDSや関連リソースをまとめて管理でき、同じ構成を再作成できることが分かりました。
- 閲覧数 49
コメントを追加