การสร้าง RDS for PostgreSQL และเชื่อมต่อจาก EC2 บน AWS

การสร้าง RDS for PostgreSQL และเชื่อมต่อจาก EC2 บน AWS

Amazon RDS for PostgreSQL เป็นบริการฐานข้อมูลแบบจัดการที่ช่วยให้คุณสามารถตั้งค่า ดำเนินการ และปรับขนาด PostgreSQL บนคลาวด์ได้อย่างง่ายดาย โดย AWS จะจัดการงานประจำด้านการดูแลฐานข้อมูล เช่น การสำรองข้อมูล การอัพเดทซอฟต์แวร์ การตรวจสอบ และการปรับขนาดอัตโนมัติ

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

ครั้งนี้จะมาแนะนำวิธีการสร้าง RDS for PostgreSQL และเชื่อมต่อจาก EC2 ไปยัง RDS บน AWS ครับ

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

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

เป้าหมาย

ครั้งนี้จะสร้าง RDS for PostgreSQL และ EC2 Instance แล้วเชื่อมต่อเข้าด้วยกันผ่าน Security Group และทดสอบรันคำสั่ง PostgreSQL ใน Amazon Linux 2023
Amazon Linux 2023 to RDS (PostgreSQL) - Singapore region

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

※มี EC2 Instance สำหรับเชื่อมต่อกับ RDS for PostgreSQL แล้ว

ดูตัวอย่างได้ที่ลิงก์ด้านล่างนี้
https://dev.classmethod.jp/articles/how-to-install-amazon-linux-2023-on-ec2/

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

Region: Singapore

※Launch instances
Name and tags
Name: tinnakorn-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-ec2

Network settings
Firewall (security groups)
Security group name - required: tinnakorn-ec2 (ป้อนชื่อที่ต้องการ)
Description - required: tinnakorn-ec2 (ป้อนคำอธิบายตามต้องการ)
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 GiB gp3 Root volume (Not encrypted) (Default)

Amazon RDS คืออะไร

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

ดูรายละเอียดเพิ่มเติมได้ที่ลิงก์ด้านล่างนี้
https://dev.classmethod.jp/articles/what-is-amazon-rds/

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

ครั้งนี้จะสร้าง Security Group สำหรับใช้กับ RDS for PostgreSQL โดยใช้ชื่อ tinnakorn-rds-postgresql

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

คลิก Create security group
service_ec2-create_button

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

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

หัวข้อ Inbound rules
・Type: PostgreSQL
・ถัดจากช่อง Source ให้ค้นหาและเลือก Security group ID ของ EC2 Instance ตัวอย่างนี้คือ tinnakorn-ec2
・แล้วเลื่อนลงมาด้านล่างสุด คลิก Create security group
create_sg_for_postgresql

สร้าง RDS for PostgreSQL

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

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

  • ชื่อสำหรับ RDS (DB instance identifier): tinnakorn-rds-postgresql (ชื่อที่ต้องการ)
  • รหัสผ่านสำหรับ RDS (Master password): RdsEc2-202412 (รหัสผ่านที่ต้องการ)
    เมื่อเตรียมชื่อและรหัสผ่านแล้ว เริ่มสร้าง RDS ได้เลยครับ

ค้นหาและเลือก RDS
service_rds-search

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

คลิก Create database
service_rds-create_button

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

Choose a database creation method
Standard create
create_rds_for_postgresql-1

Engine options
・Engine type: PostgreSQL
・Engine Version: PostgreSQL 17.2-R1 (เวอร์ชันปัจจุบัน ณ วันที่เขียนบทความ)
create_rds_for_postgresql-2

Templates
Production

Availability and durability
・Deployment options: Single DB instance
create_rds_for_postgresql-3

Settings
・DB instance identifier: tinnakorn-rds-postgresql

▼ Credentials Settings
・Master username: postgres
・Credentials management: Self managed
・Master password: RdsEc2-202412
・Confirm master password: RdsEc2-202412
create_rds_for_postgresql-4

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

