ทดลองทำการเชื่อมต่อจาก PHP บน EC2 ไปยัง RDS

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

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ครั้งนี้ผมจะมาอธิบายเกี่ยวกับการ ทดลองทำการเชื่อมต่อจาก PHP บน EC2 ไปยัง RDS

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

ผมจะทำการเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx และสร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL บนหน้าจอ (Web Browser) ครับ

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

หมายเหตุ: เพื่อให้ง่ายต่อการทำสิ่งต่างๆในบทความนี้ผมจะเรียง(บทความ)และ(หัวข้อ)ที่ต้องทำตามลำดับขั้นตอนไว้ที่ด้านล่างนี้

» ซึ่งจะมี(บทความ)ที่แปะลิงก์ซ้ำกันอยู่ในแต่ละบทความ เช่น บทความ 「【Update】วิธีติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY」 เป็นต้น

» และจะมี(หัวข้อ)ที่แปะลิงก์ซ้ำกันอยู่ในแต่ละขั้นตอน เช่น หัวข้อ 「การเพิ่ม HTTP ใน Security Group ของ EC2」 เป็นต้น

【ถ้าผู้อ่านเห็น(บทความ)หรือ(หัวข้อ)ที่ซ้ำกันก็ให้ข้ามขั้นตอนนั้นๆไปได้เลยครับ ! ถ้าอ่าน หมายเหตุ จบแล้วเรามาเริ่มกันเลยครับ】

สิ่งที่ต้องสร้างเตรียมไว้ในหัวข้อนี้:
ทำการติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY
การเพิ่ม HTTP ใน Security Group ของ EC2
ทำการสร้าง RDS


ทำการติดตั้ง Amazon Linux 2 บน EC2 และเชื่อมต่อเซิร์ฟเวอร์ด้วยโปรแกรม PuTTY

ทำการติดตั้ง EC2 Instance สำหรับใช้ในการเชื่อมต่อกับ RDS โดยทำตามลิงก์ด้านล่างนี้ครับ
! สำหรับผู้ใช้งานที่มีอยู่แล้ว ข้ามขั้นตอนนี้ไปได้เลยครับ

ตัวอย่างตั้งค่าการติดตั้ง EC2 Instance (Amazon Linux 2) ในบทความนี้

Create Key pairs
» Name:tinnakorn-test
» Private key file format:.ppk

Launch instances
※Name and tags
» Name:tinnakorn-test

※Application and OS Images (Amazon Machine Image)
» Amazon Machine Image (AMI):Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type(Default)

※Instance type
» Instance type:t3a.nano

※Key pair (login)
» Key pair name - required:tinnakorn-test

※Network settings
Firewall (security groups)
» Security group name - required:tinnakorn-test
» Description - required:tinnakorn-test

Inbound security groups rules
Security group rule 1 (TCP, 22, 0.0.0.0/0)
» Type:ssh ▼| Source type:My IP ▼| Source:xxx.xxx.x.xxx/32 ✕

