0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Gỡ lỗi từ xa ứng dụng Node.js trên ECS với AWS SSM

Đăng vào 2 tháng trước

• 6 phút đọc

Hướng dẫn gỡ lỗi từ xa ứng dụng Node.js trên ECS bằng AWS SSM

Gỡ lỗi một ứng dụng Node.js đang chạy trong một container trong cụm ECS có thể là một thách thức lớn. Việc này trở nên đặc biệt khó khăn trong các môi trường hạn chế như AWS ECS, nơi 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 như SSH hay 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 sử 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 an toàn đến các container Node.js và mở cổng gỡ lỗi mà không làm suy giảm an ninh của hạ tầng.

Mục tiêu bài viết

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 cho một container Node.js bằng cách sử dụng SSM.

Quá trình gỡ lỗi Node.js

Quá trình gỡ lỗi Node.js với cờ --inspect cho phép các nhà phát triển kết nối với một khách hàng 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 Chrome (CDP) cho việc gỡ lỗi.

Các khả năng của Node.js Inspector:

  • Đ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 biến và đối tượng.
  • Phân tích Heap: Chụp và phân tích các bức ảnh sử dụng bộ nhớ để xác định các rò rỉ.
  • Ngăn xếp gọi (Call Stack): Xem chuỗi các cuộc gọi hàm dẫn đến một điểm cụ thể trong việc thực thi.
  • Phân tích hiệu suất (Performance Profiling): Đo lường hiệu suất thực thi mã và phát hiện các điểm nghẽn.
  • Thực thi bước (Step Execution): Thực hiện từng dòng mã một để quan sát cách mà ứ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 đang chờ kết nối.

Các đặc điểm và giới hạn của AWS ECS cho 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 thực thi ứng dụng và máy nơi gỡ lỗi (ví dụ: Chrome DevTools) đang chạy. Quá trình này rất đơn giản trong các môi trường địa phương nhưng phức tạp trong các dịch vụ quản lý đám mây như ECS.

Những 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, khiến cho các phương pháp gỡ lỗi dựa trên SSH trở nên không khả thi.
  • Duy trì an ninh: Mở cổng gỡ lỗi công khai có thể gây ra các 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 các 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 an toàn và chuyển tiếp cổng trên các tác vụ 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 chạy trong ECS.

Bước 1: Chuẩn bị ứng dụng Node.js

Để gỡ lỗi ứng dụng Node.js, nó phải được khởi động với cờ --inspect được kích hoạt. Điều này sẽ mở giao diện gỡ lỗi trên một cổng được chỉ định.

Chỉnh sửa định nghĩa tác vụ ECS để bao gồm lệnh sau:

json Copy
"command": ["node", "--inspect=0.0.0.0:9229", "app.js"]

Dưới đây là một ứng dụng mẫu thử nghiệm mô phỏng rò rỉ bộ nhớ để phân tích:

javascript Copy
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(`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 một số tài liệu Systems Manager (SSM) đã được định nghĩa trước cho các tác vụ khác nhau, và 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 cục bộ của bạn.

Để chuyển tiếp cổng gỡ lỗi Node.js (9229) đến máy cục bộ, hãy chạy:

bash Copy
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.”

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 để gỡ lỗi.

Sử dụng Chrome DevTools để phân tích và gỡ lỗi quy trình Node.js:

Trong khi đó, thông điệp đầu ra của console sẽ hiển thị remote debugger attached.

Thực hành tốt nhất

  • Sử dụng các công cụ phân tích hiệu suất: Hãy tận dụng các công cụ như Chrome DevTools để phân tích hiệu suất và tìm ra các điểm nghẽn.
  • Thực hiện kiểm tra thường xuyên: Đừng chỉ gỡ lỗi khi có vấn đề, hãy làm việc một cách chủ động để phát hiện các vấn đề từ sớm.

Những cạm bẫy phổ biến

  • Không khởi động với cờ --inspect: Đảm bảo rằng bạn đã khởi động ứng dụng với cờ này, nếu không bạn sẽ không thể kết nối được.
  • Quên mở cổng trên máy tính cục bộ: Đảm bảo rằng cổng mà bạn đang cố gắng kết nối không bị chặn bởi tường lửa.

Mẹo hiệu suất

  • Giảm thiểu rò rỉ bộ nhớ: Sử dụng các công cụ như Heap Snapshots để phân tích và giảm thiểu rò rỉ bộ nhớ trong ứng dụng.

Kết luận

Giải pháp này không chỉ an toàn mà còn rất hiệu quả. Cổng gỡ lỗi không cần phải được mở công khai và đường hầm được khởi tạo một cách động giữa máy và container. Ngay cả khi không có inbound/outbound, các nhóm bảo mật cho cụm (hoàn toàn riêng tư, bị cách ly) vẫn có thể truy cập vào các tác vụ. Việc truy cập vào các mạng riêng tư như vậy mà không cần cấu hình mạng bổ sung giúp giảm thiểu chi phí vận hành.

Câu hỏi thường gặp (FAQ)

1. Làm thế nào để tôi biết liệu ứng dụng của tôi có đang chạy gỡ lỗi không?
Bạn có thể kiểm tra đầu ra của console khi khởi động ứng dụng để xác nhận rằng gỡ lỗi đã được bật.

2. Tôi có thể sử dụng gỡ lỗi từ xa trên môi trường sản xuất không?
Có, nhưng hãy đảm bảo rằng bạn đã thiết lập các biện pháp an ninh thích hợp để bảo vệ ứng dụng của mình.

3. Gỡ lỗi từ xa có ảnh hưởng đến hiệu suất ứng dụng không?
Có thể, việc gỡ lỗi có thể làm giảm hiệu suất, vì vậy hãy cân nhắc thực hiện trong môi trường không phải sản xuất khi có thể.

Tài nguyên bổ sung

Chúc bạn thành công trong việc gỡ lỗi ứng dụng Node.js của mình!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào