皆様こんにちは。
Terraformを利用して、AWSで高可用性アーキテクトの構築をしていきます。
今回はRDSを構築していきます。

1.高可用性アーキテクト構築目次

目次はこちら

2.RDSの概要

Amazon Relational Database Service (Amazon RDS) は、AWS クラウド でリレーショナルデータベースを簡単にセットアップし、運用し、スケーリングすることのできるウェブサービスです。業界スタンダードのリレーショナルデータベース向けに、費用対効果に優れたエクステンションを備え、一般的なデータベース管理タスクを管理します。

引用元:Amazon Relational Database Service (Amazon RDS) とは

AWSが提供するデータベースサービスはたくさんの種類がありますが、データベースの2大アーキテクチャとして、RDB型、NoSQL型に分類できます。「RDS」「Redshift」はRDB型で、「DynamoDB」「ElastiCashe」「Neptune」「DocumentDB」「Keyspaces」はNoSQL型です。
ユースケースに応じて適切に使い分けることが重要です。

3.構成図

下記は今回作成するRDSのマルチAZ構成図です。

障害発生時にフェイルオーバーで高可用性を実現します。

①.障害が発生し、1台目のRDSが利用できなくなります。
②.フェイルオーバー(自動的に待機システムに切り替える)によって、処理を2台目のRDSに引き継ぎます。

4.RDSの作成

RDS作成の全体のソースコードは下記の通りです。

#----------------------------------------
# RDSの構築
#----------------------------------------

# サブネットグループの作成
resource "aws_db_subnet_group" "higa_dbsubnet" {
  name       = "higa_dbsubnet"
  subnet_ids = [aws_subnet.higa-Private-subnet-3a.id, aws_subnet.higa-Private-subnet-4c.id]

  tags = {
    Name = "higa-_dbsubnet"
  }
}

#RDSの作成
resource "aws_db_instance" "higa-rds" {
  identifier             = "higa-rds"
  allocated_storage      = 20
  engine                 = "mysql"
  engine_version         = "8.0.20"
  instance_class         = "db.t3.micro"
  username               = "higa"
  password               = "password"
  multi_az               = true
  db_subnet_group_name   = aws_db_subnet_group.higa_dbsubnet.name
  vpc_security_group_ids = [aws_security_group.higa-RDS-sg.id]

  storage_encrypted = true
  kms_key_id        = "arn:aws:kms:ap-southeast-1:アカウントID:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c"
  //バックアップを保持する日数
  backup_retention_period = 0

  //DB削除前にスナップショットを作成しない
  skip_final_snapshot = true

  tags = {
    name = "higa-rds"
  }
}

4-1.サブネットグループの作成

サブネットは、VPC の IP アドレス範囲のセグメントで、セキュリティや運用上のニーズに基づいてリソースをグループ化するために指定します。DB サブネットグループは VPC に作成するサブネット (通常はプライベート) のコレクションで、DB インスタンス用に指定します。DB サブネットグループを使用することにより、CLI または API を使用して DB インスタンスを作成するときに、特定の VPC を指定することができます。コンソールを使用する場合は、使用する VPC とサブネットを選択できます。

引用元:DB サブネットグループの使用

DBサブネットグループは作成したVPC(higa-vpc)を指定するために作成します。

まずはサブネットグループを作成していきます。
ソースコードは下記の通りです。(5~13行目)

# サブネットグループの作成
resource "aws_db_subnet_group" "higa_dbsubnet" {
  name       = "higa_dbsubnet"
  subnet_ids = [aws_subnet.higa-Private-subnet-3a.id, aws_subnet.higa-Private-subnet-4c.id]

  tags = {
    Name = "higa-_dbsubnet"
  }
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
name higa_dbsubnet 設定したいサブネットグループの名前を入力
subnet_ids [aws_subnet.higa-Private-subnet-3a.id, aws_subnet.higa-Private-subnet-4c.id] 作成した2つのプライベートサブネットを指定
tags Name = "higa-_dbsubnet" 設定したいタグを入力

これでRDSのサブネットグループの作成ができました。

4-2.RDSインスタンスの作成

次に、RDSインスタンスを作成していきます。
ソースコードは下記の通りです。(15~39行目)

#RDSの作成
resource "aws_db_instance" "higa-rds" {
  identifier                    = "higa-rds"
  allocated_storage             = 20
  engine                        = "mysql"
  engine_version                = "8.0.20"
  instance_class                = "db.t3.micro"
  username                      = "higa"
  password                      = "xxxx"
  multi_az                      = true
  db_subnet_group_name          = aws_db_subnet_group.higa_dbsubnet.name
  vpc_security_group_ids        = [aws_security_group.higa-RDS-sg.id]

  storage_encrypted = true
  kms_key_id        = "arn:aws:kms:ap-southeast-1:アカウントID:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c"
  //バックアップを保持する日数
  backup_retention_period = 0

  //DB削除前にスナップショットを作成しない
  skip_final_snapshot = true

  tags = {
    name = "higa-rds"
  }
}

設定項目は下記の通りです。

使用するオプション 設定値 説明
identifier higa-rds DBインスタンス識別子を設定
allocated_storage 20 ギガバイト単位で指定されたストレージの割り当てサイズを指定
今回はコストを考慮して最小値を設定
engine mysql 使用したいDBエンジンを 設定
engine_version 8.0.20 設定したいエンジンのversionを設定
instance_class db.t3.micro DBインスタンスタイプを設定
username higa 設定したいマスターユーザー名を設定
password xxxx DBのパスワードを設定
multi_az true 高可用性のためマルチAZを有効化
db_subnet_group_name aws_db_subnet_group.higa_dbsubnet.name 作成したサブネットグループのIDを指定
vpc_security_group_ids [aws_security_group.higa-RDS-sg.id] 作成したRDSのSGのIDを指定
storage_encrypted true DBインスタンスの暗号化を有効
kms_key_id arn:aws:kms:ap-southeast-1:アカウントID:key/e0b1110b-a12e-4a63-a87e-5b838d15ab4c 作成した暗号化鍵のIDを指定
backup_retention_period 0 バックアップを保持する日数を設定
skip_final_snapshot true DB削除前にスナップショットを作成しないように設定
tags name = "higa-rds" 設定したいタグを入力

これでRDSインスタンスの作成ができました。

5.検証

まず、SSHでEC2インスタンス(higa-ec2-1)に接続し、下記コマンドでRDSに接続します。EC2はこちらで作成
mysql -h エンドポイント -P 3306 -u ユーザー名 -p データベース名

下記のようなパスワード入力画面でパスワードを入力します。
Enter password:

正しいパスワードが入力できたら下記のような画面が表示されます。

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 76
Server version: 8.0.20 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

これでRDSに接続できました。

6.まとめ

RDSの設定項目は多く、コード実行後に時間がかかるため、訂正に時間がかかりました。
RDSインスタンス作成時に何度かエラーが発生しましたが、エラー文をdeepLで調べ、公式ドキュメントで設定オプションを「Ctrl + F」で調べることで、スムーズに解決することができました。
エラー解決力は向上していると実感しています。

7.参考文献

Last modified: 2022-06-24

Author