Lambda là một dịch vụ tính toán không máy chủ an toàn và có khả năng mở rộng cao, nơi mỗi hàm hoạt động trong một môi trường thực thi biệt lập với các ranh giới bảo mật nghiêm ngặt. Kiến trúc này mang lại những lợi thế chính, chẳng hạn như tăng cường bảo mật, mở rộng tự động khả năng tính toán và giảm thiểu chi phí vận hành. Việc giảm thiểu quản lý cơ sở hạ tầng cho phép Lambda giúp các tổ chức chuyển hướng sự tập trung từ việc quản lý máy chủ sang các khía cạnh quan trọng khác, chẳng hạn như tối ưu hóa hiệu suất và phân tích lưu lượng mạng. Điều này cho phép các tổ chức xây dựng các ứng dụng an toàn và hiệu quả hơn.
Giám sát mạng trong Lambda đáp ứng các nhu cầu đa dạng của tổ chức, chẳng hạn như yêu cầu tuân thủ đối với nhật ký kiểm tra và phát hiện bất thường, nhu cầu kinh doanh đối với đo lường lưu lượng và tính phí khách hàng, và nhu cầu phát triển đối với khắc phục sự cố mạng. Các phương pháp giám sát dựa trên tác nhân truyền thống hoặc dựa trên máy chủ thường không tương thích với môi trường thực thi biệt lập và ngắn hạn của Lambda, điều này đòi hỏi các phương pháp thay thế để đáp ứng các yêu cầu quan trọng này.
Bạn có thể sử dụng các giải pháp giám sát mạng tích hợp sẵn của AWS, chẳng hạn như Amazon Virtual Private Cloud (Amazon VPC) Flow Logs, hoặc xây dựng giải pháp tùy chỉnh của riêng bạn, như được trình bày chi tiết trong bài viết này. Mỗi giải pháp cung cấp các khả năng riêng biệt với các mức độ chi tiết và khả năng quan sát theo thời gian thực khác nhau. Khi chọn một phương pháp, bạn phải đánh giá các yếu tố chính như mức độ chi tiết dữ liệu mong muốn, độ phức tạp vận hành, khả năng chịu trễ và tác động chi phí.
Trong bài viết này, bạn sẽ học các phương pháp giám sát lưu lượng mạng trong các hàm AWS Lambda và cách áp dụng chúng vào các tình huống thực tế của bạn.
Tìm hiểu thêm: https://osam.io/hotlinking-waf-check-referer/
https://osam.io/agentic-ai-voi-deepseek-r1-crewai-va-amazon-sagemaker-ai-2/
Sử dụng VPC Flow Logs
VPC Flow Logs là công cụ được AWS khuyến nghị dùng để giám sát hoạt động mạng. Nếu tình huống của bạn yêu cầu giám sát lưu lượng mạng của các hàm Lambda, bạn có thể gắn các hàm này vào một VPC và bật Flow Logs. Việc này sẽ ghi lại dữ liệu chi tiết về lưu lượng mạng, như địa chỉ IP nguồn và đích, cổng, giao thức và khối lượng dữ liệu cho tất cả lưu lượng đi qua các giao diện mạng mà hàm sử dụng.
Khi bạn gắn các hàm của mình vào một VPC, dịch vụ Lambda sẽ tự động tạo một Elastic Network Interface (ENI) để các hàm có thể giao tiếp với các tài nguyên trong VPC. Theo mặc định, các hàm được gắn với VPC chỉ có thể truy cập các tài nguyên nội bộ trong VPC đó. Nếu bạn cần các hàm của mình giao tiếp với các dịch vụ AWS khác, bạn nên sử dụng VPC Endpoints. Nếu hàm cần truy cập Internet công cộng, bạn nên sử dụng NAT Gateway cho lưu lượng đi ra. Sơ đồ dưới đây minh họa cách bạn có thể sử dụng VPC Flow Logs cho các hàm Lambda.
Flow Logs cung cấp cái nhìn chi tiết về lưu lượng IP đến và đi từ các giao diện mạng trong một VPC, mang lại dữ liệu giá trị cho việc kiểm tra mạng và giám sát hoạt động. Phương pháp này giúp phân tách rõ ràng giữa lớp ứng dụng và lớp mạng, trong đó các cấu trúc VPC thường được quản lý bởi đội ngũ vận hành hoặc hạ tầng chuyên trách.
VPC Flow Logs là một giải pháp giám sát mạng mạnh mẽ. Tuy nhiên, khi sử dụng với các hàm Lambda, bạn nên cân nhắc các điểm sau:
Nó ghi lại thông tin ở cấp độ ENI. Vì một ENI có thể được dùng lại bởi nhiều hàm Lambda, nên sẽ không cung cấp mức độ chi tiết theo từng hàm hoặc từng lần gọi hàm.
Chỉ ghi lại địa chỉ IP, không ghi lại tên miền DNS (nếu bạn cần thu thập tên miền DNS thì đây là điểm hạn chế).
Giới thiệu việc quản lý hạ tầng vào trong ứng dụng serverless. Bạn sẽ cần học về các cấu trúc của VPC hoặc phối hợp với đội ngũ hạ tầng của mình.
Có thể phát sinh thêm chi phí truyền dữ liệu. Vui lòng tham khảo giá của NAT Gateway, VPC Endpoints và Flow Logs để biết thêm chi tiết.
Các phần tiếp theo sẽ khám phá những phương pháp giám sát mạng trong Lambda, có thể được kết hợp với VPC Flow Logs để tăng độ chi tiết, hoặc sử dụng mà không cần gắn hàm vào VPC.
Định tuyến lưu lượng mạng qua proxy
Bạn có thể cấu hình môi trường thực thi Lambda để định tuyến lưu lượng mạng đi (egress) thông qua một proxy side-car, chạy dưới dạng một Lambda layer trong môi trường thực thi Lambda và ghi lại hoạt động mạng. Lớp proxy này nên độc lập với ngôn ngữ lập trình mà Lambda sử dụng.
AWS khuyến nghị bạn sử dụng các ngôn ngữ biên dịch như Rust hoặc Golang để đạt được khả năng tái sử dụng tối đa và độ trễ tối thiểu.
Cấu hình proxy khác nhau tùy vào ngôn ngữ lập trình: Python sử dụng các biến môi trường proxy_http và proxy_https, Java dùng cờ JVM, còn Node.js yêu cầu thay đổi mã nguồn, ví dụ như cấu hình proxy cho AWS SDK hoặc sử dụng thư viện bên thứ ba như global-agent hoặc Interceptors.
Cách sử dụng proxy phù hợp nếu bạn chấp nhận thay đổi mã nguồn hoặc cấu hình hàm, nhưng việc thêm proxy vào môi trường thực thi có thể tiêu tốn tài nguyên và làm tăng độ trễ mạng.
Kỹ thuật độc lập với runtime
Các kỹ thuật sau sử dụng thực tế rằng môi trường thực thi Lambda là một micro-VM dựa trên Linux. Các runtime của Lambda hoạt động trong không gian người dùng hạn chế, ngăn không cho sử dụng các công cụ giám sát hệ điều hành truyền thống yêu cầu quyền cao như tcpdump, iptables, ptrace, hoặc eBPF. Các kỹ thuật này được thiết kế đặc biệt để hoạt động dưới các hạn chế của không gian người dùng, cho phép sử dụng mà không cần quyền cao.
Đọc thông tin lớp mạng hệ điều hành từ procfs
Sử dụng phương pháp này khi bạn cần lấy thông tin cấp hệ điều hành, như đo lượng byte đã chuyển, hoặc xem tất cả các kết nối mở. Phương pháp này sử dụng procfs (hệ thống tệp ảo trong Linux) để truy cập dữ liệu từ nhân hệ điều hành, cho phép bạn đọc thông tin cấp hệ điều hành. Ví dụ, /proc/net/tcp
và /proc/net/udp
cung cấp danh sách các kết nối TCP/UDP đang hoạt động, bao gồm địa chỉ IP và cổng từ xa. /proc/net/dev
cung cấp thông tin về các thiết bị mạng, như số byte đã chuyển và nhận.
“Phương pháp procfs cung cấp cách đơn giản nhưng mạnh mẽ để thu thập dữ liệu giám sát mạng từ các hàm Lambda, như thống kê mạng và số lượng file descriptor, giúp theo dõi kết nối outbound từ các hàm Lambda.” — AJ Stuyvenberg, Kỹ sư trưởng tại Datadog.
Dự án mẫu cung cấp LambdaNetworkMonitor-Procfs stack để minh họa kỹ thuật này. Mỗi lần gọi hàm, hàm đọc /proc/net/dev
và gửi thống kê mạng đến log và Amazon CloudWatch Metrics.
Chặn các lệnh gọi hàm mạng của thư viện libc
Các thao tác mạng cấp thấp trong Linux, như tra cứu DNS và tạo kết nối, được quản lý bởi thư viện chuẩn C (libc). Bạn có thể chặn các lệnh gọi hàm libc mà runtime của Lambda thực hiện để giám sát lưu lượng mạng ở cấp hệ điều hành. Đây là một kỹ thuật nâng cao và phức tạp, nhưng cho phép quan sát chi tiết các hoạt động mạng ở cấp hệ điều hành.
Chặn các hàm libc như getaddrinfo
(tra cứu DNS) và connect
cho phép ghi lại chi tiết như tên miền, địa chỉ IP, cổng và giao thức ở mức độ chi tiết cao. Phương pháp này giúp thu thập đầy đủ thông tin về truy vấn DNS và kết nối mạng được khởi tạo, hỗ trợ theo dõi lưu lượng mạng theo từng hàm và từng lần gọi, bao gồm cả hostname và IP.
Luồng đơn giản hóa như sau:
Hàm Lambda gửi yêu cầu tới
example.com
.Runtime gọi hàm
getaddrinfo
trong libc để tra cứu DNS.Bạn chặn (intercept) lời gọi này, ghi log tên miền, rồi chuyển tiếp đến hàm gốc
getaddrinfo
.Hàm gốc trả về địa chỉ IP — bạn ghi log và trả kết quả về cho runtime.
Runtime tiếp tục gọi
connect
để tạo kết nối mới.Bạn tiếp tục chặn, ghi lại IP, và chuyển tiếp đến hàm
connect
gốc.
Để triển khai kỹ thuật này, bạn cần dùng ngôn ngữ có thể biên dịch thành file .so
(shared object), như C, C++ hoặc Rust. Mã mẫu sử dụng Rust vì ngôn ngữ này đảm bảo an toàn bộ nhớ và cho phép override hàm getaddrinfo
trong libc.
Lưu ý khi triển khai kỹ thuật chặn hàm libc:
Hàm bạn viết cần trùng hoàn toàn chữ ký (signature) với hàm gốc trong libc (ví dụ:
getaddrinfo
).Các tham số như
node
vàservice
thường là tên miền và cổng.Sau khi xử lý và ghi log, hàm của bạn phải gọi lại hàm
getaddrinfo
gốc và trả kết quả về như bình thường.
Triển khai:
Biên dịch mã thành file
.so
, đóng gói thành Lambda Layer, gắn vào hàm Lambda.Sử dụng biến môi trường
LD_PRELOAD
để chỉ định file.so
, nhằm yêu cầu hệ điều hành nạp thư viện của bạn trước cả libc.Bạn có thể cấu hình
LD_PRELOAD
bằng biến môi trường trong Lambda hoặc qua một script wrapper.
Kỹ thuật này cho phép giám sát mạng chi tiết ở cấp độ kết nối, bao gồm:
Tra cứu DNS
Địa chỉ IP sau khi phân giải
Cổng, giao thức
Số byte truyền nhận
Tùy theo nhu cầu, bạn có thể mở rộng để theo dõi thêm thông tin liên quan đến mạng.
Dự án mẫu sử dụng stack LambdaNetworkMonitor-LdPreload
để minh họa kỹ thuật này. Mỗi lần hàm Lambda được gọi, nó sẽ in ra các hàm libc bị chặn, tên miền DNS và địa chỉ IP kết nối.
Kết luận
Giám sát lưu lượng mạng trong các hàm Lambda là nhu cầu phổ biến. Nếu bạn cần ghi log mạng ở cấp độ IP, AWS khuyến nghị sử dụng VPC Flow Logs bằng cách gắn hàm Lambda vào VPC.
Nếu cần mức độ chi tiết theo từng hàm hoặc từng lần gọi, bạn có thể kết hợp thêm các kỹ thuật nâng cao đã được trình bày trong bài viết.
Tìm hiểu thêm: https://aws.amazon.com/vi/lambda/