Terraform:RDS
RDS
- RDS
- MySQL, Postgres互換がある
- 1AZあたり2つ設置可能
- 構築手順
- セキュリティグループ
- RDSへのネットワーク接続経路を確保
- サブネットグループ
- RDSの配置箇所を設定
- VPC配下のどのサブネットなのか?複数AZにまたがる配置が可能
- パラメータグループ
- 上記以外のDBオプション設定をここで指定
- RDS作成
- 接続情報(port, name, pw...etc)
- DBインスタンスボリューム
- 設計範囲
- セキュリティグループ
RDS全体のデータ構造と依存関係はこちらです。
RDSインスタンス
👇
パラメータグループ / オプショングループ / サブネットグループ
👇
サブネット
データ型:blockでname, valueが設定できます。
RDSを作成します。
パラメータグループ作成
- resource "aws_db_parameter_group"
- family=DBSの種類を記載
- parameter{ name, value
反映を確認します。
parameter{ name, valueの内容が「Amazon RDS/パラメータグループ」に反映されていればOKです。
オプショングループ作成
※セキュリティグループ??
以下のようにエンジンの種類・バージョンを指定できるみたいですね~
- engine_name = "mysql"
- major_engine_version = "8.0"
「Amazon RDS/オプショングループ」に反映されていればOKです。
サブネットグループ作成
RDSを展開する先としてサブネットグループを作成します。秘密情報(DB)はプライベートサブネットとして保管したいためサブネットグループ内ではプライベートサブネットを指定します。
- resource "aws_db_subnet_group" "適当" {
- name = ""
- subnet_ids = [
- プライベートサブネット1
- プライベートサブネット2
「Amazon RDS/サブネットグループ」に反映されていればOKです。
滅茶苦茶時間かかるなコレ
aws_db_instance.mysql_standalone: Still creating... [8m11s elapsed]
aws_db_instance.mysql_standalone: Still creating... [8m21s elapsed]
aws_db_instance.mysql_standalone: Still creating... [8m31s elapsed]
aws_db_instance.mysql_standalone: Still creating... [8m41s elapsed]
aws_db_instance.mysql_standalone: Still creating... [8m51s elapsed]
aws_db_instance.mysql_standalone: Still creating... [9m1s elapsed]
・・・
Use db_name instead //あああ
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
RDS削除
aws_db_instance.mysql_standalone: Destruction complete after 2m41s
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
踏み台サーバ作成
- 🔓作成
- 踏み台サーバ作成
- 踏み台サーバ内部にMySQLクライアント入れる
- 踏み台サーバ⇒RDS接続確認
構成図
運用監視者 ⇒ [Public Subnet] EC2 踏み台サーバ ⇒ [Private Subnet] RDS
- EC2/キーペアから作成
- 踏み台サーバ作成
- 踏み台サーバにアクセス
\dev> ssh -i ./tmp-dev-keypair.pem ec2-user@パブリック IPv4 アドレス
MySQLクライアントインストール
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
sudo yum install -y mysql-community-client
何故かmysqlコマンドのPATHが通っていない。
$ yum list installed | grep mysql
mysql80-community-release.noarch el7-3 installed
どうやら「2022年1月18日にMySQL8.0.28がリリースされてから、GPGキーの有効期限切れでインストールができないようになっています。」とのことらしい。
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
sudo yum install mysql-community-server -y
バージョン確認できましたね。
mysql --version
mysql Ver 8.0.30 for Linux on x86_64 (MySQL Community Server - GPL)
それでは、踏み台EC2サーバにインストールしたMySQLクライアント(RDBMSクライアント=DBを管理する賢いエンジン)からRDSに接続します。
必要な情報は下記の3点です。
TerraformによるRDS作成時の実行結果がtfstateファイルに出力されていますのでそちらを参照します。
- "type": "aws_db_instance",
- address (xxx.ap-northeast-1.rds.amazonaws.com)
- username
- password
user 👈tfstate・aws_db_instance.username
password 👈tfstate・aws_db_instance.password
address 👈tfstate・aws_db_instance.address
port 👈tfstate・aws_db_instance.port
これらを引数にコマンドを打って接続を試します。
$ mysql -h[address] -P[XXXX] -u[username] -p[password]
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.20 Source distribution
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
よきかな
RDSに生データを登録
デフォルトで登録されているテーブル
- p-info
- p-stats
何も登録されていないテーブル
- p-reply
実行手順
- 仮データをRDSに投入
- DDLの作成
- 独自データ・テーブルをRDSに投入
ローカルデータを踏み台サーバに送信
ローカルのデータ一式をEC2に送信
scp -i ./tmp-dev-keypair.pem ./data.tar.gz ec2-user@パブリック IPv4 アドレス:/home/ec2-user/
data.tar.gz 100% 333KB 7.1MB/s 00:00
踏み台サーバーにアクセス
ssh -i ./tmp-dev-keypair.pem ec2-user@パブリック IPv4 アドレス
受信データを解凍
tar -zxvf ./data.tar.gz
解凍後のデータ一覧を確認
[ec2-user@ip-192-168-1-225 ~]$ ls -l
total 340
drwxrwxr-x 2 ec2-user ec2-user 71 Sep 24 2020 10_xxx
drwxrwxr-x 2 ec2-user ec2-user 68 Sep 24 2020 20_xxx
drwxrwxr-x 2 ec2-user ec2-user 189 Sep 24 2020 30_xxx
-rw-rw-r-- 1 ec2-user ec2-user 341125 Aug 31 12:57 data.tar.gz
-rwxrwxr-x 1 ec2-user ec2-user 71 Feb 13 2021 db.cnf
踏み台サーバを経由してRDSにデータを投入するシェルを実行する
RDSへの接続先設定を編集します
vi dbaccess.cnf
-------------------------------------------------------------------
[client]
user = xxx 👈tfstate・aws_db_instance.username
password = xxx 👈tfstate・aws_db_instance.password
host = xxx 👈tfstate・aws_db_instance.address
port = xxx 👈tfstate・aws_db_instance.port
-------------------------------------------------------------------
反映を確認
cat dbaccess.cnf
次に、MySQLアカウントを発行します。
発行用ディレクトリに移動して、viで中身を編集・確認します
ALTER USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'XXX';
後はシェルを流すだけ
mysql --defaults-extra-file=../dbaccess.cnf < ./alter_user.sql
実行
sh alter_user.sh
次に、テーブルを作成します。
テーブル情報(カラム・型定義・初期値・テーブル制約)を記載したddl.sql
を作成します。
後はシェルを流すだけ
mysql --defaults-extra-file=../dbaccess.cnf < ./ddl.sql
実行
sh create_table.sh
次に、テーブルにデータを挿入していきます。
※データ量が多いとインサートに時間がかかります。
まずはこんなusers.sql
を作成します。
このクエリだと、ユーザ管理テーブルにユーザ名と作成日付が登録されます。
USE `database`
INSERT INTO users VALUES (XXXXXXXX,20220831);
後はシェルを流すだけ
#!/bin/bash
mysql --defaults-extra-file=../dbaccess.cnf < ./users.sql
実行
sh insert_sampledata.sh
RDSでデータが登録されているかを確認
下記情報を参考にMySQLへログインします
user 👈tfstate・aws_db_instance.username
password 👈tfstate・aws_db_instance.password
address 👈tfstate・aws_db_instance.address
port 👈tfstate・aws_db_instance.port
👇
$ mysql -h[address] -P[XXXX] -u[username] -p[password]
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
DBを選択します
mysql> use database
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
テーブルを確認します
mysql> show tables;
+----------------------+
| Tables_in_database |
+----------------------+
| users |
+----------------------+
1 rows in set (0.00 sec)
データを取得します
mysql> select * from t_user limit 1;
+----+------------------+------------------------+
| id | name | created |
| 1 | catA | 2022-08-31 13:28:18 |
+----+------------------+------------------------+
1 rows in set (0.01 sec)
退出します
mysql> exit;
Bye
後片付け
- 踏み台サーバEC2の削除
- キーペアの削除
それでは、 DDLの作成⇒独自データ・テーブルをRDSに投入をやっていきたいと思います。