ค่าใช้จ่ายสำหรับ DB Instance สามารถตรวจสอบได้ที่ ราคา Amazon RDS for PostgreSQL
การตรวจสอบครั้งนี้คือให้ไปที่หัวข้อตามด้านล่างนี้
・TH Language: เลือกเมนู ค่าใช้จ่ายสำหรับ On-Demand DB Instance > RDS สำหรับ PostgreSQL > การใช้งานอินสแตนซ์แบบ Single-AZ > รีเจี้ยน เอเชียแปซิฟิก (สิงคโปร์) (ใกล้กับประเทศไทยมากที่สุด) > ค้นหา DB Instance ที่ต้องการตรวจสอบราคา เช่น db.t3.micro
・EN Language: เลือกเมนู Highly available deployment options > RDS for PostgreSQL > Single-AZ Deployment > รีเจี้ยน Asia Pacific (Singapore) (ใกล้กับประเทศไทยมากที่สุด) > ค้นหา DB Instance ที่ต้องการตรวจสอบราคา เช่น db.t3.micro
create_rds_for_postgresql-6

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

คลิก "▼ Additional storage configuration"
Storage autoscaling (การตั้งค่านี้คือค่าเริ่มต้นทั้งหมด)
✅ Enable storage autoscaling
・Maximum storage threshold: 1000 GiB

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

create_rds_for_postgresql-7

Connectivity
・VPC security group (firewall): Choose existing
・Existing VPC security groups: "tinnakorn-rds-postgresql" (เลือก Security Group ที่สร้างสำหรับ RDS ในตอนแรก)
・เลื่อนลงมาด้านล่างสุด แล้วคลิก Create database
create_rds_for_postgresql-8

ตรวจสอบ Database ที่สร้างแล้ว

หลังจากย้ายไปยังหน้าจอ Databases แล้ว ให้คลิก DB identifier ที่สร้างขึ้น (เช่น "tinnakorn-rds-postgresql")
create_rds_for_postgresql-9

หลังจากย้ายไปยังหน้าจอ DB identifier จะแสดงหน้าจอแบบนี้ ให้รอสักครู่จนกว่า DB Instance จะแสดงเป็น "Available"
create_rds_for_postgresql-10

จะเห็นว่า Endpoint ถูกสร้างขึ้นเมื่อ Status ของ DB Instance แสดงเป็น Available (ครั้งนี้ใช้เวลาประมาณ 6 นาที)

create_rds_for_postgresql-11

ติดตั้ง PostgreSQL Client

※เข้ามาที่หน้าจอ Terminal สำหรับรันคำสั่ง ครั้งนี้จะดำเนินการรันคำสั่งใน PuTTY

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

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

sudo su -

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

yum update -y

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

yum install postgresql16 -y

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

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

รันคำสั่งเชื่อมต่อกับฐานข้อมูล RDS for PostgreSQL จาก EC2 Instance
※ก่อนรันคำสั่งเปลี่ยนข้อมูลใน [ ] ให้เป็นของคุณ
・RDS Endpoint:「-h [your_endpoint_rds]
・Master username:「-U postgres」(Default)

psql -h [your_endpoint_rds] -U postgres

แล้วป้อนรหัสผ่าน Master password ที่กำหนดตอนสร้าง RDS for PostgreSQL
Output (example) 1

TERMINAL (PuTTY)
[root@ip-xx-xx-xx-xx ~]# psql -h tinnakorn-rds-postgresql.xxxxxxxxxx.ap-southeast-1.rds.amazonaws.com -U postgres
Password for user postgres: [your_password_rds]    # ขณะพิมพ์ Password ตัวอักษรจะไม่แสดงให้เห็น

หาก Login psql ได้แล้ว จะแสดงหน้าจอแบบนี้ แล้วจะเปลี่ยนเป็น postgres=>
Output (example) 2

TERMINAL (PuTTY)
Password for user postgres:
psql (16.4, server 17.2)
WARNING: psql major version 16, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=>

สร้าง Database

ก่อนอื่นตรวจสอบรายการ Database
คำสั่งแสดงรายการ database สำหรับ PostgreSQL

