AWS — Virtual Private Network

Tuan Anh Le
andy.le
Published in
15 min readOct 19, 2020

Thông tin chi tiết bài viết:

https://www.microservicesvn.com/docs/aws/vpc.html

Amazon Virtual Private Cloud (VPC) là dịch vụ cho phép tạo ra những mạng máy tính ảo — Virtual Networks, chứa các tài nguyên AWS hoạt động bên trong. VPC có những chức năng tương tự như trong một môi trường mạng thực tế, cùng với khả năng mở rộng cơ sở hạ tầng trong trường hợp cần thiết.

Một VPC thường bao gồm nhiều subnets cho phép nhóm những tài nguyên AWS có cùng một mục đích sử dụng hay mức độ bảo mật. Mỗi subnet được liên kết với một bảng định tuyến — route table, định nghĩa những qui tắc xác định đường đi cho những gói tin trong subnet.

Khi gửi nhận các gói tin, bên cạnh thông tin trong bảng định tuyến, mỗi tài nguyên bên trong subnet phải có một địa chỉ IP duy nhất cấp phát từ một giải địa chỉ IP quản lý bởi subnet đó. Phân bố giải IP của subnets hoặc VPC được khai báo qua cấu trúc Classless Inter-Domain Routing (CIDR). Để quản lý VPC hiệu quả, chúng ta cần hiểu rõ về cấu trúc CIDR.

Hãy xem xét trường hợp áp dụng CIDR với IPv4. Trong IPv4, mỗi địa chỉ IP bao gồm với 4 bytes / 32 bits, được biểu diễn dưới dạng mã thập phân.

Ví dụ giá trị 00001010.00000000.00000000.00000000, tương ứng với 10.0.0.0.

Tập hợp 32 bits được chia thành 2 nhóm:

  • Nhóm tiền tố biểu diễn địa chỉ mạng (subnets)
  • Nhóm hậu tố biễu diễn địa chỉ của tài nguyên trong dải mạng.

Một CIDR block 10.0.0.0/16 có ý nghĩa 16 bits đầu tiên sẽ dùng cho địa chỉ mạng, và 16 bits còn lại sẽ dùng cho địa chỉ tài nguyên. Do vậy, địa chỉ tài nguyên sẽ nằm tương ứng trong phạm vi từ 10.0.0.0đến 10.0.255.255. Với định nghĩa như vậy, VPC với CIDR 10.0.0.0/16 có thể chia nhỏ thành nhiều subnets:

  • 10.0.1.0/24: tương ứng 256 IP, từ 10.0.1.0 đến 10.0.1.255
  • 10.0.2.0/24: tương ứng 256 IP, từ 10.0.2.0 đến 10.0.2.255

Trong trường hợp đặc biệt, CIDR 0.0.0.0/0::/0 đại diện cho tất cả các giá trị IPv4 và IPv6.

Custom VPC & Public Subnet to setup Amazon RDS

Các chức năng bảo mật cho tài nguyên trong VPC bao gồm:

  • Network Access Control Lists (ACLs): kiểm soát lưu lượng thông tin ra vào trong subnets
  • Security Group: kiểm soát thông tin ra vào trong từng instance (EC2, Database Server)
  • Flow log: lưu lại thông tin về IP của các gói tin đi qua VPC, subnets hoặc network interface
  • Trafic mirroring: copy lưu lượng từ network interface của EC2 sang môi trường giám sát

Việc truy cập Internet từ tài nguyên trong subnet có thể thực hiện bằng một trong các cách:

  • Kết hợp Internet Gateway và khai báo trong route table để định tuyến dữ liệu giữa subnet và Internet
  • Sử dụng Network Address Translate (NAT) ánh xạ Private IPs sang Public IP có khả năng truy cập Internet

Trong phần tiếp theo, chúng ta sẽ tạo ra một VPC và các subnets tương ứng với những Availability Zones khác nhau. Bên trong mỗi subnets, chũng ta cũng thực hiện một số thay đổi cấu hình liên quan đến Internet Gateway và route table cho phép các tài nguyên bên trong chúng (i.e, DB server, EC2 instances) có thể kết nối ra ngoài mạng Internet. Những hoạt động này có thể thiết lập dựa trên các câu lệnh AWS CLI riêng rẽ hoặc thông qua dịch vụ CloudFormation.

AWS VPC & CLI

