การเชื่อมต่อจาก PHP บน AWS EC2 Amazon Linux 2023 ไปยัง RDS

การเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx ในการรันเว็บไซต์นั้น จะทำให้เว็บไซต์มีประสิทธิภาพการใช้งานที่เสถียร รวดเร็ว แรง และทันใจมากๆ นอกจากนี้ยังสามารถสร้างโปรแกรมที่แสดงข้อมูล MySQL ที่สร้างใน Database บนหน้าเว็บไซต์ได้อีกด้วย

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

ครั้งนี้จะมาแนะนำเกี่ยวกับการเชื่อมต่อจาก PHP บน AWS EC2 Amazon Linux 2023 ไปยัง RDS

เป้าหมายในการทำ

จะเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx และสร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าเว็บไซต์ครับ

สิ่งที่ต้องมี

หมายเหตุ: หากเจอบทความที่ทำไปแล้วให้ข้ามไปได้เลยครับ

สิ่งที่ต้องสร้างเตรียมไว้ในหัวข้อนี้

ติดตั้ง 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 GiB gp2 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]

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

[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;

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

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;

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;

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, 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;

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

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);
?>

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

<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;

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

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) ครับ !

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