[Update] วิธีการสร้าง RDS และเชื่อมต่อจาก EC2 บน AWS
สวัสดีครับ 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, 22, xx.xx.xx.xx/32)
Type:ssh
| Source type:My IP
| Source:xx.xx.xx.xx/32
Configure storage
1x:8
GiBgp2
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 จะทำการตั้งค่าดังนี้
หัวข้อ 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 ได้เลยครับ
เลือก Databases
จากเมนูด้านซ้าย
เมื่อเข้ามาหน้าจอ Create database จะทำการตั้งค่าดังนี้
Choose a database creation methodStandard create
Engine options
Engine type: MySQL
Edition: MySQL Community
(Default)
Engine Version: MySQL 8.0.34
(เวอร์ชันปัจจุบัน ณ วันที่เขียนบทความ)
TemplatesProduction
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) ครับ !