Cũng giống như các tài nguyên AWS khác, chúng ta có thể sử dụng các phương thức sau để quản lý AWS VPC:

  • AWS Management Console
  • AWS Command Line Interface (CLI)
  • AWS Cloud Development Kit (CDK)

Trong những bài thực hành tiếp theo, chúng ta sẽ sử dụng AWS CLI để tạo một VPC (Custom VPC) với giải địa chỉ 10.0.0.0/16, bao gồm Private / Public Subnets. Public Subnet kết nối Internet thông qua Internet Gateway. Bên trong VPC mới, chúng ta sẽ thực hiện cài đặt các dịch vụ phổ biến của AWS bao gồm

  • EC2 Instance
  • AWS RDS Server

Cài đặt VPC & Public Subnets

Bước 1: Xác nhận Default VPC trên hệ thống

Đối với những AWS Account được tạo ra sau ngày 04/12/2013 chúng ta luôn có sẵn một VPC cùng những Subnets mặc định trên những Avaialability Zone khác nhau (default VPC & Subnets). EC2 Instance sử dụng default VPC và Subnets này sẽ tự động tạo ra Private IP và Public IP cho phép chúng có khả năng giao tiếp với môi trường Internet.

Để kiểm tra thông tin default VPC, có thể sử dụng AWS Console hoặc lệnh aws ec2 describe-vpcs:

Output của câu lệnh:

{
"Vpcs": [
{
"CidrBlock": "172.31.0.0/16",
"DhcpOptionsId": "dopt-455c7122",
"State": "available",
"VpcId": "vpc-71636016",
"OwnerId": "729365137003",
"InstanceTenancy": "default",
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-858468ee",
"CidrBlock": "172.31.0.0/16",
"CidrBlockState": {
"State": "associated"
}
}
],
"IsDefault": true
}
]
}
Default VPC
Default Subnets in VPC

Kết quả cho thấy Default VPC có giá trị id vpc-71636016 và sử dụng giải địa chỉ 172.31.0.0/16.

Mỗi VPC luôn kèm theo một bảng định tuyến chính — Main Route Table. Main route được sử dụng mặc định khi subnet không có liên kết trực tiếp đến một route table nào khác.

Để hiển thị thông tin về main route, sử dụng câu lệnh truy vấn:

aws ec2 describe-route-tables --filters "Name=vpc-id,Values=vpc-71636016"

Output:

{
"RouteTables": [
{
"Associations": [
{
"Main": true,
"RouteTableAssociationId": "rtbassoc-57297e2e",
"RouteTableId": "rtb-789c091e",
"AssociationState": {
"State": "associated"
}
}
],
"PropagatingVgws": [],
"RouteTableId": "rtb-789c091e",
"Routes": [
{
"DestinationCidrBlock": "172.31.0.0/16",
"GatewayId": "local",
"Origin": "CreateRouteTable",
"State": "active"
},
{
"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": "igw-a55848c1",
"Origin": "CreateRoute",
"State": "active"
}
],
"Tags": [],
"VpcId": "vpc-71636016",
"OwnerId": "729365137003"
}
]
}
Main Route Table Content

Main route table rtb-789c091e định nghĩa routes tương ứng với CIDR blocks:

  • 172.31.0.0/16 - liên kết với Gateway local cho phép các kết nối bên trong VPC
  • 0.0.0.0/0 - liên kết với Internet Gateway igw-a55848c1 cho phép kết nối với mạng Internet

Bước 2: Tạo Custom VPC với CIDR 10.0.0.0/16

Sử dụng lệnh:

aws ec2 create-vpc --cidr-block 10.0.0.0/16

Câu lệnh tạo ra VPC với id vpc-0c368007553e15d93:

{
"Vpc": {
"CidrBlock": "10.0.0.0/16",
"DhcpOptionsId": "dopt-455c7122",
"State": "pending",
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003",
"InstanceTenancy": "default",
"Ipv6CidrBlockAssociationSet": [],
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-05c66d0f6957e9c6c",
"CidrBlock": "10.0.0.0/16",
"CidrBlockState": {
"State": "associated"
}
}
],
"IsDefault": false
}
}

Bước 3: Cập nhật thuộc tính của VPC

