[Update] วิธีการสร้าง RDS และเชื่อมต่อจาก EC2 บน AWS

Amazon RDS เป็นบริการที่ได้รับการจัดการที่ช่วยให้ผู้ใช้สามารถตั้งค่า ใช้งาน และปรับขนาดฐานข้อมูลเชิงสัมพันธ์ในระบบคลาวด์ได้อย่างง่ายดาย และสามารถเชื่อมต่อจาก EC2 Instance เพื่อจัดการข้อมูลได้อย่างรวดเร็วครับ

สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ

เราสามารถใช้ RDS ร่วมกับ Service อื่นๆ ที่ต้องการได้ เช่น EC2 Instance เป็นต้น
ครั้งนี้จะมาแนะนำวิธีการสร้าง RDS และเชื่อมต่อจาก EC2 ไปยัง RDS บน AWS ครับ

สำหรับ Resource ที่จะใช้คือ EC2 Instance (Amazon Linux 2023) และ RDS (MySQL)

AWS Service Function
EC2 Instance (Amazon Linux 2023)
RDS Database (MySQL 8.0)

เป้าหมาย

ผมจะทำการสร้าง RDS และ EC2 Instance แล้วเชื่อมต่อเข้าด้วยกันผ่าน Security Group และทำการทดสอบรันคำสั่ง SQL ใน Amazon Linux 2023 ครับ

สิ่งที่ต้องเตรียม

※ EC2 Instance สำหรับเชื่อมต่อกับ RDS

ดูรายละเอียดเกี่ยวกับวิธีการเปิดใช้งาน Amazon Linux 2023 ได้ที่ลิงก์ด้านล่างนี้ครับ

ตัวอย่างการสร้าง EC2 Instance

Region: Singapore

※Launch instances
Name and tags
Name: tinnakorn-ec2-linux (ตั้งชื่อที่ต้องการ)

Application and OS Images (Amazon Machine Image)
Amazon Machine Image (AMI): Amazon Linux 2023 AMI

Instance type
Instance type: t3a.micro (เลือกสเปคตามต้องการ)

Key pair (login)
Key pair name - required: tinnakorn-ec2-linux

Network settings
Firewall (security groups)
Security group name - required: tinnakorn-ec2-linux (ตั้งชื่อที่ต้องการ)
Description - required: tinnakorn-ec2-linux (ป้อนตามต้องการ)
Inbound security groups rules
▼ Security group rule 1 (TCP, 3389, xxx.xxx.xxx.xxx/32)
Type: ssh | Source type: My IP | Source: xxx.xxx.xxx.xxx/32

Configure storage
1x: 8 GiB gp2 Root volume (Default)

Amazon RDS คืออะไร

Amazon Relational Database Service (Amazon RDS) เป็นบริการที่ได้รับการจัดการที่ช่วยให้ผู้ใช้สามารถตั้งค่าใช้งาน และปรับขนาดฐานข้อมูลเชิงสัมพันธ์ในระบบคลาวด์ได้อย่างง่ายดาย บริการนี้จะมอบความจุที่คุ้มค่าและปรับขนาดได้ พร้อมกับจัดการงานการดูแลระบบฐานข้อมูลที่ใช้เวลานาน ปลดปล่อยคุณให้เป็นอิสระเพื่อที่จะสามารถพุ่งความสนใจไปยังแอปพลิเคชันและธุรกิจของคุณได้อย่างเต็มที่

ดูรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้

สร้าง Security Group สำหรับ RDS

ขั้นตอนนี้จะสร้าง Security Group สำหรับใช้กับ RDS โดยใช้ชื่อว่า tinnakorn-rds-mysql

เข้ามาที่ Service EC2 แล้วเลือก Security Groups ในหัวข้อ "▼ Network > Security" จากเมนูด้านซ้าย

คลิก Create security group

เมื่อเข้ามาหน้าจอ Create security group จะทำการตั้งค่าดังนี้

หัวข้อ Basic details
» Security group name: tinnakorn-rds-mysql
» Description: tinnakorn-rds-mysql

หัวข้อ Inbound rules
» Type: MYSQL/Aurora ▼
» ถัดจากช่อง Source ให้ค้นหาและเลือก Security group ของ Instance ตัวอย่างนี้คือ ?︎ tinnakorn-ec2-linux

เมื่อตั้งค่าเสร็จแล้วเลื่อนลงมาด้านล่างสุด คลิก Create security group

สร้าง RDS

ครั้งนี้จะสร้าง RDS (MySQL) เพื่อใช้เชื่อมต่อกับ EC2 Instance

ก่อนอื่นให้เตรียมสิ่งต่อไปนี้ (ข้อมูลนี้เป็นแค่ตัวอย่าง)

  • ชื่อสำหรับ RDS (DB instance identifier): tinnakorn-rds-mysql (ชื่อที่ต้องการ)
  • รหัสผ่านสำหรับ RDS (Master password): PassW0rd (รหัสผ่านที่ต้องการ)

เมื่อเตรียมชื่อและรหัสผ่านแล้ว เริ่มสร้าง RDS ได้เลยครับ

