Hiểu mô hình thực thi của Lambda

Ứng dụng Serverless với AWS Lambda

Claudio Canales

Senior DevOps Engineer

Thực thi tự động

AWS hướng sự kiện

  • Lambda chạy mã khi có sự kiện.
  • Ví dụ: tải lên S3 -> đổi kích thước ảnh.
  • Kích hoạt khác nhau, cùng mẫu.
Ứng dụng Serverless với AWS Lambda

Nhàn rỗi cho đến khi được kích hoạt

Nhàn rỗi -> sự kiện -> chạy -> dừng

  • Nhàn rỗi: không chạy gì.
  • Có sự kiện: handler chạy rồi dừng.

Ví von đèn cảm biến chuyển động cho Lambda

  • Như đèn cảm biến: chờ đến khi kích hoạt.
  • Kích hoạt chuyển từ "tắt" sang "bật".
Ứng dụng Serverless với AWS Lambda

AWS Lambda là gì?

AWS Lambda tổng quan

  • Dịch vụ tính toán hướng sự kiện.
  • Tự động mở rộng theo nhu cầu.
  • Chỉ trả tiền cho thời gian chạy.
Ứng dụng Serverless với AWS Lambda

Lambda thực thi mã của bạn như thế nào

Luồng thực thi của Lambda

  • Nguồn sự kiện kích hoạt Lambda.
  • Lambda truyền payload sự kiện vào handler.
  • Handler trả về kết quả.
Ứng dụng Serverless với AWS Lambda

Tự động mở rộng theo nhu cầu

Tăng tải tạo thêm môi trường

  • Nhiều sự kiện: nhiều lần gọi song song.
  • Lambda tạo thêm môi trường.
  • Cold start có thể xảy ra với môi trường mới.
Ứng dụng Serverless với AWS Lambda

Hàm handler

def lambda_handler(event, context):
    # Your code here
    return {
        'statusCode': 200,
        'body': 'Hello from Lambda!'
    }
  • event: payload đầu vào (JSON).
  • context: siêu dữ liệu runtime.
  • return: đầu ra (hoặc thành công/thất bại).

Handler nhận event và context

Ứng dụng Serverless với AWS Lambda

Đối tượng event

Payload sự kiện lưu trữ đối tượng

Sự kiện S3: bucket + khóa đối tượng.

# event["Records"][0]["s3"]
{
  "bucket": {"name": "my-bucket"},
  "object": {"key": "data.csv"}
}
  • Nhiệm vụ giống nhau: trích xuất phần cần thiết.

Payload sự kiện yêu cầu HTTP

Sự kiện API: method, path, body.

# API request event
{
  "httpMethod": "POST",
  "path": "/users",
  "body": "{\"name\": \"John\"}"
}
  • Kích hoạt khác nhau, JSON khác nhau.
Ứng dụng Serverless với AWS Lambda

Đối tượng context

def lambda_handler(event, context):
    time_left = (
        context.get_remaining_time_in_millis()
    )
    request_id = context.aws_request_id
  • get_remaining_time_in_millis Thời gian còn lại trước khi timeout.
  • aws_request_id ID yêu cầu để truy vết log.
Ứng dụng Serverless với AWS Lambda

Thực thi không trạng thái

Tái sử dụng khởi động ấm vs đặt lại

  • Mỗi lần gọi là độc lập.
  • Có thể tái sử dụng, không đảm bảo.
  • Lưu trạng thái ngoài Lambda.
counter = 0

def lambda_handler(event, context):
    global counter
    counter += 1  # có thể đặt lại
    return counter
Ứng dụng Serverless với AWS Lambda

Cold start

Dòng thời gian cold start

  • Môi trường thực thi mới.
  • Nạp mã và phụ thuộc.
  • Chạy khởi tạo, rồi handler.
Ứng dụng Serverless với AWS Lambda

Warm start

Dòng thời gian warm start

  • Tái sử dụng môi trường hiện có.
  • Bỏ qua hầu hết khởi tạo.
  • Handler chạy sớm hơn.
Ứng dụng Serverless với AWS Lambda

Init, invoke, freeze

Vòng đời môi trường thực thi

  • Init chạy một lần mỗi môi trường.
  • Handler chạy mỗi lần gọi.
  • Giữa các lần chạy, môi trường có thể đóng băng.
Ứng dụng Serverless với AWS Lambda

Tối ưu hóa cho cold start

# init (một lần mỗi môi trường)
import boto3
s3 = boto3.client('s3')
# handler (mỗi lần gọi)
def lambda_handler(event, context):
    return {"statusCode": 200}

Init một lần vs handler mỗi lần gọi

  • Đặt import và client SDK ngoài handler.
Ứng dụng Serverless với AWS Lambda

Let's practice!

Ứng dụng Serverless với AWS Lambda

Preparing Video For Download...