Trong những bài thực hành tiếp theo, chúng ta sẽ cài đặt database server trên một subnet của VPC. Để truy cập được server từ Internet qua hostname, chúng ta phải thiết lập giá trị True cho các thuộc tính sau của VPC:

aws ec2 modify-vpc-attribute --vpc-id vpc-0c368007553e15d93 --enable-dns-hostnames "{\"Value\":true}"
Custom VPC with DNS Attributes Enabled

Bước 4: Tạo Subnets trong AWS VPC

Với VPC vpc-0c368007553e15d93, sử dụng lệnh create-subnet để tạo ra các subnet trên các availability zone (AZ) khác nhau.

  • Subnet với 10.0.1.0/24 trong AZ ap-southeast-2a:
aws ec2 create-subnet --vpc-id vpc-0c368007553e15d93 --cidr-block 10.0.1.0/24 --availability-zone-id apse2-az1

Output

{
"Subnet": {
"AvailabilityZone": "ap-southeast-2a",
"AvailabilityZoneId": "apse2-az1",
"AvailableIpAddressCount": 251,
"CidrBlock": "10.0.1.0/24",
"DefaultForAz": false,
"MapPublicIpOnLaunch": false,
"State": "available",
"SubnetId": "subnet-0116ae0912c2e4bb2",
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003",
"AssignIpv6AddressOnCreation": false,
"Ipv6CidrBlockAssociationSet": [],
"SubnetArn": "arn:aws:ec2:ap-southeast-2:729365137003:subnet/subnet-0116ae0912c2e4bb2"
}
}
  • Subnet với 10.0.0.0/24 trong AZ ap-southeast-2c:
aws ec2 create-subnet --vpc-id vpc-0c368007553e15d93 --cidr-block 10.0.0.0/24 --availability-zone-id apse2-az2

Output

{
"Subnet": {
"AvailabilityZone": "ap-southeast-2c",
"AvailabilityZoneId": "apse2-az2",
"AvailableIpAddressCount": 251,
"CidrBlock": "10.0.0.0/24",
"DefaultForAz": false,
"MapPublicIpOnLaunch": false,
"State": "available",
"SubnetId": "subnet-07cc3786d0213e553",
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003",
"AssignIpv6AddressOnCreation": false,
"Ipv6CidrBlockAssociationSet": [],
"SubnetArn": "arn:aws:ec2:ap-southeast-2:729365137003:subnet/subnet-07cc3786d0213e553"
}
}

Các câu lệnh trên tạo 2 Subnets với các id subnet-0116ae0912c2e4bb2, subnet-07cc3786d0213e553.

  • Để xác nhận danh sách các subnets trong vpc vpc-0c368007553e15d93, có thể sử dụng query:
aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0c368007553e15d93" --query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock, Zone:AvailabilityZone}'

Output

[
{
"ID": "subnet-07cc3786d0213e553",
"CIDR": "10.0.0.0/24",
"Zone": "ap-southeast-2c"
},
{
"ID": "subnet-0116ae0912c2e4bb2",
"CIDR": "10.0.1.0/24",
"Zone": "ap-southeast-2a"
}
]
Custom Subnets Attributes
Main Route Table rtb-03b553d32582452d5 with Custom VPC
Main Route Table rtb-03b553d32582452d5 with Custom Subnets

Cài đặt và liên kết Internet Gateway & Public Subnets

Trong phần này, chúng ta sẽ tạo một Internet Gateway cho phép các AWS resource trong Subnets subnet-07cc3786d0213e553 kết nối với Internet.

Các bước thực hiện

Bước 1: Tạo và liên kết Internet Gateway với VPC

  • Tạo Internet Gateway với lệnh
aws ec2 create-internet-gateway

Output

{
"InternetGateway": {
"Attachments": [],
"InternetGatewayId": "igw-0ece152dae277a579",
"OwnerId": "729365137003",
"Tags": []
}
}
  • Liên kết Internet Gateway & VPC:
aws ec2 attach-internet-gateway --vpc-id vpc-0c368007553e15d93 --internet-gateway-id igw-0ece152dae277
Attach Custom VPC with Internet Gateway

Bước 2: Tạo và cấu hình Custom Route Table

  • Tạo một Custom Route Table trong VPC
aws ec2 create-route-table --vpc-id vpc-0c368007553e15d93

Output

