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ânGiải pháp
Function dừng sau 3 giâyDefault timeout là 3 giâyTăng timeout trong function configuration
Giới hạn tối đa timeoutAWS hard limitTối đa 900 giây (15 phút)
Timeout vẫn xảy ra dù đã tăngDownstream service timeout thấp hơnKiểm tra API Gateway, ALB, hoặc SDK timeout
Task vượt quá 15 phútLambda không phù hợpChuyể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.

graph LR A["Event Trigger"] --> B["Lambda Invocation Start
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"]
  1. Invocation bắt đầu: Lambda nhận event và bắt đầu đếm ngược timeout ngay lập tức.
  2. 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).
  3. 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.
  4. 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 ConfigurationGeneral 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ó.

graph LR Client["Client"] --> APIGW["API Gateway
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
  1. 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 Timeout trong khi Lambda vẫn đang chạy.
  2. 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.
  3. 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.
  4. 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 configurationfunction 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 DurationErrors 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 optionsLambda quotas.

Glossary — Thuật Ngữ Chính

Thuật ngữGiải thích
TimeoutThời gian tối đa một Lambda invocation được phép chạy trước khi bị force-terminate
InvocationMột lần gọi thực thi Lambda function, có thể là synchronous hoặc asynchronous
$LATESTVersion 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 VersionSnapshot bất biến của Lambda function tại một thời điểm, có số version cụ thể
Integration TimeoutTimeout được cấu hình ở tầng API Gateway cho một backend integration cụ thể, độc lập với Lambda timeout

Related Posts

Nhận xét

Bài đăng phổ biến từ blog này

EC2 Không Có Internet Trong Custom VPC: Cách Gắn Internet Gateway và Cập Nhật Route Table

RDS Multi-AZ: Lợi Ích Thực Sự Là Gì và Khi Nào Nên Bật?

Lỗi CORS trên API Gateway: Cách bật CORS và Lambda phải trả về header gì