Quay lại

Tách biệt và bảo vệ hệ thống backend với AWS API Gateway + Lambda + VPC forwarding Chuyên mục Devops    2025-05-22    0 Lượt xem    0 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Trong nhiều hệ thống sản xuất (production system), có những tình huống bạn không muốn mở trực tiếp backend thật ra internet, nhưng vẫn cần nhận dữ liệu từ bên ngoài, ví dụ từ:

  • Ứng dụng bên thứ ba (đối tác tích hợp).

  • Webhook từ CRM (Hubspot, Salesforce, v.v.).

  • Hệ thống client nội bộ.

Khi đó, giải pháp lý tưởng chính là kết hợp API Gateway → AWS Lambda → Forward về backend qua VPC.


🎯 Tình huống thực tế

Bạn có hệ thống nội bộ xử lý đơn hàng, chạy trong EC2 hoặc container nội bộ (ECS, EKS), và hệ thống này:

  • Nằm trong private subnet, không có public IP.

  • Chỉ có thể truy cập được từ các service nội bộ trong VPC.

Tuy nhiên, một bên đối tác (ví dụ sàn TMĐT) cần gửi dữ liệu đơn hàng đến bạn qua HTTP (RESTful API). Bạn không muốn expose hệ thống thật ra ngoài, vậy làm sao để vẫn nhận và xử lý dữ liệu?


💡 Kiến trúc giải pháp

[Partner System (external)]
        ↓ gửi JSON qua HTTP
[Amazon API Gateway]
        ↓ trigger
[AWS Lambda (nằm trong VPC)]
        ↓ gửi request nội bộ
[Backend API (EC2 / ECS) - Private VPC]​
  • API Gateway: Cổng vào công khai, bảo vệ bằng auth key hoặc JWT.

  • Lambda: Nhận dữ liệu, validate, sau đó forward nội bộ.

  • Backend nội bộ: Chỉ nhận request từ Lambda (qua security group hoặc IP whitelist).


⚙️ Ưu điểm của kiến trúc này

✅ Không cần mở cổng public cho backend thật.
✅ Có lớp validate trung gian (Lambda) để lọc dữ liệu xấu.
✅ Tận dụng hạ tầng serverless → tiết kiệm chi phí, dễ mở rộng.
✅ Có thể log mọi request dễ dàng qua CloudWatch.


🧪 Ví dụ mã nguồn Lambda forwarding

Giả sử backend thật nội bộ có IP 10.0.2.5 và cổng 8000, bạn có thể dùng Python Lambda như sau:

import json
import requests

def lambda_handler(event, context):
    try:
        body = json.loads(event["body"])
        
        # Gửi nội bộ đến backend trong VPC
        resp = requests.post("http://10.0.2.5:8000/api/order", json=body, timeout=5)
        
        return {
            "statusCode": 200,
            "body": json.dumps({"status": "success", "response": resp.text})
        }

    except Exception as e:
        return {
            "statusCode": 500,
            "body": json.dumps({"status": "error", "message": str(e)})
        }​

⚠️ Bạn cần gán Lambda vào subnet trong VPC,cấp quyền truy cập private network + security group cho phép HTTP đến backend.


📌 Một số lưu ý

  • Nếu backend là ECS Fargate, cần gán security group cho phép kết nối từ Lambda.

  • Bạn có thể gắn authorizerAPI Gateway để kiểm tra token hoặc IP trước khi cho phép request.

  • Nên log toàn bộ event vào CloudWatch hoặc S3 để dễ debug nếu có sự cố.

  • Lambda timeout nên thấp để tránh treo (ví dụ 5 giây), backend phải trả về sớm.


🧩 Một vài biến thể mở rộng

  • Lambda có thể ghi dữ liệu tạm vào SQS, và backend xử lý async nếu cần chịu tải lớn.

  • Bạn có thể dùng Lambda@Edge nếu cần xử lý gần người dùng, trước khi forward về khu vực chính.

  • Dữ liệu nhạy cảm có thể được mã hoá và giải mã nội bộ trong Lambda.


✅ Kết luận

 

Kiến trúc API Gateway → Lambda → Backend nội bộ là giải pháp cực kỳ hiệu quả cho các hệ thống cần bảo mật nhưng vẫn muốn kết nối ra bên ngoài. Dễ triển khai, dễ mở rộng, và vẫn bảo toàn tính private cho hệ thống backend.

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday