การเชื่อมต่อจาก PHP บน AWS EC2 Amazon Linux 2023 ไปยัง RDS
สวัสดีครับ POP จากบริษัท Classmethod (Thailand) ครับ
ครั้งนี้จะมาแนะนำเกี่ยวกับการเชื่อมต่อจาก PHP บน AWS EC2 Amazon Linux 2023 ไปยัง RDS
เป้าหมายในการทำ
จะเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx และสร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าเว็บไซต์ครับ
สิ่งที่ต้องมี
หมายเหตุ: หากเจอบทความที่ทำไปแล้วให้ข้ามไปได้เลยครับ
สิ่งที่ต้องสร้างเตรียมไว้ในหัวข้อนี้
- ติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- เพิ่ม HTTP ใน Security Group ของ EC2
- สร้าง RDS
ติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
ดูตัวอย่างการสร้าง Amazon Linux 2023 ได้ที่ลิงก์บทความด้านล่างนี้ (ลิงก์บทความด้านล่างนี้เป็นแค่ตัวอย่าง ซึ่งมีการตั้งค่าบางส่วนที่แตกต่างกัน แนะนำให้ดู ตัวอย่างการสร้าง EC2 Instance ประกอบด้วย)
ตัวอย่างการสร้าง EC2 Instance
Region:
Singapore
※Launch instances
Name and tags
Name:tinnakorn-test-ec2
(ตั้งชื่อที่ต้องการ)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-test-ec2
(ตัวอย่างนี้จะเลือกเป็น.ppk
)
Network settings
Firewall (security groups)
Security group name - required:tinnakorn-test-ec2
(ตั้งชื่อที่ต้องการ)
Description - required:tinnakorn-test-ec2
(ป้อนตามต้องการ)
Inbound security groups rules
Security group rule 1 (TCP, 22, xx.xx.xx.xx/32)
Type:ssh
| Source type:My IP
| Source:xxx.xxx.xxx.xxx/32
Security group rule 2 (TCP, 0, 0.0.0.0/0)
Type:HTTP
| Source type:Anywhere
| Source:0.0.0.0/0
(ในส่วนนี้ถ้าเพิ่ม HTTP ในขณะที่สร้าง Instance ให้ข้ามขั้นตอน การเพิ่ม HTTP ใน Security Group ของ EC2 ไปได้เลยครับ)Configure storage
1x:8
GiBgp2
Root volume (Default)
เพิ่ม HTTP ใน Security Group ของ EC2
ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้เท่านั้น: การเพิ่ม HTTP ใน Security Group ของ EC2
สร้าง RDS
เราสามารถใช้ RDS เป็น Engine type ที่ต้องการได้ หรือจะทำการติดตั้ง MySQL ใน Amazon Linux ก็ได้เช่นกัน
แต่ครั้งนี้จะสร้าง RDS เป็น Engine type MySQL
เพื่อใช้เชื่อมต่อกับ EC2 Instance
ให้ทำการสร้าง RDS ตามลิงก์ด้านล่างนี้ได้เลย (ทำเฉพาะหัวข้อที่ระบุไว้ด้านล่างนี้เท่านั้น)
ตัวอย่างตั้งค่าการสร้าง RDS (MySQL)
※สร้าง Security Group สำหรับ RDS (MySQL)
Basic details
Security group name:tinnakorn-test-rds
(ตั้งชื่อที่ต้องการ)
Description:tinnakorn-test-rds
(ป้อนตามต้องการ)Inbound rules
Type:MYSQL/Aurora
| Source:Custom
|tinnakorn-test-ec2
(เลือก Security Group ที่ต้องการให้เชื่อมต่อเข้ามา ครั้งนี้คือ tinnakorn-test-ec2)※สร้าง RDS (MySQL)
Choose a database creation method◎ Standard create
Engine options
Engine type:MySQL
Edition:MySQL Community
Engine Version:MySQL 8.0.35
Templates
◎ Production
Availability and durability
Deployment options:Single DB instance
Settings
DB instance identifier:tinnakorn-test-rds
▼ Credentials Settings
Master username:admin
Credentials management:Self managed
Master password:PassW0rd
(รหัสผ่านนี้เป็นแค่ตัวอย่าง ให้กำหนดรหัสผ่านที่ต้องการ)
Confirm master password:PassW0rd
Instance configuration
DB instance class:◎ Burstable classes (includes t classes)
db.t3.micro
Storage
Storage type:General Purpose SSD (gp2)
Allocated storage:20
▼ Storage autoscaling✅ Enable storage autoscaling
Connectivity
Existing VPC security groups: ✅ tinnakorn-test-rds (เลือก Security Group ที่สร้างสำหรับ RDS (MySQL))
เมื่อทำขั้นตอน สิ่งที่ต้องมี เสร็จเรียบร้อยแล้ว กลับมาที่โปรแกรม PuTTY แล้วเริ่มทำ การติดตั้ง MariaDB ในขั้นตอนถัดไปได้เลยครับ
ติดตั้ง Client MariaDB
เราสามารถเชื่อมต่อ RDS จาก Amazon Linux 2023 ได้เพียงแค่ติดตั้ง MariaDB Client อย่างไรก็ตาม การติดตั้งแค่คำสั่งนี้เพียงอย่างเดียวไม่ได้รวมการติดตั้ง MariaDB Server ดังนั้นจึงไม่สามารถเชื่อมต่อกับ MariaDB Server บน EC2 ได้
รันคำสั่งติดตั้ง Client MariaDB
yum install mariadb105 -y
ทดสอบเชื่อมต่อจาก Instance ไปยัง RDS
เราจะเชื่อมต่อจาก Instance ไปยัง RDS
รันคำสั่ง MySQL เชื่อมต่อจาก Instance ไปยัง RDS (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
・Endpoint RDS: (-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
[root@ip-xx-xx-xx-xx ~]# mysql -h tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pPassW0rd
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 74
Server version: 8.0.36 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 MySQL โดยรันคำสั่งต่อไปนี้
ก่อนอื่นรันคำสั่งเรียกดูข้อมูลใน Database แล้วจะเห็นว่ามี Database เริ่มต้นของ RDS MySQL แสดงแบบนี้
show databases;
Output
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.002 sec)
MySQL [(none)]>
รันคำสั่งสร้าง Database โดยเปลี่ยน database_name
เป็นชื่อ Database ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ tinnakorn
)
CREATE DATABASE database_name;
รันคำสั่งเรียกดูข้อมูลใน Database อีกครั้ง จะเห็นว่ามีชื่อ Database ที่เราสร้างแสดงขึ้นมา
show databases;
Output
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
MySQL [(none)]> use tinnakorn;
Database changed
MySQL [tinnakorn]>
รันคำสั่งสร้าง Table โดยเปลี่ยน table_name
เป็นชื่อ Table ที่ต้องการ (ตัวอย่างนี้ใช้ชื่อ test
)
create table table_name (id int, message varchar(255));
รันคำสั่งเพิ่มข้อมูล [id: 1
, message: text1
| id: 2
, message: text2
] ลงใน Table "test" ที่สร้างจากขั้นตอนที่แล้ว และเรียกดูข้อมูล (สามารถรันคำสั่งพร้อมกันได้เลย)
insert into test values (1, "text1"); insert into test values (2, "text2"); select * from test;
Output
MySQL [tinnakorn]> insert into test values (1, "text1");
Query OK, 1 row affected (0.004 sec)
MySQL [tinnakorn]> insert into test values (2, "text2");
Query OK, 1 row affected (0.003 sec)
MySQL [tinnakorn]> select * from test;
+------+---------+
| id | message |
+------+---------+
| 1 | text1 |
| 2 | text2 |
+------+---------+
2 rows in set (0.001 sec)
MySQL [tinnakorn]>
แล้วรันคำสั่งออกจากการเชื่อมต่อกับฐานข้อมูล RDS
quit
เมื่อจัดการ Database เสร็จแล้ว ทำขั้นตอนถัดไปได้เลย
เรียกใช้ PHP 8.2 โดยใช้ Nginx ใน EC2 (Amazon Linux 2023) บน AWS
ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้ (หากเจอหัวข้อที่ทำไปแล้วข้ามไปได้เลย)
เมื่อติดตั้ง PHP เสร็จแล้ว จำเป็นต้องติดตั้ง MySQL Improved (MySQLi) เพิ่มเติมด้วยครับ
ติดตั้ง MySQL Improved Extension
MySQLi (MySQL Improved) เป็นส่วนขยายของ PHP ที่ช่วยให้ PHP เชื่อมต่อและทำงานกับฐานข้อมูล MySQL ได้ ส่วนขยายนี้มีฟังก์ชันและความสามารถที่มากกว่า MySQL extension ที่ใช้กับ PHP 5.5.0 ขึ้นไป
เมื่อติดตั้ง MariaDB Server เสร็จแล้ว รันคำสั่งติดตั้ง MySQLi ตามนี้
yum install php-mysqli -y
ดูรายละเอียดเกี่ยวกับ MySQLi เพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
MySQL Improved Extension
ตรวจสอบและสร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนเว็บไซต์
ขั้นตอนนี้จะตรวจสอบข้อมูลบนหน้าเว็บไซต์ในหน้า "info.php" เบื้องต้น และสร้างโปรแกรมที่ชื่อ "list.php" ใช้สำหรับแสดงข้อมูล MySQL บนหน้าเว็บไซต์ที่เพิ่มข้อมูลลงใน Database ไปก่อนหน้านี้
ตรวจสอบ MySQL บนหน้าเว็บไซต์
ก่อนอื่นผมจะแนะนำวิธีตรวจสอบ MySQL บนหน้าจอเว็บไซต์ในหน้า "info.php" เบื้องต้นก่อนครับ
กลับมาที่หน้าเว็บไซต์ [Public IPv4 address]/info.php
แล้วกดปุ่ม Ctrl + F
ที่แป้นพิมพ์ แล้วจะมีช่องให้ใส่ข้อความแสดงขึ้นมาด้านขวาบน จากนั้นให้พิมพ์ mysqli
+ Enter แล้วเราจะเห็นคำที่เราค้นหาแสดงขึ้นมา ซึ่งเราสามารถตรวจสอบข้อมูลเบื้องต้นเกี่ยวกับ MySQL ได้ที่นี่
สร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าเว็บไซต์
กลับมาที่โปรแกรม PuTTY แล้วรันคำสั่งสร้างโปรแกรมในไฟล์ "list.php"
vi list.php
เมื่อเข้ามาที่ไฟล์ "list.php" แล้ว กดปุ่ม i
เพื่อทำการแก้ไข จากนั้นคัดลอก Code ด้านล่างนี้วางลงที่นี่
แล้วเปลี่ยนข้อมูล [$db_host, $db_name, $db_user, $db_password
] ให้เป็นของคุณ
・$db_host: Endpoint RDS (เมื่อสร้าง RDS เสร็จก็จะได้ Endpoint มา ก็ให้คัดลอก Endpoint มาใส่ที่นี่)
・$db_name: Database Name RDS
・$db_user: Master username
・$db_password: Master password
<html><body> <?php $db_host = '[your_endpoint_rds]'; $db_port = '3306'; $db_name = '[your_database_name]'; $db_user = 'admin'; $db_password = '[your_password_rds]'; $con = mysqli_connect($db_host, $db_user, $db_password, $db_name); $con->set_charset('utf8mb4'); $sql = "SELECT * FROM test"; if ($result = mysqli_query($con, $sql)) { while ($obj = mysqli_fetch_object($result)) { echo "$obj->id $obj->message<br>\n"; } mysqli_free_result($result); } mysqli_close($con); ?>
Output
<html><body>
<?php
$db_host = 'tinnakorn-test-rds.xxxxxxxx.ap-southeast-1.rds.amazonaws.com';
$db_port = '3306';
$db_name = 'tinnakorn';
$db_user = 'admin';
$db_password = 'PassW0rd';
$con = mysqli_connect($db_host, $db_user, $db_password, $db_name);
$con->set_charset('utf8mb4');
$sql = "SELECT * FROM test";
if ($result = mysqli_query($con, $sql)) {
while ($obj = mysqli_fetch_object($result)) {
echo "$obj->id $obj->message<br>\n";
}
mysqli_free_result($result);
}
mysqli_close($con);
?>
~
~
~
~
:x
ทดสอบแสดงข้อมูล MySQL บนหน้าเว็บไซต์
กลับมาที่หน้าเว็บไซต์อีกครั้ง แล้วแสดงหน้า list.php
ตาม path ด้านล่างนี้
http://[IP Address]/list.php
จะเห็นว่าข้อมูลที่แสดงผลอยู่นี้ตรงกับข้อมูลใน Database ที่สร้างไว้ในตอนแรก
เพิ่มขึ้นมูลใน Database
เพื่อให้เห็นภาพมากขึ้นผมจะเพิ่มข้อมูลลงใน Table "test" อีกครั้ง
รันคำสั่งเชื่อมต่อจาก EC2 ไปยัง RDS อีกครั้ง (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)
mysql -h [your_endpoint_rds] -u admin -p[your_password_rds] [your_database_name]
รันคำสั่งเพิ่มข้อมูล [id: 3
| message: test3
, และ id: 4
| message: test4
] ลงใน Table "test" อีกครั้ง (สามารถรันคำสั่งพร้อมกันได้เลยครับ)
insert into test value (3, 'text3'); insert into test value (4, 'text4'); select * from test;
Output
MySQL [tinnakorn]> insert into test value (3, 'text3');
Query OK, 1 row affected (0.005 sec)
MySQL [tinnakorn]> insert into test value (4, 'text4');
Query OK, 1 row affected (0.004 sec)
MySQL [tinnakorn]> select * from test;
+------+---------+
| id | message |
+------+---------+
| 1 | text1 |
| 2 | text2 |
| 3 | text3 |
| 4 | text4 |
+------+---------+
4 rows in set (0.001 sec)
MySQL [tinnakorn]>
ทดสอบแสดงข้อมูล MySQL บนหน้าเว็บไซต์อีกครั้ง
กลับมาที่หน้าเว็บไซต์ "list.php" อีกครั้ง แล้ว Reload หน้าเว็บไซต์ ก็จะได้ผลลัพธ์ตามที่เพิ่มข้อมูลลงใน Database จากขั้นตอนที่แล้ว
ลบ AWS Resource ที่สร้างขึ้นในบทความนี้
การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ
ลบเรียงตาม AWS Resource ดังนี้
- Amazon RDS
- Databases
- Amazon EC2
- Instance
- Key Pairs
- Security Groups (1.EC2 | 2.RDS)
ลบ RDS
ดูตัวอย่างที่นี่เฉพาะหัวข้อหลักนี้: วิธีการลบ RDS
Terminate Instance, ลบ Key Pair และ Security Groups ใน Amazon EC2
ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้
สรุป
การสาธิตนี้เป็นการเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx ในการรันเว็บไซต์ และสร้างโปรแกรมสำหรับแสดงผลข้อมูล MySQL ที่สร้างใน Database บนหน้าเว็บไซต์
ผมหวังว่าบทความนี้จะเป็นประโยชน์ให้กับผู้อ่านได้นะครับ
POP (Tinnakorn Maneewong) จากบริษัท Classmethod (Thailand) ครับ !
บทความที่เกี่ยวข้อง
- วิธีติดตั้ง Amazon Linux 2023 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
- [Update] วิธีการสร้าง RDS และเชื่อมต่อจาก EC2 บน AWS
- การติดตั้ง MariaDB บน Amazon Linux 2023
- เรียกใช้ PHP 8.2 โดยใช้ Nginx ใน EC2 (Amazon Linux 2023) บน AWS
- Amazon EC2 คืออะไร การแนะนำฟังก์ชันล่าสุดของ AWS
- AWS : Amazon RDS คืออะไร
- 【สำหรับมือใหม่】เปรียบเทียบ RDS กับ RDB on EC2 บน AWS