{
"RouteTable": {
"Associations": [],
"PropagatingVgws": [],
"RouteTableId": "rtb-0cf4f038bfa256226",
"Routes": [
{
"DestinationCidrBlock": "10.0.0.0/16",
"GatewayId": "local",
"Origin": "CreateRouteTable",
"State": "active"
}
],
"Tags": [],
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003"
}
}

Custom Table Route rtb-0cf4f038bfa256226 được khởi tạo chỉ bao gồm định nghĩa một Local Route cho phép điều hướng lưu lượng giữa các thành phần bên trong VPC/Subnets.

Custom VPC with Route Tables List
  • Bổ sung cấu hình route cho phép định tuyến với các lưu lượng ra ngoài Internet thông qua Internet Gateway

Sử dụng câu lệnh create-route:

aws ec2 create-route --route-table-id rtb-0cf4f038bfa256226 --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0ece152dae277a579

Xác nhận kết quả với lệnh describe-route-tables:

aws ec2 describe-route-tables --route-table-id rtb-0cf4f038bfa256226

Output

{
"RouteTables": [
{
"Associations": [],
"PropagatingVgws": [],
"RouteTableId": "rtb-0cf4f038bfa256226",
"Routes": [
{
"DestinationCidrBlock": "10.0.0.0/16",
"GatewayId": "local",
"Origin": "CreateRouteTable",
"State": "active"
},
{
"DestinationCidrBlock": "0.0.0.0/0",
"GatewayId": "igw-0ece152dae277a579",
"Origin": "CreateRoute",
"State": "active"
}
],
"Tags": [],
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003"
}
]
}
Define Internet Gateway Route in Custom Router Table
  • Liên kết table route và subnet subnet-07cc3786d0213e553

Sử dụng lệnh associate-route-table:

aws ec2 associate-route-table  --subnet-id subnet-07cc3786d0213e553 --route-table-id rtb-0cf4f038bfa256226

Output

{
"AssociationId": "rtbassoc-0ea91b3f74c3cabff",
"AssociationState": {
"State": "associated"
}
}
Associate Custom Subnets And Custom Router Table

Cài đặt EC2 Instance trong Public Subnet

Trong phần thực hành trước, chúng ta có Custom VPC vpc-0c368007553e15d93 với 2 Subnets:

  • Public Subnet — subnet-07cc3786d0213e553: hoạt động trên AZ ap-southeast-2c
  • Private Subnet — subnet-0116ae0912c2e4bb2: hoạt động trên AZ ap-southeast-2a

Trong phần thực hành này, chúng ta sẽ cài đặt EC2 Instance trong Public Subnet.

Các bước thực hiện

Bước 1: Tạo và cấu hình Security Group

Một VPC tạo ra luôn kèo theo một Security Group mặc định và áp dụng cho mọi EC2 Instance trong VPC đó nếu quá trình tạo EC2 Instance không chỉ rõ Security Group nào khác. Tuy vậy, chúng ta nên chủ động tạo và áp dụng những Security Group cùng những qui tắc bảo mật khác nhau cho các thành phần bên trong một VPC tuỳ theo mục đích sử dụng của chúng.

Trong ví dụ này, chúng ta chỉ cần tạo một EC2 Instance bên trong Public Subnet, cho phép người dùng truy cập qua giao thức SSH và thực hiện việc cài đặt software packages từ Internet.

  • Tạo Security Group EC2SecurityGroup:
aws ec2 create-security-group --group-name EC2SecurityGroup --description "EC2 Security Group" --vpc-id vpc-0c368007553e15d93

Output

{
"GroupId": "sg-0cadabfe14fe810db"
}
  • Bổ sung Security Group Rule cho phép truy cập EC2 Instance với giao thức SSH — Port 22:
aws ec2 authorize-security-group-ingress --group-id sg-0cadabfe14fe810db --protocol tcp --port 22 --cidr 0.0.0.0/0 --region ap-southeast-2
  • Xác nhận cấu hình Security Group sau khi thay đổi
aws ec2 describe-security-groups --group-ids sg-0cadabfe14fe810db

Output

{
"SecurityGroups": [
{
"Description": "EC2 Security Group",
"GroupName": "EC2SecurityGroup",
"IpPermissions": [
{
"FromPort": 22,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"Ipv6Ranges": [],
"PrefixListIds": [],
"ToPort": 22,
"UserIdGroupPairs": []
}
],
"OwnerId": "729365137003",
"GroupId": "sg-0cadabfe14fe810db",
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"Ipv6Ranges": [],
"PrefixListIds": [],
"UserIdGroupPairs": []
}
],
"VpcId": "vpc-0c368007553e15d93"
}
]
}
Custom Security Group with Firewall Rules

