Chuyên mục Cloud - CloudFormation AWS (P2)

1. Giới thiệu:

Tiếp theo bài viết lần trước, lần này mình sẽ giới thiệu cụ thể 1 template để tạo ra được môi trường dùng cho production nhé. Đây là mô hình cụ thể:

Môi trường này rất cơ bản về mặt cấu trúc bao gồm:

  • 1 VPC
  • 4 Subnet (bao gồm: 2 public subnet, 2 private subnet) mỗi subnet thuộc availability zone riêng
  • 1 internet gateway
  • 1 nat gateway
  • 1 bastion host trên subnet public (aws admin trên hình)
  • 1 application load balancing
  • 1 auto scale cho web

OK giờ thì thực hiện nào.

2. Build

Về chi tiết full template thì các bạn có thể xem ở đây nhé. Nói qua về template thì region mình chọn ở đây là Ohio - us-east-2. nên các bạn muốn làm trên Region khác thì chỉnh sửa hết những thành phần us-east-2. AvailabilityZone thì chuyển tương ứng. Ở đây mình có us-east-2aus-east-2b.

AMI dùng để tạo instance là dùng: ami-f6035893 đây nhé

2.1. Network

2.1.1. VPC

Ai cũng biết VPC là thành phần cốt lõi của các dịch vụ aws, dịch vụ gì cũng phải có VPC mới có thể chạy được. Ở đây mình tạo 1 VPC với dải mạng là: 10.0.0.0/16. Lưu ý: các bạn bỏ qua phần Metadata có trong này nhé. Vì nó chỉ để xác định vị trí trên hình ảnh của CloudFormation mà thôi.

Code VPC

2.1.2. Subnet Public

Phần Subnet này cần quan tâm tới: CidrBlock - dải mạng của Subnet. AvailabilityZone - zone của Subnet MapPublicIpOnLaunch - cấp IP Public cho instance

Có các thành phần chính: 2 public subnet

  • myPublicSubneta: dải mạng của subnet a
  • mySubnetRouteTableAssociationa: attach route vào subnet a
  • mySubnetNetworkAclAssociationa: attach access list vào subnet a
  • myPublicSubnetb: dải mạng của subnet b
  • mySubnetRouteTableAssociationb: attach route vào subnet b
  • mySubnetNetworkAclAssociationb: attach access list vào subnet b

Code Subnet Public

2.1.3. Route, Internet Gateway

Các thành phần:

  • myPublicRoute: tạo route chính cho các public subnet
  • myInternetGateway: gateway ra internet của public subnet
  • myPublicRouteTable: route table để gán Route vào

Code Route, Internet Gateway

2.1.4. Network Access List cho Public Subnet

Các thành phần chính:

  • myNetworkACL: access list cho public subnet
  • myNetworkAclEntry1 -> myNetworkAclEntry12: các rule được gán vào ACL

Code Network Access List cho Public Subnet

2.1.5. Private Subnet

Các thành phần chính cũng tương tự Public Subnet: 2 Private subnet

  • myPrivateSubneta
  • myPrivateSubnetRouteTableAssociationa
  • myPrivateSubnetNetworkAclAssociationa
  • myPrivateSubnetb
  • myPrivateSubnetRouteTableAssociationb
  • myPrivateSubnetNetworkAclAssociationb

Code Private Subnet

2.1.6. Route, Nat Gateway, Elastic IP

Các thành phần chính:

  • myPrivateRouteTable: Route table của private subnet
  • myPrivateRoute: Các rule trong Route
  • myNatGateway: gateway cho subnet private (tạo trên public subnet)
  • myEIP: elastic IP để gán vào Nat gateway

Code Route, Nat Gateway, Elastic IP

2.1.7. Network Access List cho Private Subnet

Cũng giống như ACL cho Public Subnet

Code Network Access List for Private Subnet

2.2. EC2 & CloudWatch

2.2.1. Security Group

Tạo 3 security group cho:

  • Application Load Balancing
    • Inbound:
      • allow port 80 from all
      • allow port 443 from all
    • Outbound:
      • allow all
  • Bastion Host
    • Inbound:
      • allow port 22 from all
    • Outbound:
      • allow all
  • Web
    • Inbound:
      • allow port 22 from bastion host
      • allow port 80 from ALB
      • allow port 443 from ALB
    • Outbound:
      • allow all

Code Security Group

2.2.2. Load Balancing

Ở đây mình tạo Application Load Balacing nhé. Bao gồm các thành phần:

  • myTargetGroup: để forward package từ ALB vào
  • myLoadBalancer: application load balancing cần tạo
  • myListener: Listen port 80 trên LB

Code Load Balancing

2.2.3. Auto Scale

Gồm các thành phần:

  • myAutoScale: min 1 instance, max 3 instance (các bạn có thể tự chỉnh số lượng instance ở đây)
  • myLaunchConfig: launch config để sử dụng cho auto scale (các instance web sử dụng user data để install nginx)
  • WebServerScaleUpPolicy: rule tăng instance. Cooldown 1'.
  • WebServerScaleDownPolicy: rule giảm instance. Cooldown 1'.
  • CPUAlarmHigh: scale up khi CPU > 80% trong 10'
  • CPUAlarmLow: scale down khi CPU < 40% trong 10'

Code Auto Scale

2.2.4. Bastion Host

Tạo bastion instance (trực thuộc myPublicSubneta)

Code Bastion Host

2.2.5. Type instance

Để tạo CloudFormation với quyền lựa chọn Loại Instance nào thì chúng ta cần tạo trường Parameter và Mapping cho các loại instance đó:

Code Parameter & Mapping

3. Create stack

Nào giờ create stack va run thử xem nào. Đây là quá trình tạo và hoàn thiện nhé.

Lúc tạo stack, các bạn nhớ tạo KeyName trước nhé. rồi chọn Type instance

CloudFormation đang tạo các Resource tương ứng:

Các resource khi tạo xong:

  • VPC
  • Public Network Access List

  • Private Network Access List

  • Security Group

  • Auto scaling

  • Application LB

Sau khi hoàn thiện xong, các bạn có thể kiểm tra ALB xem đã hoạt động chưa

Nếu bạn bị lỗi 504 Bad Gateway, đừng lo, hãy ssh vào con web instance và thực hiện lại bước install & run nginx nhé. Đợi 1 chút để healthcheck ok là xong.

Vậy là xong phần cơ bẩn nhất của môi trường production rồi. Các bạn có thể tạo thêm các service khác phục vụ đúng yêu cầu của mình nữa là ok rồi. Quá nhanh quá nguy hiểm phải không các bạn 😄


All Rights Reserved