SELECT datname FROM pg_database;

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

TERMINAL (PuTTY)
postgres=> select datname from pg_database;
  datname
-----------
 template0
 template1
 postgres
 rdsadmin
(4 rows)

postgres=>

คำสั่งสร้าง Database (เปลี่ยน database_name ให้เป็นชื่อ Database ของคุณ เช่น tinnakorn)

CREATE DATABASE database_name;

ตัวอย่างนี้ใช้ Database ชื่อว่า tinnakorn
Output (example)

TERMINAL (PuTTY)
postgres=> CREATE DATABASE tinnakorn;
CREATE DATABASE
postgres=>

รันคำสั่งแสดงรายการ database อีกครั้ง

SELECT datname FROM pg_database;

จะเห็นว่ามีชื่อ Database tinnakorn แสดงขึ้นมา
Output (example)

TERMINAL (PuTTY)
postgres=> SELECT datname FROM pg_database;
  datname
-----------
 template0
 template1
 postgres
 rdsadmin
 tinnakorn
(5 rows)

postgres=>

สร้าง Table

คำสั่งเปลี่ยนการเชื่อมต่อ Database (เปลี่ยน database_name ให้เป็นชื่อ Database ของคุณที่สร้างจากขั้นตอนที่แล้ว เช่น tinnakorn)

\c database_name

จะเห็นว่าเปลี่ยนเป็น tinnakorn=>
Output (example)

TERMINAL (PuTTY)
postgres=> \c tinnakorn
psql (16.4, server 17.2)
WARNING: psql major version 16, server major version 17.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
You are now connected to database "tinnakorn" as user "postgres".
tinnakorn=>

คำสั่งสร้าง Table (เปลี่ยน table_name ให้เป็นชื่อ Table ของคุณ)

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

ตัวอย่างนี้ใช้ Table ชื่อว่า test
Output (example)

TERMINAL (PuTTY)
tinnakorn=> create table test(id int, message varchar(255));
CREATE TABLE
tinnakorn=>

คำสั่งแสดงรายการ Table

\dt

จะเห็นว่ามีชื่อ Table test แสดงขึ้นมา
Output (example)

TERMINAL (PuTTY)
tinnakorn=> \dt
        List of relations
 Schema | Name | Type  |  Owner
--------+------+-------+----------
 public | test | table | postgres
(1 row)

tinnakorn=>

Insert ข้อมูลลงใน Table

คำสั่ง Insert ข้อมูลลงใน Table (เปลี่ยน table_name ให้เป็นชื่อ Table ที่คุณสร้างเมื่อสักครู่นี้ และเปลี่ยน column, values ตามต้องการ)

insert into table_name(column1, column2) values(value1, value2);

ข้อมูลของตัวอย่างนี้คือ ["column = (id, message)" และ "value = (1, 'test1')"]
Output (example)

TERMINAL (PuTTY)
tinnakorn=> insert into test(id, message) values(1, 'test1');
INSERT 0 1
tinnakorn=>

ดึงข้อมูลจาก Table

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

select * from table_name;

Output (example)

TERMINAL (PuTTY)
tinnakorn=> select * from test;
 id | message
----+---------
  1 | test1
(1 row)

tinnakorn=>

ออกจาก Prompt

คำสั่งออกจาก prompt ต่างๆ ในครั้งนี้ออกจาก psql กลับมาที่ postgres

\q

Output (example)

TERMINAL (PuTTY)
tinnakorn=> \q
[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
delete_resource_rds_psql-1

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

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

คลิกเข้ามาที่หน้าจอ DB identifier อีกครั้ง แล้วคลิก Action ▼ และเลือก Delete
delete_resource_rds_psql-4

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

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

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

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

ดูตัวอย่างการ Terminate Instances, ลบ Key Pair และลบ Security Group ได้ที่ลิงก์ด้านล่างนี้
https://dev.classmethod.jp/articles/terminate-instances-delete-key-pairs-and-delete-security-groups-in-ec2/

สรุป

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

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

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

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.