Bước 2: Tạo EC2 Instance

Để tạo EC2 Instance, chúng ta cần sử dụng các tham số cơ bản sau:

  • Giá trị AMI ID : cấu hình phần mềm
  • Instance Type ID : cấu hình phần cứng
  • Key Name : Keypair sử dụng truy cập EC2
  • Subnet ID : Subnet cài đặt Ec2 Instances
  • Cài đặt / không cài đặt Public IP

Thực hiện lênh tạo EC2 Instance:

aws ec2 run-instances \
--image-id resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
--instance-type t2.micro \
--key-name FriendReminders \
--subnet-id subnet-07cc3786d0213e553 \
--security-group-ids sg-0cadabfe14fe810db \
--associate-public-ip-address

AMI có vai trò như một Template khai báo hệ điều hành, phần mềm cài đặt trên EC2 Instance. Tuỳ theo từng AWS Region, AMI Template có các giá trị ID khác nhau. Vì vậy để có được đúng giá trị ID cần tìm trên Region đang sử dụng, chúng ta cần sử dụng câu lệnh query AMI ID thông quan dịch vụ System Manager. Tham khảo Finding a Linux AMI. Trong ví dụ trên, chúng ta sử dụng AMI dựa trên Amazon Linux 2. Đây là một hệ điều hành Linux được tuỳ biến bởi AWS với những tối ưu về hiệu năng, tính ổn định, bảo mật cao thường được áp dụng để phát triển và thực thi những ứng dụng trong môi trường Cloud Computing.

Kết quả thực thi của câu lệnh cho biết giá trị các thuộc tính của EC2 Instance đang được tạo ra (ví dụ: Instance Id, Launch Time, IP Addresses, Networking …)

{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-0f96495a064477ffb",
"InstanceId": "i-0b34dfca2c85f1961",
"InstanceType": "t2.micro",
"KeyName": "FriendReminders",
"LaunchTime": "2020-10-16T06:56:39+00:00",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "ap-southeast-2c",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-10-0-0-235.ap-southeast-2.compute.internal",
"PrivateIpAddress": "10.0.0.235",
"ProductCodes": [],
"PublicDnsName": "",
"State": {
"Code": 0,
"Name": "pending"
},
"StateTransitionReason": "",
"SubnetId": "subnet-07cc3786d0213e553",
"VpcId": "vpc-0c368007553e15d93",
"Architecture": "x86_64",
..........
}
],
"OwnerId": "729365137003",
"ReservationId": "r-0b3ad944b0b2d360f"
}
EC2 Instance Details

Bước 3: Cập nhật Software Packages trên EC2 Instance

  • Với giá trị Public IP 3.26.22.252 của EC2 Instance, thực hiện lệnh kết nối qua SSH:
ssh -i Downloads/FriendReminders.pem ec2-user@3.26.22.252

Lưu ý vị trí của file Keypair FriendReminders.pem khi thực hiện câu lệnh.

  • Cài đặt các cập nhật trên EC2 Instance
sudo yum update
EC2 Software Package Updates

Xác nhận y để tiếp tục quá trình cài đặt.

Kết quả cài đặt kết thúc cho chúng ta biết kết nối thành công giữa EC2 Instance và Internet

EC2 Software Package Updates Completed

Cài đặt PostgreSQL trong Private Subnet

Trong phần thực hành trước, chúng ta đã xây dựng VPC & Public Subnets cho phép các tài nguyên bên trong kết nối với Internet. Dựa trên cấu hình này chúng ta sẽ sử dụng AWS CLI để cài đặt một PostgreSQL Instance trong Private Subnets và sử dụng EC2 Instance để kết nối đến Database Server này.

Bước 1: Cập nhật Security Group của VPC

Do PostgreSQL sử dụng Port 5432 để giao tiếp với client, chúng ta tạo mới một Security Group và bổ sung Firewall Rule cho phép dữ liệu đi qua cổng này.

  • Tạo Database Security Group
aws ec2 create-security-group --group-name DbSecurityGroup --description "PostgreSQL Db Security Group" --vpc-id vpc-0c368007553e15d93

