Gỡ lỗi từ xa ứng dụng Node.js chạy trong cụm ECS bằng AWS SSM
Gỡ lỗi một ứng dụng Node.js chạy bên trong một container trong cụm ECS có thể là một thách thức lớn. Thách thức này trở nên đáng kể hơn trong những môi trường hạn chế như AWS ECS, nơi mà bạn không có quyền kiểm soát trực tiếp đối với các tác vụ đang chạy. Các phương pháp gỡ lỗi truyền thống, chẳng hạn như SSH hoặc mở cổng, thường không khả thi trong các thiết lập này.
AWS cung cấp một giải pháp an toàn và hiệu quả thông qua AWS Systems Manager (SSM). Bằng cách tận dụng các tài liệu SSM và chuyển tiếp cổng, bạn có thể thiết lập kết nối một cách an toàn tới các container Node.js của mình và mở cổng gỡ lỗi mà không làm mất an toàn cho cơ sở hạ tầng của bạn.
Trong bài viết này, chúng ta sẽ đi qua các bước để thiết lập và thực hiện gỡ lỗi từ xa một container Node.js bằng SSM.
Gỡ lỗi Node.js
Quá trình gỡ lỗi Node.js sử dụng cờ --inspect cho phép các nhà phát triển kết nối với một client gỡ lỗi (như Chrome DevTools) để phân tích hành vi của ứng dụng theo thời gian thực.
Node.js sử dụng Giao thức DevTools của Chrome (CDP) để gỡ lỗi.
Khả năng của Trình gỡ lỗi Node.js:
- Điểm dừng (Breakpoints): Tạm dừng thực thi tại các dòng cụ thể để kiểm tra trạng thái của các biến và đối tượng.
- Phân tích Heap: Chụp và phân tích các snapshot về mức sử dụng bộ nhớ để xác định các vị trí rò rỉ.
- Call Stack: Xem chuỗi các cuộc gọi hàm dẫn đến một điểm cụ thể trong quá trình thực thi.
- Phân tích Hiệu suất: Đo lường hiệu suất của quá trình thực thi mã và phát hiện các điểm nghẽn.
- Thực thi từng bước: Thực hiện từng dòng mã một để quan sát cách ứng dụng tiến triển.
Nếu thành công, bạn sẽ thấy đầu ra cho biết rằng cổng đã được chuyển tiếp và phiên gỡ lỗi đang chờ kết nối.
Các vấn đề và hạn chế của AWS ECS khi thiết lập gỡ lỗi
Thách thức chính trong việc gỡ lỗi từ xa là cho phép chuyển tiếp cổng giữa môi trường runtime của ứng dụng và máy tính nơi chạy debugger (chẳng hạn như Chrome DevTools). Quá trình này rất đơn giản trong các môi trường cục bộ nhưng trở nên phức tạp trong các dịch vụ quản lý đám mây như ECS.
Các thách thức chính bao gồm:
- Thiếu quyền truy cập trực tiếp vào hạ tầng cơ sở: ECS quản lý các phiên bản container, làm cho các phương pháp gỡ lỗi dựa trên SSH không thể thực hiện được.
- Đảm bảo an ninh: Mở cổng gỡ lỗi ra công khai có thể tạo ra lỗ hổng bảo mật.
- Chuyển tiếp cổng một cách an toàn: Đảm bảo rằng cổng gỡ lỗi chỉ có thể truy cập bởi những khách hàng được ủy quyền trong khi vẫn giữ các cấu hình IP riêng tư.
AWS SSM giải quyết những vấn đề này bằng cách cho phép thực thi các lệnh và chuyển tiếp cổng an toàn trên các khối lượng công việc từ xa, cung cấp một giải pháp mạnh mẽ cho việc gỡ lỗi các ứng dụng đang chạy trên ECS.
Bước 1: Chuẩn bị ứng dụng Node.js
Để gỡ lỗi ứng dụng Node.js, bạn cần khởi động nó với cờ --inspect được bật. Điều này sẽ mở giao diện gỡ lỗi trên một cổng được chỉ định.
Sửa đổi định nghĩa tác vụ ECS để bao gồm lệnh sau:
json
"command": ["node", "--inspect=0.0.0.0:9229", "app.js"]
Dưới đây là một ứng dụng mẫu để mô phỏng tình trạng rò rỉ bộ nhớ cho việc phân tích:
javascript
const memoryLeakArray = [];
function createLeak() {
const leakObject = {
timestamp: new Date(),
data: Buffer.alloc(1024 * 1024) // Cấp phát 1MB bộ nhớ
};
memoryLeakArray.push(leakObject);
}
function printMemoryUsage() {
const used = process.memoryUsage();
console.log(`Mức sử dụng bộ nhớ: ${Math.round(used.heapUsed / 1024 / 1024)} MB`);
}
async function runLoop() {
while (true) {
createLeak();
printMemoryUsage();
await new Promise(resolve => setTimeout(resolve, 1000)); // Đợi 1 giây
}
}
console.log("Bắt đầu mô phỏng rò rỉ bộ nhớ...");
runLoop();
Sau khi thực hiện thay đổi này, hãy triển khai lại tác vụ ECS.
Bước 2: Sử dụng SSM để kết nối với Container
AWS cung cấp nhiều tài liệu Systems Manager đã được định nghĩa trước cho các tác vụ khác nhau, và tài liệu AWS-StartPortForwardingSession là một trong số đó. Tài liệu này cho phép chuyển tiếp cổng an toàn từ một tài nguyên AWS (chẳng hạn như một container ECS) đến máy tính của bạn.
Để chuyển tiếp cổng gỡ lỗi Node.js (9229) đến máy tính của bạn, hãy chạy:
bash
aws ssm start-session \
--target ecs:<tên-cụm>_<id-tác-vụ>_<id-runtime-container> \
--document-name AWS-StartPortForwardingSession \
--parameters '{"portNumber":["9229"], "localPortNumber":["9229"]}'
Bước 3: Gỡ lỗi ứng dụng
Mở Chrome và điều hướng đến chrome://inspect.
Dưới “Remote Target,” tìm phiên gỡ lỗi đã được chuyển tiếp và nhấp vào “Inspect.”
Theo mặc định, Chrome được cấu hình với cổng 9229, nhưng bạn có thể sử dụng bất kỳ cổng tùy chỉnh nào đã được quyết định cho việc gỡ lỗi.
Sử dụng Chrome DevTools để phân tích và gỡ lỗi quy trình Node.js:
Cùng lúc đó, trong đầu ra console sẽ có thông báo remote debugger attached.
Mức sử dụng bộ nhớ: 3 MB
Debugger attached.
Mức sử dụng bộ nhớ: 3 MB
Giám sát vòng lặp sự kiện:
Phân tích các snapshot heap để xác định các vị trí rò rỉ bộ nhớ:
Thực hiện bước qua quá trình thực thi mã để xác định các vấn đề:
Kết luận
Điều tuyệt vời của giải pháp này là tính an toàn cao - cổng gỡ lỗi không cần phải được mở công khai, đường hầm được khởi tạo một cách động giữa máy tính và container. Ngay cả khi không có inbound/outbound, các nhóm an ninh cho cụm (hoàn toàn riêng tư và cách ly) cũng cho phép chúng ta truy cập vào các khối lượng công việc. Và việc truy cập vào các mạng riêng như vậy mà không cần cấu hình mạng bổ sung giảm thiểu gánh nặng vận hành.