ค้นหา ?︎ RDS เลือก RDS

เลือก Databases จากเมนูด้านซ้าย

คลิก Create database

เมื่อเข้ามาหน้าจอ Create database จะทำการตั้งค่าดังนี้

Choose a database creation method
Standard create

Engine options
Engine type: MySQL
Edition: MySQL Community (Default)
Engine Version: MySQL 8.0.34 (เวอร์ชันปัจจุบัน ณ วันที่เขียนบทความ)

Templates
Production

Availability and durability
Deployment options: Single DB instance

Settings
DB instance identifier: tinnakorn-rds-mysql

▼ Credentials Settings
Master username: admin
Master password: PassW0rd
Confirm master password: PassW0rd

Instance configuration
DB instance class: Burstable classes (includes t classes)
db.t3.micro

ค่าใช้จ่ายสำหรับ DB Instance สามารถตรวจสอบได้ที่ ราคาของ Amazon RDS สำหรับ MySQL
การตรวจสอบครั้งนี้คือ ไปที่หัวข้อ ค่าใช้จ่ายสำหรับ On-Demand DB Instance > RDS สำหรับ MySQL > Single-AZ > รีเจี้ยน เอเชียแปซิฟิก (สิงคโปร์) (ใกล้กับประเทศไทยมากที่สุด) > ค้นหา DB Instance ที่ต้องการตรวจสอบราคา เช่น db.t3.micro

Storage
Storage type: General Purpose SSD (gp2)
Allocated storage: 20 GiB (ความจุต่ำสุด)

Storage autoscaling
✅ Enable storage autoscaling (Default)
Maximum storage threshold: 1000 GiB

หากเปิดใช้งาน Storage autoscaling แล้ว เมื่อ Storage ใกล้จะเต็มแล้วขนาด Storage จะขยายขึ้นโดยอัตโนมัติ และมีการเรียกเก็บเงินเพิ่มขึ้นตามขนาดที่ถูกขยายครับ

Connectivity
VPC security group (firewall): Choose existing
Existing VPC security groups: ลบ default ออก และเลือก Security Group ที่สร้างสำหรับ RDS เช่น tinnakorn-rds-mysql

เมื่อตั้งค่าเสร็จแล้วเลื่อนลงมาด้านล่างสุด คลิก Create database

แล้วคลิกเข้าไปที่ชื่อ DB identifier ของเรา เช่น tinnakorn-rds-mysql

เมื่อเข้ามาที่ DB identifier ของเราแล้ว จะแสดงหน้าจอแบบนี้ ให้รอ DB Instance เปิดใช้งานสักครู่

เมื่อ DB Instance เปิดใช้งานเสร็จแล้ว จะแสดงหน้าจอแบบนี้ (ครั้งนี้ใช้เวลาประมาณ 7 นาที)

เลื่อนลงมาด้านล่าง เลือกแท็บ Connectivity & security แล้วดูที่ Endpoint
เนื่องจาก Endpoint เป็นที่อยู่ที่ใช้ในการเชื่อมต่อไปยัง Database เพื่อดำเนินการต่าง ๆ เช่น การส่งคำสั่ง SQL ดังนั้นเราจะใช้ Endpoint นี้ในการทดสอบเชื่อมต่อจาก EC2 ไปยัง RDS

ติดตั้ง Client MariaDB

เมื่อติดตั้ง Client MariaDB จะทำให้สามารถเชื่อมต่อกับ RDS จาก Amazon Linux 2023 ได้ แต่ไม่สามารถใช้งาน MariaDB Server ได้ !

รันคำสั่งเข้าสู่ระบบในฐานะผู้ใช้ที่มีสิทธิ์ root

sudo su -


รันคำสั่ง Update server ให้เป็นปัจจุบัน

yum update -y


รันคำสั่งติดตั้ง Client MariaDB

yum install mariadb105 -y

ทดสอบการจัดการ Database

เชื่อมต่อจาก EC2 ไปยัง RDS

รันคำสั่งเชื่อมต่อกับฐานข้อมูล RDS จาก EC2 (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
» RDS Endpoint: (-h [your_endpoint_rds])
» Master username: (-u admin)
» Master password: (-p[your_password_rds])

mysql -h [your_endpoint_rds] -u admin -p[your_password_rds]

Output (example)

root@ip-xx-xx-xx-xx:~

[root@ip-xx-xx-xx-xx ~]# mysql -h tinnakorn-rds-mysql.xxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 598
Server version: 8.0.34 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.

MySQL [(none)]>

สร้าง Database

ผมจะทดสอบสร้าง Database ในฐานข้อมูล RDS โดยรันคำสั่งต่อไปนี้

ก่อนอื่นรันคำสั่งเรียกดูข้อมูลใน Database

show databases;

Output (example) จะเห็นว่ามี Database เริ่มต้นของ RDS แสดงแบบนี้

root@ip-xx-xx-xx-xx:~

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.025 sec)

MySQL [(none)]>


