Closed22

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.

踏み台サーバ作成

  1. 🔓作成
  2. 踏み台サーバ作成
  3. 踏み台サーバ内部にMySQLクライアント入れる
  4. 踏み台サーバ⇒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キーの有効期限切れでインストールができないようになっています。」とのことらしい。
https://freeheroblog.com/ec2-install-mysql/

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アカウントを発行します。
https://dev.mysql.com/doc/refman/8.0/ja/alter-user.html

発行用ディレクトリに移動して、viで中身を編集・確認します

alter_user.sql
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を作成します。

後はシェルを流すだけ

sh create_table.sh
mysql --defaults-extra-file=../dbaccess.cnf < ./ddl.sql

実行

sh create_table.sh

次に、テーブルにデータを挿入していきます。

※データ量が多いとインサートに時間がかかります。

まずはこんなusers.sqlを作成します。
このクエリだと、ユーザ管理テーブルにユーザ名と作成日付が登録されます。

users.sql
USE `database`

INSERT INTO users VALUES (XXXXXXXX,20220831);

後はシェルを流すだけ

insert_sampledata.sh
#!/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に投入をやっていきたいと思います。

このスクラップは5ヶ月前にクローズされました
ログインするとコメントできます