Mục lục
1. Mở đầu
Nếu đã từng làm việc với AWS hẳn nhiều người cũng biết đến các dịch vụ Load Balancer (viết tắt là LB), ECS, EC2. Việc thao tác cấu hình luồng dữ liệu từ LB tới các service trong ECS thông qua EC2 khá là phức tạp nên bài này mình muốn ghi chú lại một số giải thích và cách cấu hình.
Bài viết phần lớn dựa trên kinh nghiệm làm việc của mình nên có phần nào chưa đúng mong các bạn chỉ giúp cho.
Mục tiêu của bài:
- Giải thích và cấu hình được luồng dữ liệu từ client (browser) tới các service trong ECS.
- Giải thích ngắn gọn các dịch vụ liên quan bao gồm:
- Load Balancing: load balancer, target group, target, security group, health check.
- EC2 instance.
- ECS: cluster, task definition, service, task.
2. Các khái niệm cơ bản
2.1. EC2 instance
EC2 viết tắt của Elastic Compute Cloud, hãy hiểu nó là một cái server hay là cái máy tính của chúng ta, thông số của nó bao gồm số CPU core, RAM và tốc độ mạng (Xem chi tiết các thông số tại https://aws.amazon.com/ec2/instance-types/).
2.2. Load balancing
Khi có traffic đi từ client (browser) tới Load balancer (LB), LB sẽ dựa vào cấu hình nằm trong Listener và Rule để điều hướng traffic vào Target có Health check là healthy.
Load balancing trong aws bao gồm:
2.2.1. Load balancer (LB)
Cái này chắc nhiều người đã nghe rất nhiều rồi, nó là cái cân bằng tải để điều hướng các traffic từ internet vào một hay nhiều mục tiêu (target) nào đó.
- LB có một tab quan trọng là Listeners dùng để quản lý các Target Group:
- Rule trong LB: là nơi để cấu hình traffic nào sẽ vào target group nào:
Như bạn thấy ở hình trên, traffic mặc định sẽ được điều hướng vào target group tên là ecs-default...
, ấn vào View/edit rules
sẽ cho ta màn hình cấu hình chi tiết:
Ở hình trên: dòng đầu tiên mình cấu hình là nếu traffic đến từ host nào đó (vd daovanhung.com chẳng hạn) thì nó sẽ được LB điều hướng tới target group tên là ...-test
, còn lại sẽ được điều hướng tới target group tên là ecs-default-...
.
2.2.2. Target Group và Target
- Target group là nơi chứa thông tin của các target:
Mỗi target group chỉ cấu hình 1 phương thức là http hoặc https, nếu bạn muốn cấu hình cho cả 2 phương thức này thì phải tạo 2 target group.
Mỗi target group sẽ chỉ định traffic đi vào một IP, một dải IP hoặc một server (EC2 instance) nào đó.
- Target trong load balancing chính là nơi để các traffic được LB điều phối đi vào, trong trường hợp này thì target chính là EC2 instance nào đó (được xác định bằng
instance ID
ở hình trên).
2.2.3. Security group
Như đã giải thích ở trên ta có thể thấy LB chính là cửa ngõ để traffic giao tiếp với các dịch vụ của chúng ta. Địa chỉ IP của LB sẽ được public trong internet và sẽ được cấu hình trong Domain name servers để các requests tới host name chính là đi tới LB.
Ở tab Description của LB có thông tin về DNS name
, đây là tên public của LB để cấu hình trong DNS:
Nếu bạn gắn một security group nào đó vào LB thì kéo xuống dưới bạn sẽ thấy một mục tên là Security Group:
Security Group là nơi để quy định Inbound và Outbound:
- Inbound: quy định traffic từ internet có phương thức nào, cổng bao nhiêu và địa chỉ IP nào thì có thể đi vào LB
Source: 0.0.0.0/0
nghĩa là mọi địa chỉ IP có thể được LB tiếp nhận traffic.
- Outbound: Quy định traffic nào có thể đi từ trong EC2 ra khỏi LB.
Chú ý:
- Nếu gắn security group vào LB thì phải đảm bảo rằng rule trong security group này phải bao gồm rule được thiết đặt trong listener và healthcheck của LB.
2.2.4. Health check
Là phần cấu hình để kiểm tra xem một target còn hoạt động hay không, nếu còn hoạt động thì LB mới có thể hướng traffic vào còn không thì sẽ không được điều hướng vào.
- Protocol là phương thức mà LB sử dụng để check.
- Path là đường dẫn để check xem còn sống hay không.
- Port là cổng để request check đi vào, mặc định sẽ là cổng mà target nhận traffic thông thường.
- healthy threshold là số lần liên tiếp một unhealthy target trả về kết quả healthy để LB đưa nó trở lại là healthy target.
- unhealthy threshold là số lần liên tiếp một healthy target trả về kết quả unhealthy để LB xem nó là unhealthy target.
- timeout là thời gian LB chờ kết quả trả về, nếu quá thì LB sẽ xem kết quả trả về là unhealthy.
- interval là khoảng thời gian gần đúng giữa 2 lần check của LB.
- success codes là kết quả mà trạng thái healthy mong muốn trả về cho LB, thường là 200.
2.3. ECS
ECS viết tắt của Elastic Container Service, nói một cách đơn giản nó là nơi để quản lý máy ảo (docker) chạy trên EC2 instance.
2.3.1. Cluster
Là 1 cụm các service, có thể bao gồm một hoặc nhiều EC2 instantce, nhưng một EC2 instance chỉ thuộc về 1 ECS cluster duy nhất.
2.3.2. Service
Theo đúng nghĩa đen, là một dịch vụ nào đó nằm trong cluster. Ví dụ ở hình trên đầu bài thì ECS cluster có 3 service khác nhau là service 1
, service 2
và service 3
.
Chú ý: Khi bạn tạo ECS service chạy Fargate thì:
- Nếu cài đặt Load Balancer lên service thì phải cấu hình cho nó sử dụng VPC subnet mà Load Balancer đang sử dụng.
- Auto-assign public IP phải chọn ENABLE để lúc task khởi chạy có thể pull image từ ECR về, nếu bạn chọn DISABLE thì phải cài đặt NAT.
2.3.3. Task
Là một ứng dụng (task) trực thuộc về một ECS service nào đó. Mỗi một task được khởi chạy trong một docker container.
Khi khởi chạy một service, nhập Number of tasks để chọn số task chạy service đó.
Chú ý: Khi các task được khởi chạy, mỗi task sẽ random thuộc về một EC2 instance bất kỳ nằm trong cluster chứa, và sẽ có cổng docker container cũng được random nếu không cấu hình cố định trong task definition.
Các task thuộc cùng 1 service sẽ giống nhau, chúng chỉ có thể khác nhau cổng vào vì mỗi task là một docker container, bạn có thể tưởng tượng ECS service chính là docker image, còn ECS task chính là docker container, mỗi docker image có thể khởi chạy nhiều docker container giống nhau.
Ví dụ ở hình trên đầu bài thì service 1
sẽ có 3 task, service 2
và service 3
mỗi service có 2 task.
2.3.4 Task definition
Là nơi để cấu hình và cài đặt các thông số cho docker container chạy task.
Lưu ý: Bình thường với cấu hình mặc định của task definition, khi bạn khởi động hay tái khởi động một task thì docker container của nó sẽ nằm trong một EC2 instance bất kỳ nằm trong cluster chứa. Trong trường hợp bạn muốn khi truy cập tới task đó với một địa chỉ IP cố định (ví dụ bạn muốn server elastic search của mình phải nằm ở IP xác định để cấu hình vào file env) thì phải cấu hình cho task nằm trong một EC2 instance cố định bằng cách cấu hình vào placementConstraints
trong task definition:
"placementConstraints": [
{
"type": "memberOf",
"expression": "ec2InstanceId == i-123456789"
}
]
JSON
3. Luồng dữ liệu đi từ internet vào ECS task
Như đã nói ở trên, khi cấu hình DNS để hostname trỏ vào LB, các requests sẽ được LB điều phối vào các target có trạng thái healthy. LB chỉ có thể cấu hình request vào target group nào đó chứ không thể cấu hình cho request vào ECS service nào đó được.
Chú ý: Khi chạy một ECS service có gắn với một LB thì phần cấu hình tự sinh của task đó sẽ được tự động thêm vào target group:
Cấu hình LB vào ECS service, bạn phải chỉ định LB và target group của LB đó:
task sẽ được tự động thêm vào target group cùng với cổng mặc định của task.
Vì lý do trên nên ta không thể chỉ định traffic nào đó vào một ECS service nào đó nếu chỉ sử dụng một target group.
Ví dụ bạn có 2 domain daovanhung.com và daovanhung2.com, bạn muốn daovanhung.com phải đi vào service_1 và daovanhung2.com phải đi vào service_2. Vì khi khởi chạy service_1 và service_2, cả 2 đều có thể nằm trong cùng một EC2 instance và có cổng khác nhau, nếu bạn cấu hình service_1 và service_2 cùng dùng chung một target group thì request đi vào target group này sẽ random đi vào service_1 hoặc service_2. Muốn cấu hình như ý muốn thì hãy sử dụng 2 target_group và sửa rule trong LB để daovanhung.com đi vào target_group_1 còn daovanhung2.com thì đi vào target_group_2.
Link tham khảo: