+10

Phần I: Cấu hình môi trường AWS như dự án thực tế

Tổng quan về những gì mình sẽ làm

Chào mọi người lại là Hiệp 23 tuổi với 24 năm kinh nghiệm đây. Hôm nay mình sẽ tạo mẫu cho các bạn 1 con hàng AWS xịn xò từ a -> z được mình tích lũy kinh nghiệm từ những dự án đã làm. Nào không dài dòng nữa bắt đầu thôi nào ( Nếu các bạn mới bắt đầu và muốn biết thêm về cách tạo tại tài khoản hay là tiếp cận với việc deploy và setup basic 1 project thì có thể ghé qua link bài viết này của mình nha https://viblo.asia/p/cac-buoc-deploy-project-len-aws-ec2-mot-cach-don-gian-tu-a-den-a-yZjJY9zXJOE )

Các service mình sẽ sử dụng và tác dụng, lý do cho việc sử dụng chúng

  1. Đầu tiên và không thể thiếu là nới lưu trữ source code cùng với đó là nơi chúng ta sẽ cấu hình máy server đó chính là service EC2. Ở đây mình sẽ tạo 2 con EC2, một con là máy chủ chính được set up private để bảo mật ( máy này mình gọi nó là máy server ) và một con là máy chủ được đặt public để chúng ta có thể tạo tunnel dùng cho việc ssh truy cập vào máy chủ chính ( máy này mình sẽ gọi nó là bastion )
  2. Service S3 dùng để lưu trữ front-end và các file upload
  3. Cloudfront dùng để phân chia các path ra các nguồn khác nhau. VD như api thì sẽ trỏ vào origin là EC2, upload-file sẽ trỏ vào S3....
  4. RDS dùng để lưu database ( ở đây mình sẽ sử dụng MySQL )
  5. ElasticCache dùng để thiết lập redis để lưu cache
  6. VPC để setup việc bảo mật
  7. Route53 dùng để setup domain mình đã mua bên ngoài
  8. Elastic Beanstalk dùng cho việc deploy sau này
  9. Load balancer để cân bằng tải cũng như là dùng để làm trung gian truy cập vào hệ thống *Note: mình sẽ thực hiện tạo tất cả các sevice trên vùng là us-east-1 nên là để đồng nhất thì trước khi thực hiện bắt tay vào thực hiện thì các bạn nhớ chuyển reigon trước nhé

Các bước tiến hành

Setup VPC

  • Một cách đơn giản, bạn có thể hiểu AWS VPC như một mạng riêng tư trên đám mây của Amazon. Bạn có thể quản lý, kiểm soát truy cập và bảo vệ tài nguyên của mình trong VPC bằng cách sử dụng các tính năng mạng như tường lửa, nhóm bảo mật, route tables và subnet
  • Các thức tạo VPC: Chúng ta hãy vào trang quản lý service VPC và ấn nút tạo VPC. Tiếp đến là setup VPC giống như trong hình, mình sẽ giải thích qua về việc setup như ở dưới đây. Đầu tiên thì mình muốn tối giản do đây chỉ là 1 project mẫu nên mình sẽ chỉ chọn 1 public subnet và 1 private subnet ở trên 1 Available zone. Ở trên private subnet thì chúng ta sẽ để máy server lên trên đấy và để tăng tính bảo mật thì mình sẽ không để nó trực tiếp kết nối với internet gateway mà nó sẽ kết nối thông qua 1 cái là NAT gateway. Lý do là NAT gateway sẽ được gán cho 1 elastic IP và dùng IP này để kết nối internet và là chạm trung chuyển internet đến với cái service trong private subnet khiến cho máy server của chúng ta sẽ không bị lộ IP khi kết nối internet. Còn máy bastion mình sẽ để ở trên public subnet để ta có thể build source code rồi từ bastion chúng ta mới deploy source lên server cũng như là thông qua máy bastion chúng ta sẽ có thể ssh vào máy server.

Setup service EC2 máy bastion

Bước 1: Mọi người hãy vào trang quản lý service EC2 cùng với đó là ấn vô mục Launch instance để tiến hành khởi tạo service EC2
Bước 2: Chúng ta sẽ tiến hành setup con bastion trước, mọi người hãy setup giống như trong hình dưới đây. Ở phần key pair mọi người hãy nhớ tạo key pair cho riêng mình rồi lưu nó ở một nơi dễ tìm thấy nhé ( cái key này rất quan trọng đấy ). Ngoài ra mình sẽ giải thích qua về đoạn setup này. Về cấu hính máy thì mình sẽ chọn t2 micro để có thể sử dụng miễn phí trong 1 khoảng thời gian đầu, còn về hệ điều hành thì mình chọn Amazon Linux 2 thay vì default là bản 2023 do tính ổn định cũng như các công cụ và việc giải đáp câu hỏi thì bản Linux 2 được cộng động support nhiều hơn. Key pair thì mình đã nói ở trên rồi, còn về phần subnet thì mình sẽ đặt con bastion ở trên public subnet của VPC mà mình vừa tạo ở trên. Máy bastion sinh ra để làm máy build, deploy code cùng với đó là máy mà ta sẽ set up tunnel để ssh vào máy server chính nên về phần security group thì mình sẽ mở quyền truy cập cho mọi nơi.



Setup service Elastic Beanstalk cùng với Ec2 máy server

Bước 1: Mọi người hãy tìm kiếm service Elastic Beanstalk và ấn vô phần tạo application rồi tiến hành cấu hình step 1 ( config environment ) như trong hình phía dưới rồi ấn tạo


Bước 2: Mọi người tiếp tục setup step 2 ( Configure service access ) như trong hình. Ở đây chỗ mục EC2 key pair thì mình chọn luôn cặp key pair của con máy bastion, bạn có thể tạo 1 cái mới cũng được nhưng hãy nhớ là phải để ở 1 nơi mà bạn có thể tìm thấy được nha. Còn về EC2 instance profile nghĩa là bạn sẽ chọn IAM Role để gắn vào EC2 nên là bạn nên tạo 1 cái IAM Role có đầy đủ quyền truy cập vào S3, Beanstalk, loadbalancer. cloudfron trước nha

Bước 3: Set up networking, database, and tags. Mọi người hãy tiếp tục cài đặt giống như trong ảnh dưới đây. Ở trong hình dưới đây mình đã chọn VPC chính là cái VPC mình đã tạo ở trên, cùng với đó là tạo 1 EC2 instance ( chính là con máy server ) nằm trên subnet private của VPC. Phần database thì mình không chọn ji cả do mình ko muốn gắn DB vào Beanstalk để tránh việc khi mà xóa Beanstalk sẽ xóa luôn cả DB

Bước 4: Configure instance traffic and scaling. Đoạn này thì bạn cứ để y nguyên như setup default mình chỉ sửa là xóa cái t3.small ở đoạn chọn Instance type thôi (tại đây là project ví dụ nên mình xóa cái small đi để được free) và chọn option Load balancer thay vì là single instance

Bước 5: Configure updates, monitoring, and logging. Ở series lần này thì mình sẽ không quá chú trọng trong việc log nên mình sẽ setup đoạn log như trong hình dưới đây còn các phần khác thì mình sẽ để nguyên setup default.

Bước 6: Review qua 1 lượt rồi bạn ấn vô nút submit để tiến hành tạo Beanstalk cùng với đó là EC2 server. Sau khi ấn submit thì service beanstalk của chúng ta sẽ được tiến hành tạo và nó sẽ mất khoảng 1-3p để tạo xong. Sau khi tạo xong thì nó sẽ ra thông báo giống hình ảnh dưới đây nghĩa là bạn đã tạo thành công rồi nhé

Tạo bucket trên S3 để lưu folder FE cùng với đó là folder upload

Ở bước này thì mình không có gì để nói nhiều cả vì các setting default đều tối ưu hết rồi, bạn chỉ cần ấn nút tạo Bucket rồi đặt tên 2 bucket 1 là FE, 1 là upload-file là được. Ngoài ra thì các bạn hãy tạo cho mình ở mỗi bucket 1 file index.html với nội dung tùy ý để đến đoạn setting cloudfront chúng ta có thể setting default root và trỏ tới.

Setup tên miền mua ngoài (TenTen) trỏ vào Route53 và thiết lập ACM

Ở bước này thì mình đã mua sẵn 1 cái tên miền ở bên TenTen, mọi người cũng có thể lên các trang khác để mua domain rồi thực hiện các setup sau đây để trỏ domain về service Route53 ( service quản lý domain của bên AWS ). Bước 1: Bạn vào service Route53 rồi ấn vào mục tạo hosted zone, sau đó bạn đặt tên hosted zone của bạn là tên miền mà bạn đã mua
Bước 2: Bạn ấn vào hosted zone mà bạn vừa tạo, nó sẽ hiển thị ra các record trong hosted zone của bạn. Bạn để ý record có type là NS, bạn copy 4 cái NS đấy rồi sang bên trang quản lý domain bạn đã mua rồi add 4 cái NS đấy vào phần cài đặt NS và bùm, domain của bạn đã được kết nối với route 53
Bước 3: Chúng ta sẽ cùng nhau thiết lập luồng HTTPS cho domain của chúng ta thông qua service ACM ( certificate managerment ). Đầu tiên là mình vào service ACM rồi mình ấn vô button request để tiến hành request certificate HTTPS của riêng chúng ta.
Bước 4: Ở phần Request public certificate thì chúng ta nhập tên miền mà chúng ta đã mua vào ( giả sử của mình thì mình sẽ nhập là devops-test.click ). Rồi các bạn sẽ ấn nút submit request để tiến hành tạo
Bước 5: Tiếp đến chúng ta sẽ vào certificate mà chúng ta vừa tạo request. Ở đây các bạn hãy ấn vô nút Create record in Route53 và chọn cái hosted zone lúc nãy chúng ta đã tạo ở Route53 rồi ấn tạo record. Sau 1 khoảng thời gian khoảng vài phút thì certificate của chúng ta sẽ được chấp thuận và chuẩn bị tiến hành đễn bước cuối cùng nào

Setup CloudFront để chia luồng FE vs BE

Chào mừng mọi người đến với bước cuối cùng trong phần đầu tiên của series này. Ở bước này chúng ta sẽ tạo cloudfront để trỏ vào các bucket cũng như là load balancer mà chúng ta đã tạo từ trước.
Bước 1: Đầu tiên các bạn vào trong service EC2 và ấn vô mục load balancer để tiến hành setup load balancer trước nhé. Ở đây các bạn hãy ấn vào phần load balancer đã được chúng ta tạo ở mục elastic beanstalk, kéo xuống và ấn vô phần add listener trong phần Listeners and rules.
Bước 2: Ở phần setup listener thì các bạn hãy setting giống như hình dưới đây. Ở đây thì chúng ta sẽ tiến hành setting việc lắng nghe kết nối https của load balancer và add chứng chỉ ACM mà chúng ta đã tạo ở trên kia. Giải thích qua thì phần target group chính là group EC2 mà ta đã tạo ở phần elastic beanstalk


Bước 3: Chọn tab security group của load balancer và ấn vô security group mà load balancer đang sử dụng, ấn vô phần edit inbound rule rồi setup mở cổng 80 và 443 để có thể truy cập từ bên ngoài

Bước 4: Sau khi hoàn thành setup bên serice load balancer thì chúng ta sẽ tiếp tục tiến hành setup Cloudfront để có thể trỏ vào các luồng của chúng ta. Đầu tiên các bạn hãy vào service Cloufront và tạo cho mình 1 cái distribution. Ở phần setting thì mọi người hãy làm giống như trong hình dưới đây, thì đầu tiên chúng ta sẽ cho cloudfront trỏ tới bucker FE của chúng ta để default khi truy cập nó sẽ truy cập tới bucker FE. Về việc kết nối với bucket FE thì mình chọn kết nối thông qua Origin access control setting, các bạn ấn vô nút create control setting để tạo mới 1 cái control setting rồi chọn nó ở cái drop down. Chúng ta sẽ chọn là Redirect HTTP to HTTPS ở mục viewer, add cname là domain chúng ta đã mua và chọn ssl certificate mà chúng ta đã tạo ở ACM để hoàn thành setting Cloudfront trỏ đến bucket FE của chúng ta.





Bước 5: Các bạn phải setting permission ở bên S3 để cho bên Cloudfront có thể trỏ được tới đây. Các bạn vào bucker FE của bạn, ấn vô mục permission rồi kéo xuống mục bucket policy. Ở đây các bạn ấn nút edit để tiến hành edit policy. Dưới đây là đoạn mã policy của mình, mọi người hãy copy đoạn mã dưới đây paste vào phần của các bạn rồi đổi lại tên bucket và arn của cloudfront các bạn

{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": {
				"Service": "cloudfront.amazonaws.com"
			},
			"Action": [
				"s3:GetObject",
				"s3:ListBucket"
			],
			"Resource": [
				"arn:aws:s3:::your-bucket-name",
				"arn:aws:s3:::your-bucket-name2/*"
			],
			"Condition": {
				"StringEquals": {
					"AWS:SourceArn": "your-cloudfront-arn"
				}
			}
		}
	]
}


Bước 6: Các bạn vào lại service Cloudfront, vào cái distribution mà chúng ta vừa tạo ở bước 4. Ở đây các bạn tạo thêm 1 origin trỏ đến bucket S3 upload-file, phần setting thì setting y hệt bước 4 và 5, chỉ thay đổi tên bucket thôi
Bước 7: Tiếp tục tạo origin đến load balancer. Ở bước này thì các bạn sẽ tiến hành setting như trong hình dưới đây

Bước 8: Tạo behavior trong distribution, đầu tiên mình sẽ tạo behavior cho path /api/* ( nghĩa là khi gõ /api trên uri thì nó sẽ được trỏ qua origin load balancer để trỏ vào server BE để xử lý ). Các bạn có thể setting như trong hình dưới đây


Bước 9: Tạo behavior trỏ đến origin của bucket upload-file

Bước 10: Sau khi tạo các bước trên thành công và mục last modified ở màn general hết hiển thị chữ pending thì chào mừng mọi người đã hoàn tất việc setting hệ thống server của chúng ta. Các bạn có thể truy cập qua domain của các bạn để ngắm nhìn thành quả thôi

Tổng kết

Đây là phần mở đầu trong series này, phần này chúng ta đã hoàn thành tạo dựng 1 hệ thống hoàn chỉnh, tiếp đến phần sau chúng ta sẽ tiến hành triển khai, xây dựng code FE và BE cùng với đó là setting env để kết nối với RDS và Elasticache nha. Nếu bạn thấy hay hãy cho mình một upvote để cho mình thêm động lực làm nha. Ngoài ra mình tạo ra series này để giúp mọi người có thêm góc nhìn về AWS và mình cũng vừa làm vừa tìm hiểu nên là nếu có bất kỳ chỗ nào chưa đúng hoặc có câu hỏi hay có lỗi gì trong phần setting mà chưa giải quyết được thì đừng ngần ngại comment cho mình nhé. Cảm ơn bạn vì đã bỏ thời gian và công sức để đọc đến những dòng cuối cùng này. Tạm biệt và hẹn gặp lại mọi người ở phần tiếp theo nhé ❤️.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.