TerraformでRDS(PostgreSQL 15)を構築してみた

 

  •  
  • Facebookでシェア  
MAXIMUM が に投稿

タグ

今回は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や関連リソースをまとめて管理でき、同じ構成を再作成できることが分かりました。

コメントを追加

プレーンテキスト

  • HTMLタグは利用できません。
  • 行と段落は自動的に折り返されます。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
CAPTCHA
この質問はあなたが人間の訪問者であるかどうかをテストし、自動化されたスパム送信を防ぐためのものです。