รันคำสั่งสร้าง Database โดยเปลี่ยน database_name เป็นชื่อ Database ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ tinnakorn)

CREATE DATABASE database_name;

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [(none)]> CREATE DATABASE tinnakorn;
Query OK, 1 row affected (0.026 sec)

MySQL [(none)]>


รันเรียกดูข้อมูลใน Database อีกครั้ง

show databases;

Output (example) จะเห็นว่ามี Database ที่ชื่อ tinnakorn เพิ่มขึ้นมาแล้ว

root@ip-xx-xx-xx-xx:~

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| tinnakorn          |
+--------------------+
5 rows in set (0.001 sec)

MySQL [(none)]>

สร้าง Table

ผมจะทำการสร้าง Table ใน Database ที่ชื่อ tinnakorn ที่สร้างจากขั้นตอนที่แล้ว

ก่อนอื่นรันคำสั่งเปลี่ยนฐานข้อมูลไปยัง Database ที่เราสร้างขึ้นมา เช่น tinnakorn (เปลี่ยน "database_name" เป็นชื่อ DB ที่สร้างจากขั้นตอนที่แล้ว)

use database_name;

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [(none)]> use tinnakorn;
Database changed
MySQL [tinnakorn]>


รันคำสั่งสร้าง Table โดยเปลี่ยน table_name เป็นชื่อ Table ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ test)

create table table_name (id int, name varchar(30));

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [tinnakorn]> create table table_name (id int, name varchar(30));
Query OK, 0 rows affected (0.080 sec)

MySQL [tinnakorn]>


รันคำสั่งเพิ่มข้อมูลลงในตารางของฐานข้อมูล โดยเปลี่ยน table_name เป็นชื่อ Table ที่สร้างจากขั้นตอนที่แล้ว (ตัวอย่างนี้จะเพิ่มข้อมูลลงใน Table ที่ชื่อ test)

insert into table_name value (1, 'test');

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [tinnakorn]> insert into table_name value (1, 'test');
Query OK, 1 row affected (0.007 sec)

MySQL [tinnakorn]>


รันคำสั่งแสดงข้อมูลในตาราง โดยเปลี่ยน table_name เป็นชื่อ Table ที่สร้างเมื่อสักครู่นี้ (ตัวอย่างนี้จะแสดงข้อมูลของ Table ที่ชื่อ test)

select * from table_name;

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [tinnakorn]> select * from table_name;
+------+------+
| id   | name |
+------+------+
|    1 | test |
+------+------+
1 row in set (0.002 sec)

MySQL [tinnakorn]>


รันคำสั่งออกจากการเชื่อมต่อกับฐานข้อมูล RDS

quit

Output (example)

root@ip-xx-xx-xx-xx:~

MySQL [tinnakorn]> quit
Bye
[root@ip-xx-xx-xx-xx ~]#

การลบ AWS Resource

AWS Resource ที่จะลบทั้งหมดมีดังนี้

  • RDS
    • Database
  • EC2
    • Instance
    • Security Groups 2 ตัว (ที่ใช้สำหรับ EC2 และ RDS)
    • Key Pair

ผมจะแนะวิธีการลบ Resource ต่างๆ โดยลบเรียงตามที่เขียนไว้ด้านบนนี้

การลบ Database ใน RDS

ผมจะเริ่มลบที่ Database ก่อน เนื่องจากค่อนข้างใช้เวลาในการลบ
ก่อนที่เราจะลบ Database เราต้องตั้งค่า Deletion protection ก่อน จึงจะสามารถลบได้

เข้ามาที่หน้าจอ "RDS > Database" ของเรา แล้วคลิก Modify

เลื่อนลงมาด้านล่างสุดมาที่หัวข้อ Deletion protection
แล้ว Uncheck ☐ Enable deletion protection ออกให้เหมือนกับรูปภาพ และคลิก Continue

เลือก Apply immediately และคลิก Modify DB instance

คลิก Action ▼ แล้วเลือก Delete

ทำการ Uncheck Create final snapshot? และ Retain automated backups ออกไป แล้วจะมีตัวเลือกเพิ่มขึ้นมา

จากนั้น Check ✅ I acknowledge that upon instance deletion,... ที่เพิ่มขึ้นมา
แล้วป้อน delete me และคลิก Delete ตามรูปภาพ

แล้ว Status จะแสดงเป็น ✕ Deleting ให้รอสักครู่จนกว่า RDS ของเราจะหายไป (ครั้งนี้ใช้เวลาประมาณ 5 นาที)

การ Terminate Instances, ลบ Key Pair และลบ Security Group ใน EC2

ดูตัวอย่างการ Terminate Instances, ลบ Key Pair และลบ Security Group ได้ที่ลิงก์ด้านล่างนี้

สรุป

เราสามารถเชื่อมต่อกับฐานข้อมูล RDS จาก EC2 Instance (Amazon Linux 2023) โดยใช้ Client MariaDB และจัดการ Database ตามที่เราต้องการได้อย่างง่ายดายครับ

ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ

POP จากบริษัท Classmethod (Thailand) ครับ !

บทความที่เกี่ยวข้อง