AWS — Virtual Private Network
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
đến10.0.1.255
10.0.2.0/24
: tương ứng 256 IP, từ10.0.2.0
đến10.0.2.255
Trong trường hợp đặc biệt, CIDR 0.0.0.0/0
và ::/0
đại diện cho tất cả các giá trị IPv4 và IPv6.
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
}
]
}
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 rtb-789c091e
định nghĩa routes tương ứng với CIDR blocks:
172.31.0.0/16
- liên kết với Gatewaylocal
cho phép các kết nối bên trong VPC0.0.0.0/0
- liên kết với Internet Gatewayigw-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}"
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 AZap-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 AZap-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"
}
]
rtb-03b553d32582452d5
with Custom VPCrtb-03b553d32582452d5
with Custom SubnetsCà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
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.
- 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"
}
]
}
- 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"
}
}
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 AZap-southeast-2c
- Private Subnet —
subnet-0116ae0912c2e4bb2
: hoạt động trên AZap-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"
}
]
}
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"
}
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
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
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.
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"
}
}
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"
}
}
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": []
}
}
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
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: