Tăng Timeout Lambda: Cách Thay Đổi Giới Hạn Thời Gian Chạy và Giới Hạn Tối Đa
Lambda function của bạn bị dừng đột ngột sau 3 giây trong khi tác vụ thực tế cần 10 giây để hoàn thành — đây là một trong những lỗi phổ biến nhất khi mới bắt đầu làm việc với Lambda, và cũng là lỗi dễ bỏ sót nhất vì error message trông giống như application crash hơn là configuration issue. Bài viết này hướng dẫn cách tăng Lambda timeout, giải thích giới hạn tối đa, và chỉ ra những điểm cấu hình liên quan mà nhiều người bỏ qua.
TL;DR — Tóm Tắt Nhanh
| Vấn đề | Nguyên nhân | Giải pháp |
|---|---|---|
| Function dừng sau 3 giây | Default timeout là 3 giây | Tăng timeout trong function configuration |
| Giới hạn tối đa timeout | AWS hard limit | Tối đa 900 giây (15 phút) |
| Timeout vẫn xảy ra dù đã tăng | Downstream service timeout thấp hơn | Kiểm tra API Gateway, ALB, hoặc SDK timeout |
| Task vượt quá 15 phút | Lambda không phù hợp | Chuyển sang Step Functions hoặc ECS/Fargate |
Lambda Timeout Hoạt Động Như Thế Nào
Lambda timeout là khoảng thời gian tối đa mà một function invocation được phép chạy trước khi AWS buộc dừng nó. Khi timeout xảy ra, Lambda ném ra lỗi Task timed out after X.XX seconds và trả về status FAILED cho invocation đó. Đây là hard stop — không có grace period, không có cleanup callback.
Default timeout khi tạo function mới là 3 giây. Đây là con số đủ cho các function đơn giản nhưng hoàn toàn không đủ cho bất kỳ tác vụ nào có I/O thực sự: database query, HTTP call đến external API, xử lý file S3, hay bất kỳ pipeline nào có nhiều bước.
Timeout countdown begins"] B --> C{"Function completes
before timeout?"} C -- "Yes" --> D["Return response
Invocation SUCCESS"] C -- "No" --> E["Force terminate
Task timed out"] E --> F["CloudWatch Logs:
Task timed out after X.XX seconds"] E --> G["Invocation status: FAILED"]
- Invocation bắt đầu: Lambda nhận event và bắt đầu đếm ngược timeout ngay lập tức.
- Execution window: Function chạy trong giới hạn thời gian đã cấu hình (3 giây mặc định, tối đa 900 giây).
- Timeout hit: Nếu function chưa return khi đồng hồ hết, Lambda force-terminate process và ghi lỗi vào CloudWatch Logs.
- Billing stop: Billing dừng tại thời điểm timeout, không phải thời điểm task hoàn thành.
Cách Tăng Lambda Timeout — 3 Phương Pháp
Phương pháp 1: AWS Management Console
Đây là cách nhanh nhất để thay đổi trong môi trường dev hoặc khi debug. Vào Lambda console → chọn function → tab Configuration → General configuration → nhấn Edit → kéo slider hoặc nhập giá trị timeout → Save.
Phương pháp 2: AWS CLI
Dùng CLI khi cần thay đổi nhanh mà không muốn qua console, hoặc khi làm việc trong pipeline CI/CD đơn giản. Lệnh dưới đây tăng timeout lên 30 giây:
aws lambda update-function-configuration \
--function-name my-function-name \
--timeout 30 \
--region us-east-1
Xác nhận thay đổi đã được áp dụng:
aws lambda get-function-configuration \
--function-name my-function-name \
--region us-east-1 \
--query 'Timeout'
Phương pháp 3: Infrastructure as Code (CloudFormation / Terraform)
Trong môi trường production, timeout nên được quản lý qua IaC để tránh configuration drift. Dưới đây là ví dụ CloudFormation:
🔽 CloudFormation template — click để mở rộng
Resources:
MyLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: my-function-name
Runtime: python3.12
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Timeout: 30
Code:
ZipFile: |
def handler(event, context):
return {'statusCode': 200}
Và ví dụ Terraform tương đương:
🔽 Terraform resource block — click để mở rộng
resource "aws_lambda_function" "my_function" {
function_name = "my-function-name"
role = aws_iam_role.lambda_exec.arn
handler = "index.handler"
runtime = "python3.12"
timeout = 30
filename = "lambda_function.zip"
source_code_hash = filebase64sha256("lambda_function.zip")
}
Giới Hạn Timeout Tối Đa của Lambda
AWS Lambda cho phép timeout tối đa là 900 giây (15 phút) cho mỗi invocation. Đây là hard limit được AWS enforce — không thể tăng qua Service Quotas hay support request. Giá trị hợp lệ là số nguyên từ 1 đến 900 giây.
Nghĩ về Lambda timeout như một parking meter: bạn có thể mua tối đa 15 phút, nhưng khi đồng hồ hết, xe bị kéo đi bất kể bạn đang làm gì. Không có cảnh báo trước, không có thêm thời gian.
Nếu tác vụ của bạn thực sự cần hơn 15 phút, Lambda không phải công cụ phù hợp. Các lựa chọn thay thế phổ biến: AWS Step Functions (orchestrate nhiều Lambda invocations), AWS Fargate (container task không có time limit), hoặc AWS Batch cho workload xử lý dài.
Những Tầng Timeout Khác Mà Lambda Không Kiểm Soát
Đây là điểm mà nhiều người bị mắc kẹt: bạn đã tăng Lambda timeout lên 30 giây, nhưng function vẫn bị cắt sau 29 giây. Lý do không phải Lambda — mà là service phía trước nó.
Max timeout: 29s"] APIGW --> Lambda["Lambda Function
Timeout: 0-900s"] Lambda --> ExtAPI["External API
SDK/HTTP timeout"] ALB["ALB
Idle timeout: up to 4000s"] --> Lambda style APIGW fill:#f9a825,color:#000 style Lambda fill:#1565c0,color:#fff style ALB fill:#f9a825,color:#000
- API Gateway timeout: API Gateway có timeout tối đa là 29 giây cho integration với Lambda (không thể tăng). Nếu Lambda chạy lâu hơn 29 giây, API Gateway trả về
504 Gateway Timeouttrong khi Lambda vẫn đang chạy. - ALB timeout: Application Load Balancer có idle timeout mặc định là 60 giây, có thể cấu hình lên đến 4000 giây.
- SDK/HTTP client timeout: Nếu Lambda của bạn gọi external service, timeout của HTTP client trong code cũng cần được điều chỉnh tương ứng.
- Lambda function URL: Không có timeout riêng — bị giới hạn bởi Lambda timeout.
Kiểm tra timeout hiện tại của API Gateway stage:
aws apigateway get-integration \
--rest-api-id YOUR_API_ID \
--resource-id YOUR_RESOURCE_ID \
--http-method POST \
--region us-east-1 \
--query 'timeoutInMillis'
Kiểm tra idle timeout của ALB:
aws elbv2 describe-load-balancer-attributes \
--load-balancer-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/my-alb/1234567890abcdef \
--region us-east-1 \
--query 'Attributes[?Key==`idle_timeout.timeout_seconds`]'
IAM Permissions Cần Thiết
Để update Lambda configuration qua CLI hoặc IaC, IAM principal cần có permission sau. Đây là policy tối thiểu theo nguyên tắc least privilege:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"lambda:UpdateFunctionConfiguration",
"lambda:GetFunctionConfiguration"
],
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function-name"
}
]
}
Chẩn Đoán Khi Timeout Vẫn Xảy Ra Sau Khi Tăng
Tình huống thực tế: function được cấu hình 30 giây timeout, nhưng CloudWatch Logs vẫn hiện Task timed out after 3.00 seconds. Lý do phổ biến nhất — thay đổi chưa được deploy. Lambda có hai khái niệm cần phân biệt: function configuration và function version/alias. Nếu bạn đang invoke một published version hoặc alias trỏ đến version cũ, timeout của version đó vẫn là 3 giây dù $LATEST đã được cập nhật.
Kiểm tra version nào đang được invoke:
aws lambda list-versions-by-function \
--function-name my-function-name \
--region us-east-1 \
--query 'Versions[*].{Version:Version,Timeout:Timeout}'
Kiểm tra alias đang trỏ đến version nào:
aws lambda list-aliases \
--function-name my-function-name \
--region us-east-1 \
--query 'Aliases[*].{Name:Name,FunctionVersion:FunctionVersion}'
Nếu alias trỏ đến version cũ, bạn cần publish version mới sau khi update configuration, rồi update alias:
aws lambda publish-version \
--function-name my-function-name \
--region us-east-1
aws lambda update-alias \
--function-name my-function-name \
--name production \
--function-version 5 \
--region us-east-1
Giám Sát Timeout Với CloudWatch
Sau khi tăng timeout, nên thiết lập alarm để phát hiện sớm khi function tiệm cận giới hạn mới. Lambda tự động emit metric Duration và Errors vào CloudWatch — timeout được ghi nhận là invocation error với log message chứa chuỗi 'Task timed out'.
Tạo CloudWatch alarm cảnh báo khi duration vượt 80% timeout đã cấu hình (ví dụ: timeout 30 giây, alarm tại 24 giây):
aws cloudwatch put-metric-alarm \
--alarm-name lambda-duration-high \
--metric-name Duration \
--namespace AWS/Lambda \
--dimensions Name=FunctionName,Value=my-function-name \
--statistic Maximum \
--period 60 \
--threshold 24000 \
--comparison-operator GreaterThanThreshold \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:us-east-1:123456789012:my-alert-topic \
--region us-east-1
Threshold đơn vị là milliseconds — 24000ms tương đương 24 giây.
Khi Nào Nên Tăng Timeout và Khi Nào Nên Refactor
Tăng timeout là giải pháp đúng khi tác vụ có thời gian chạy xác định và hợp lý — ví dụ: gọi một external API thường trả về trong 5-8 giây, hoặc xử lý một file nhỏ từ S3. Nhưng nếu bạn đang tăng timeout lên 15 phút vì function đang làm quá nhiều việc trong một invocation duy nhất, đó là dấu hiệu cần refactor.
Một số pattern thay thế khi Lambda timeout không đủ:
- Step Functions: Chia pipeline thành nhiều Lambda nhỏ, mỗi bước có timeout riêng, orchestration có thể chạy hàng giờ.
- SQS + Lambda: Xử lý batch message với visibility timeout phù hợp, tự động retry khi fail.
- ECS Fargate: Container task không có time limit, phù hợp cho long-running job.
Tăng Lambda Timeout — Wrap-Up và Bước Tiếp Theo
Tóm lại: Lambda timeout mặc định là 3 giây, có thể tăng lên tối đa 900 giây (15 phút) qua console, CLI, hoặc IaC. Nếu function của bạn cần 10 giây, đặt timeout ít nhất 15-20 giây để có buffer. Sau khi thay đổi, xác nhận bằng get-function-configuration và kiểm tra xem có tầng timeout nào khác (API Gateway, ALB) đang can thiệp không.
Tài liệu tham khảo chính thức: AWS Lambda — Configuring function options và Lambda quotas.
Glossary — Thuật Ngữ Chính
| Thuật ngữ | Giải thích |
|---|---|
| Timeout | Thời gian tối đa một Lambda invocation được phép chạy trước khi bị force-terminate |
| Invocation | Một lần gọi thực thi Lambda function, có thể là synchronous hoặc asynchronous |
| $LATEST | Version mới nhất chưa được publish của Lambda function, luôn phản ánh thay đổi configuration gần nhất |
| Published Version | Snapshot bất biến của Lambda function tại một thời điểm, có số version cụ thể |
| Integration Timeout | Timeout được cấu hình ở tầng API Gateway cho một backend integration cụ thể, độc lập với Lambda timeout |
Nhận xét
Đăng nhận xét