Security group rule 2 (TCP, 80, 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:8GiBgp2 ▼Root volume (Default)


การเพิ่ม HTTP ใน Security Group ของ EC2

ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้เท่านั้น: การเพิ่ม HTTP ใน Security Group ของ EC2


ทำการสร้าง RDS

ให้ทำการสร้าง RDS ตามลิงก์ด้านล่างนี้ได้เลยครับ (ทำเฉพาะหัวข้อที่ระบุไว้ด้านล่างนี้เท่านั้นครับ)

ตัวอย่างตั้งค่าการสร้าง RDS และเชื่อมต่อจาก EC2 บน AWS ในบทความนี้

Create security group
※Basic details
» Security group name:tinnakorn-test-rds
» Description:tinnakorn-test-rds

※Inbound rules
Inbound:MySQL/Aurora| Source:tinnakorn-test (เลือก Security Group ของ EC2 Instance)

Create database
※Engine options
» Engine type: ◉MySQL
» Edition: ◉MySQL Community
» Version:MySQL 8.0.28

※Templates
»Production

※Availability and durability
» Deployment options: ◉Single DB instance

※Settings
» DB instance identifier:tinnakorn-test-rds

▼ Credentials Settings
» Master username:admin
» Master password:Aws_2022
» Confirm password:Aws_2022

※Instance configuration
» DB instance class: ◉ Burstable classes (includes t classes)
[db.t3.micro ▼]

※Storage
» Storage type:Magnetic
» Allocated storage:5GiB

※Connectivity
» Public access: ◉No
» Existing VPC security groups:tinnakorn-test-rds

※Database authentication
» Database authentication options: ◉Password authentication

※Additional configuration
Database options
» Initial database name:tinnakorn(ตั้งชื่อ Database)

เมื่อทำขั้นตอน สิ่งที่ต้องมี เสร็จเรียบร้อยแล้ว กลับมาที่โปรแกรม PuTTY แล้วเริ่มทำ การติดตั้ง MariaDB ในขั้นตอนถัดไปได้เลยครับ

ทดสอบการเชื่อมต่อจาก EC2 ไปยัง RDS ด้วยคำสั่ง MySQL

ก่อนที่เราจะทำการเชื่อมต่อจาก EC2 ไปยัง RDS เราต้องติดตั้ง Client MariaDB ก่อนครับ จึงจะสามารถทำการทดสอบได้

การติดตั้ง Client MariaDB เพื่อใช้ในการเชื่อมต่อกับ RDS

การติดตั้ง Client MariaDB นี้ไม่ได้มีไว้ใช้สำหรับ Server MariaDB แต่เป็นการติดตั้ง Client MariaDB เพื่อทำการทดสอบการเชื่อมต่อไปยัง RDS เท่านั้น เพราะว่า RDS นี้มี Server MySQL ในตัวอยู่แล้วนั่นเอง (สรุปคือไม่ใช่การติดตั้ง Server MariaDB ครับ)

กลับมาที่ PuTTY รันคำสั่งนี้เพื่อติดตั้ง Client MariaDB

yum install mariadb -y

ทดสอบการเชื่อมต่อจาก EC2 ไปยัง RDS ด้วยคำสั่ง MySQL

เมื่อทำการติดตั้ง Client MariaDB เสร็จแล้วให้ทดสอบการเชื่อมต่อจาก EC2 ไปยัง RDS ด้วยคำสั่ง MySQL ครับ
หากไม่ทำการ Create table และ Insert into เตรียมไว้ ผลลัพธ์ที่ต้องการก็จะไม่แสดงออกมาในตอนที่เราทำการเชื่อมต่อเว็บเบราว์เซอร์นั่นเอง

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

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

Output (example)

root@ip-172-31-25-84:~

[root@ip-172-31-25-84 ~]# mysql -h tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -u admin -pAws_2022 tinnakorn
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.28 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 [tinnakorn]>


เมื่อเข้ามาหน้า MySQL Prompt ได้แล้ว ให้ทำการสร้าง Table ตามคำสั่งด้านล่างนี้ (test คือชื่อ Table ซึ่งคุณสามารถใช้ชื่ออื่นก็ได้ครับ)

create table test (id int, message varchar(255));

Output (example)

root@ip-172-31-25-84:~

MySQL [tinnakorn]> create table test (id int, message varchar(255));
Query OK, 0 rows affected (0.03 sec)

MySQL [tinnakorn]>


เมื่อสร้าง Table เสร็จแล้วให้รันคำสั่งนี้เพื่อเพิ่มข้อมูลลงใน Table:test(สามารถรันคำสั่งพร้อมกันได้เลยครับ)

insert into test values (1, "text1");
insert into test values (2, "text2");
select * from test;

Output (example)

root@ip-172-31-25-84:~

MySQL [tinnakorn]> insert into test values (1, "text1");
Query OK, 1 row affected (0.00 sec)

MySQL [tinnakorn]> insert into test values (2, "text2");
Query OK, 1 row affected (0.01 sec)

MySQL [tinnakorn]> select * from test;
+------+---------+
| id   | message |
+------+---------+
|    1 | text1   |
|    2 | text2   |
+------+---------+
2 rows in set (0.00 sec)

MySQL [tinnakorn]>


เมื่อทำการเพิ่มข้อมูลเสร็จแล้ว รันคำสั่งนี้เพื่อออกจาก MySQL Prompt กลับมาที่ root

quit

Output (example)

root@ip-172-31-25-84:~

MySQL [tinnakorn]> quit
Bye
[root@ip-172-31-25-84 ~]#

เมื่อทำตามตัวอย่างข้างต้นแล้วให้ทำการ ติดตั้ง PHP 8.0 และ Nginx ใน Amazon Linux 2 ตามตัวอย่างในขั้นตอนถัดไปได้เลยครับ

ติดตั้ง PHP 8.0 และ Nginx ใน Amazon Linux 2

ดูตัวอย่างที่นี่เฉพาะหัวข้อนี้เท่านั้น: ติดตั้ง PHP 8.0 และ Nginx ใน Amazon Linux 2

เมื่อทำในส่วนของการติดตั้ง PHP 8.0 และ Nginx ใน Amazon Linux 2 เสร็จแล้ว ให้เริ่มทำตามขั้นตอนถัดไปได้เลยครับ

ตรวจสอบและสร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าจอ (Web Browser)

ขั้นตอนนี้ผมจะทำการตรวจสอบ MySQL บนหน้าจอเว็บไซต์ในหน้า info.php เบื้องต้น และสร้างโปรแกรมที่ใช้ในการแสดงข้อมูล MySQL บนหน้าจอ (Web Browser) ที่ผมได้เพิ่มข้อมูลลงใน Database ไปครับ

ตรวจสอบ MySQL บนหน้าจอ (Web Browser)

ก่อนอื่นผมจะแนะนำวิธีตรวจสอบ MySQL บนหน้าจอเว็บไซต์ในหน้า info.php เบื้องต้นก่อนครับ

กลับมาที่หน้าเว็บไซต์ info.php แล้วกดปุ่มCtrl + fที่แป้นพิมพ์ แล้วจะมีช่องให้ใส่ข้อความแสดงขึ้นมาด้านขวาบน
จากนั้นให้พิมพ์mysqli+ Enter แล้วเราจะเห็นคำที่เราค้นหาแสดงขึ้นมา ซึ่งเราสามารถตรวจสอบข้อมูลเบื้องต้นเกี่ยวกับ MySQL ได้ที่นี่เลยครับ


สร้างโปรแกรมที่ใช้แสดงข้อมูล MySQL บนหน้าจอ (Web Browser)

กลับมาที่โปรแกรม PuTTY แล้วรันคำสั่งนี้เพื่อสร้างโปรแกรมในไฟล์ list.php

vi list.php


เมื่อเข้ามาที่ไฟล์ list.php แล้ว กดปุ่มiเพื่อทำการแก้ไข จากนั้น Copy Code ด้านล่างนี้วางลงที่นี่

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


จากนั้นเปลี่ยนข้อมูลของ$db_host, $db_name, $db_user, $db_passwordตามที่มาร์คไว้ให้เป็นของคุณทั้งหมด
เมื่อจัดการตั้งค่าไฟล์ list.php เสร็จเรียบร้อยแล้ว ให้กดปุ่มEscตามด้วยพิมพ์:xหรือ:wqเพื่อบันทึกได้เลยครับ
・$db_host: Endpoint RDS
・$db_name: Database Name RDS
・$db_user: Master username
・$db_password: Master password

Output (example)

root@ip-172-31-25-84:~

<html><body>
<?php
$db_host = 'tinnakorn-test-rds.xxxxxxxxxxxx.ap-southeast-1.rds.amazonaws.com';
$db_port = '3306';
$db_name = 'tinnakorn';
$db_user = 'admin';
$db_password = 'Aws_2022';

$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 บนหน้าจอ (Web Browser)

กลับมาที่หน้าเว็บเบราว์เซอร์ของเราอีกครั้ง แล้วเพิ่ม/list.phpต่อจาก URL ที่เรา Copy มาจาก Instance ในตอนแรก

http://[IP Address]/list.php

Output (example)
จะเห็นว่ามีข้อมูลใน Database ที่เราได้สร้างไว้ในตอนแรกนั้นตรงกับหน้าเว็บเบราว์เซอร์ที่กำลังแสดงผลอยู่ครับ

เพิ่มขึ้นมูลใน Database

เพื่อให้เห็นภาพมากขึ้นผมจะเพิ่มข้อมูล [id: 3 | message: test3, และ id: 4 | message: test4] ลงใน Database จากนั้นจะมาเปิดดูในเว็บเบราว์เซอร์ list.php อีกครั้งครับ

รันคำสั่งนี้เพื่อทำการเชื่อมต่อจาก EC2 ไปยัง RDS อีกครั้ง (ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ)

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


รันคำสั่งนี้เพื่อเพิ่มข้อมูล (สามารถรันคำสั่งพร้อมกันได้เลยครับ)

insert into test value (3, 'text3');
insert into test value (4, 'text4');
select * from test;

Output (example)

root@ip-172-31-25-84:~

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

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

MySQL [tinnakorn]> select * from test;
+------+---------+
| id   | message |
+------+---------+
|    1 | text1   |
|    2 | text2   |
|    3 | text3   |
|    4 | text4   |
+------+---------+
4 rows in set (0.00 sec)

MySQL [tinnakorn]>

ทดสอบการแสดงข้อมูล MySQL บนหน้าจอ (Web Browser) อีกครั้ง

เมื่อผมเพิ่มข้อมูลลงใน Database เสร็จแล้ว ผมก็ได้ทำการ Reload และผลลัพธ์ที่ได้คือ
มีข้อมูล [id: 3 | message: test3, และ id: 4 | message: test4] เพิ่มขึ้นมาตามรูปภาพด้านล่างครับ

การลบ AWS Resource ที่สร้างขึ้นในบทความนี้

การลบฟังก์ชันใน Service ต่างๆ ถ้าเราไม่รู้ลำดับของการลบฟังก์ชันก็จะทำให้เกิด Error ในขณะลบ หรือไม่สามารถลบได้นั่นเอง เช่น ถ้าทำการลบ Security Group ที่กำลังเชื่อมต่ออยู่กับ EC2 โดยที่ไม่ Terminate EC2 ก่อน ก็จะไม่สามารถลบ Security Group ได้ เป็นต้น ดังนั้นแนะนำให้ลบตามขั้นตอนที่ผมเรียงไว้ได้เลยครับ

การลบฟังก์ชันที่ได้สร้างขึ้นใน Service ต่างๆ

ลบเรียงตามขั้นตอนดังนี้:

  • Amazon RDS
    • Databases
  • Amazon EC2
    • Instance
    • Key Pairs
    • Security Groups (1.EC2 | 2.RDS)

วิธีการลบ RDS

ดูตัวอย่างการลบที่นี่: วิธีการลบ RDS

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

ดูตัวอย่างการลบที่นี่: การ Terminate Instance, ลบ Key Pair และลบ Security Group ใน EC2

สรุป

การสาธิตนี้เป็นการเชื่อมต่อจาก PHP ไปยัง RDS โดยใช้ Server Nginx ในการรันเว็บไซต์ นอกจากนี้ผมก็ได้สร้างโปรแกรมที่แสดงผลการดำเนินการ MySQL บนหน้าจอ (Web Browser) ที่ได้สร้างใน Database ด้วยครับ

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