Output

{
"GroupId": "sg-018dfca7421abf14f"
}

Từ giá trị của thuộc tính GroupId này, bổ sung thêm Firewall Rule:

aws ec2 authorize-security-group-ingress --group-id sg-018dfca7421abf14f --protocol tcp --port 5432 --source-group sg-0cadabfe14fe810db

Bằng cách sử dụng --source-group tham chiếu đến Security Group sử dụng bởi EC2 Instance, chúng ta cho phép EC2 Instance kết nối được đến Database Server.

Security Group as Firewall Rule Source

Bước 2: Bổ sung Private Subnets trong VPC

Để tăng khả năng hoạt động ổn định, cấu hình một PostgreSQL Instance yêu cầu sử dụng Subnet Group — tập hợp Subnets thay vì một Subnet đơn lẻ. Do đó, chúng ta cần tạo thêm một Private Subnet trong VPC:

aws ec2 create-subnet --vpc-id vpc-0c368007553e15d93 --cidr-block 10.0.2.0/24 --availability-zone-id apse2-az3

Output

{
"Subnet": {
"AvailabilityZone": "ap-southeast-2b",
"AvailabilityZoneId": "apse2-az3",
"AvailableIpAddressCount": 251,
"CidrBlock": "10.0.2.0/24",
"DefaultForAz": false,
"MapPublicIpOnLaunch": false,
"State": "available",
"SubnetId": "subnet-04df81e949b6fc955",
"VpcId": "vpc-0c368007553e15d93",
"OwnerId": "729365137003",
"AssignIpv6AddressOnCreation": false,
"Ipv6CidrBlockAssociationSet": [],
"SubnetArn": "arn:aws:ec2:ap-southeast-2:729365137003:subnet/subnet-04df81e949b6fc955"
}
}
Public and Private Subnets

Bước 3: Tạo Subnet Group cho PostgreSQL instance

Dựa trên các subnets đã tạo ra trong VPC vpc-0c368007553e15d93, chúng ta tạo Subnet Group cho PostgreSQL instance với lệnh:

aws rds create-db-subnet-group \
--db-subnet-group-name "DbSubnetsGroup" \
--db-subnet-group-description "DB Subnets Group" \
--subnet-ids '["subnet-0116ae0912c2e4bb2","subnet-04df81e949b6fc955"]'

Output

{
"DBSubnetGroup": {
"DBSubnetGroupName": "dbsubnetsgroup",
"DBSubnetGroupDescription": "DB Subnets Group",
"VpcId": "vpc-0c368007553e15d93",
"SubnetGroupStatus": "Complete",
"Subnets": [
{
"SubnetIdentifier": "subnet-0116ae0912c2e4bb2",
"SubnetAvailabilityZone": {
"Name": "ap-southeast-2a"
},
"SubnetOutpost": {},
"SubnetStatus": "Active"
},
{
"SubnetIdentifier": "subnet-04df81e949b6fc955",
"SubnetAvailabilityZone": {
"Name": "ap-southeast-2b"
},
"SubnetOutpost": {},
"SubnetStatus": "Active"
}
],
"DBSubnetGroupArn": "arn:aws:rds:ap-southeast-2:729365137003:subgrp:dbsubnetsgroup"
}
}
Database Subnets Group

Bước 3: Tạo PostgreSQL trong Subnet Group dbsubnetsgroup

Sử dụng câu lệnh tạo database server với cấu hình:

  • --db-instance-identifier: database identifier - dbpostgresql
  • --engine: database engine - postgres
  • --master-username: database username - postgres
  • --master-user-password: database password - password
  • --no-publicly-accessible: không cho phép truy cập từ ngoài VPC
  • --multi-az: database được replicate trên nhiều AZs
  • --allocated-storage: database size 20 GBs
aws rds create-db-instance --db-instance-identifier dbpostgresql \
--db-instance-class db.t2.micro \
--engine postgres \
--master-username postgres \
--master-user-password password \
--allocated-storage 20 \
--no-publicly-accessible \
--multi-az \
--vpc-security-group-ids "sg-018dfca7421abf14f" \
--db-subnet-group-name "dbsubnetsgroup"

Output

{
"DBInstance": {
"DBInstanceIdentifier": "dbpostgresql",
"DBInstanceClass": "db.t2.micro",
"Engine": "postgres",
"DBInstanceStatus": "creating",
"MasterUsername": "postgres",
"AllocatedStorage": 20,
"PreferredBackupWindow": "18:42-19:12",
"BackupRetentionPeriod": 10,
"DBSecurityGroups": [],
"VpcSecurityGroups": [
{
"VpcSecurityGroupId": "sg-018dfca7421abf14f",
"Status": "active"
}
],
"DBParameterGroups": [
{
"DBParameterGroupName": "default.postgres12",
"ParameterApplyStatus": "in-sync"
}
],
"DBSubnetGroup": {
"DBSubnetGroupName": "dbsubnetsgroup",
"DBSubnetGroupDescription": "DB Subnets Group",
"VpcId": "vpc-0c368007553e15d93",
"SubnetGroupStatus": "Complete",
"Subnets": [
{
"SubnetIdentifier": "subnet-0116ae0912c2e4bb2",
"SubnetAvailabilityZone": {
"Name": "ap-southeast-2a"
},
"SubnetOutpost": {},
"SubnetStatus": "Active"
},
{
"SubnetIdentifier": "subnet-04df81e949b6fc955",
"SubnetAvailabilityZone": {
"Name": "ap-southeast-2b"
},
"SubnetOutpost": {},
"SubnetStatus": "Active"
}
]
},
"PreferredMaintenanceWindow": "fri:17:29-fri:17:59",
"PendingModifiedValues": {
"MasterUserPassword": "****"
},
"MultiAZ": true,
"EngineVersion": "12.3",
"AutoMinorVersionUpgrade": true,
"ReadReplicaDBInstanceIdentifiers": [],
"LicenseModel": "postgresql-license",
"OptionGroupMemberships": [
{
"OptionGroupName": "default:postgres-12",
"Status": "in-sync"
}
],
"PubliclyAccessible": false,
"StorageType": "gp2",
"DbInstancePort": 0,
"StorageEncrypted": false,
"DbiResourceId": "db-WORWNTPJEU32KAIZDYUJKLZXEA",
"CACertificateIdentifier": "rds-ca-2019",
"DomainMemberships": [],
"CopyTagsToSnapshot": false,
"MonitoringInterval": 0,
"DBInstanceArn": "arn:aws:rds:ap-southeast-2:729365137003:db:dbpostgresql",
"IAMDatabaseAuthenticationEnabled": false,
"PerformanceInsightsEnabled": false,
"DeletionProtection": false,
"AssociatedRoles": []
}
}
PostgreSQL Database Instance Overview

Kết nối EC2 & PostgreSQL Database Instance

  • Sử dụng SSH kết nối đến EC2 Instance.
ssh -i Downloads/FriendReminders.pem ec2-user@3.26.22.252
  • Cài đặt PostgreSQL Client 12 trên EC2 Instance

Bổ sung Software Repository

sudo tee /etc/yum.repos.d/pgdg.repo<<EOF
[pgdg12]
name=PostgreSQL 12 for RHEL/CentOS 7 - x86_64
baseurl=https://download.postgresql.org/pub/repos/yum/12/redhat/rhel-7-x86_64
enabled=1
gpgcheck=0
EOF

CHÚ Ý

Amazon Linux hỗ trợ amazon-linux-extras để bổ sung các software packages có thể cài đặt trên hệ thống. Postgres cũng có trong danh sách này, tuy nhiên phiên bản PostgreSQL 12 hiện chưa được hỗ trợ tại thời điểm bài viết này.

Sử dụng câu lệnh sau để xác nhận danh sách phiên bản Postgres đang được hỗ trợ

sudo  amazon-linux-extras | grep postgre
  • Cập nhật package index file
sudo yum makecache
  • Cài đặt PostgreSQL Client 12
sudo yum install postgresql12
  • Sử dụng psql command để kết nối đến DB Instance
// psql version
psql --version
// psql host connect
psql -h dbpostgresql.ctcnoszp8xta.ap-southeast-2.rds.amazonaws.com -U postgres
PostgreSQL Client Connect

AWS VPC & CloudFormation

Phương pháp sử dụng CloudFormation để thiết lập và cấu hình AWS VPC có thể tham khảo trong bài viết AWS CloudFormation

Thông tin chi tiết bài viết:

https://www.microservicesvn.com/docs/aws/vpc.html

--

--