Menaikkan Timeout Lambda: Cara Mengubah Pengaturan dan Batas Maksimum
Fungsi Lambda berhenti di tengah jalan setelah 3 detik padahal task belum selesai — ini salah satu masalah paling umum yang ditemui saat pertama kali men-deploy workload yang lebih berat ke Lambda. Timeout default Lambda memang 3 detik, dan jika kamu tidak mengubahnya secara eksplisit, eksekusi akan dipotong tepat di sana tanpa pesan error yang jelas di log aplikasi.
TL;DR: Ringkasan Cepat Timeout Lambda
| Aspek | Detail |
|---|---|
| Default timeout | 3 detik |
| Maksimum timeout | 900 detik (15 menit) |
| Cara ubah via Console | Configuration → General configuration → Edit → Timeout |
| Cara ubah via CLI | aws lambda update-function-configuration --timeout |
| Cold start masuk timeout? | Tidak — fase init di luar hitungan timeout handler |
| Error saat timeout | Task timed out after X.XX seconds di CloudWatch Logs |
Bagaimana Lambda Timeout Bekerja
Sebelum mengubah angka timeout, penting untuk memahami apa yang sebenarnya diukur. Lambda membagi siklus hidup eksekusi menjadi dua fase yang berbeda: fase Init dan fase Invoke.
Fase Init mencakup proses bootstrapping runtime, mengunduh deployment package, dan menjalankan kode inisialisasi di luar handler (misalnya koneksi database di level modul). Fase ini tidak dihitung sebagai bagian dari timeout fungsi. Timeout hanya berlaku untuk eksekusi handler itu sendiri — yaitu waktu dari saat Lambda memanggil handler function kamu hingga handler tersebut selesai atau dipaksa berhenti.
Implikasinya: jika handler kamu membutuhkan 10 detik, kamu perlu timeout minimal 10 detik. Cold start yang panjang tidak akan menyebabkan timeout, tapi jika handler melakukan operasi lambat seperti query database atau HTTP call ke downstream service, itulah yang akan memakan jatah timeout.
Bootstrap & Inisialisasi"] B --> C["Handler Mulai Dieksekusi
Timer Timeout Aktif"] C --> D{"Handler Selesai
Sebelum Timeout?"} D -->|"Ya"| E["Response Dikembalikan
Eksekusi Sukses"] D -->|"Tidak"| F["Lambda Memotong Eksekusi
Task timed out after X.XX seconds"] F --> G["Error Tercatat di
CloudWatch Logs"] style B fill:#f0f0f0,stroke:#999 style C fill:#fff3cd,stroke:#ffc107 style F fill:#f8d7da,stroke:#dc3545 style E fill:#d4edda,stroke:#28a745
- Init Phase: Runtime bootstrap dan inisialisasi kode di luar handler. Tidak dihitung dalam timeout.
- Handler Execution: Eksekusi dimulai, timer timeout aktif dari titik ini.
- Timeout Boundary: Jika handler belum selesai saat timer habis, Lambda menghentikan eksekusi secara paksa.
- Success / Timeout Error: Handler selesai normal, atau Lambda melempar error timeout ke CloudWatch Logs.
Cara Meningkatkan Timeout Lambda via AWS Console
Ini cara paling cepat untuk satu fungsi spesifik. Buka Lambda Console, pilih fungsi yang bermasalah, lalu navigasi ke tab Configuration → General configuration → klik Edit. Di sana kamu akan menemukan field Timeout yang bisa diisi dalam format menit dan detik. Ubah ke nilai yang kamu butuhkan, lalu simpan.
Perlu diingat: perubahan ini langsung berlaku untuk invocation berikutnya. Tidak perlu deploy ulang.
Cara Meningkatkan Timeout Lambda via AWS CLI
Untuk otomasi atau perubahan massal, CLI adalah pilihan yang lebih efisien. Gunakan perintah update-function-configuration:
aws lambda update-function-configuration \
--function-name nama-fungsi-kamu \
--timeout 30 \
--region us-east-1
Nilai --timeout dalam satuan detik. Untuk task 10 detik, set ke 30 agar ada buffer yang cukup — timeout yang terlalu pas dengan durasi aktual akan sering gagal karena variasi latensi jaringan atau downstream service.
Verifikasi perubahan berhasil diterapkan:
aws lambda get-function-configuration \
--function-name nama-fungsi-kamu \
--region us-east-1 \
--query 'Timeout'
Cara Meningkatkan Timeout Lambda via Infrastructure as Code
Jika kamu menggunakan Terraform atau AWS SAM, timeout harus didefinisikan di level konfigurasi resource agar konsisten di semua environment.
Terraform:
resource "aws_lambda_function" "example" {
function_name = "nama-fungsi-kamu"
timeout = 30
# ... konfigurasi lainnya
}
AWS SAM (template.yaml):
Resources:
NamaFungsi:
Type: AWS::Serverless::Function
Properties:
Timeout: 30
# ... konfigurasi lainnya
Perubahan Cepat"| C["AWS Console
Configuration → General"] B -->|"Otomasi /
Scripting"| D["AWS CLI
update-function-configuration"] B -->|"Production /
Multi-environment"| E["IaC: Terraform
atau AWS SAM"] C --> F["Berlaku Langsung"] D --> F E --> G["Deploy Pipeline
→ Berlaku"] style E fill:#d4edda,stroke:#28a745 style C fill:#fff3cd,stroke:#ffc107
- AWS Console: Cocok untuk perubahan cepat satu fungsi. Tidak scalable untuk banyak fungsi.
- AWS CLI: Ideal untuk scripting dan otomasi. Perubahan langsung tanpa deployment cycle.
- Terraform / SAM: Pilihan terbaik untuk production — perubahan terdokumentasi di version control dan konsisten di semua environment.
Mendiagnosis Timeout: Dari Gejala ke Penyebab Sebenarnya
Ini pola yang sering terjadi: fungsi Lambda tiba-tiba mulai timeout di production setelah berjalan normal berminggu-minggu. Tim langsung menaikkan timeout dari 30 detik ke 5 menit, dan masalah 'hilang'. Dua hari kemudian, timeout lagi.
Yang sebenarnya terjadi: timeout bukan masalah konfigurasi, tapi gejala dari masalah downstream. Koneksi ke RDS mulai lambat karena connection pool habis, atau HTTP call ke third-party API mulai mengalami degradasi performa. Menaikkan timeout hanya menyembunyikan masalah sambil membiarkan fungsi berjalan lebih lama dan mengonsumsi lebih banyak biaya.
Cara mendiagnosis dengan benar:
Langkah 1: Konfirmasi timeout terjadi di CloudWatch Logs
Error timeout Lambda selalu menghasilkan log line spesifik. Cari pattern ini di log group fungsi kamu:
aws logs filter-log-events \
--log-group-name '/aws/lambda/nama-fungsi-kamu' \
--filter-pattern 'Task timed out' \
--region us-east-1
Log line akan terlihat seperti: Task timed out after 3.00 seconds. Ini konfirmasi bahwa eksekusi dipotong oleh Lambda runtime, bukan crash di dalam kode.
Langkah 2: Ukur durasi aktual eksekusi dengan CloudWatch Metrics
Sebelum menaikkan timeout, kamu perlu tahu berapa lama handler sebenarnya berjalan saat berhasil. Metrik Duration di CloudWatch mencatat ini. Bandingkan nilai P99 dengan timeout yang dikonfigurasi — jika P99 mendekati batas timeout, kamu memang perlu menaikkannya. Jika P99 jauh di bawah timeout tapi timeout masih terjadi, ada outlier yang perlu diinvestigasi.
aws cloudwatch get-metric-statistics \
--namespace AWS/Lambda \
--metric-name Duration \
--dimensions Name=FunctionName,Value=nama-fungsi-kamu \
--start-time 2024-01-01T00:00:00Z \
--end-time 2024-01-02T00:00:00Z \
--period 3600 \
--statistics Maximum Average \
--region us-east-1
Langkah 3: Identifikasi operasi lambat di dalam handler
Tambahkan timestamp logging di sekitar operasi yang dicurigai — database query, HTTP call, atau file I/O. Ini cara paling cepat untuk menemukan bottleneck tanpa instrumen tambahan:
import time
import logging
logger = logging.getLogger()
def handler(event, context):
start = time.time()
# operasi yang dicurigai lambat
result = query_database()
logger.info(f'DB query duration: {time.time() - start:.3f}s')
return result
Menaikkan timeout tanpa mendiagnosis penyebab root cause ibarat memperlebar jalur darurat di rumah sakit tanpa menangani mengapa pasien terus datang — masalahnya tetap ada, hanya lebih lama tersembunyi.
Batas Maksimum dan Pertimbangan Arsitektur
Lambda mendukung timeout maksimum 900 detik (15 menit). Ini batas keras yang tidak bisa dinaikkan melalui Service Quota request. Jika task kamu membutuhkan lebih dari 15 menit, Lambda bukan solusi yang tepat — pertimbangkan AWS Fargate, ECS Task, atau AWS Batch untuk workload long-running.
Untuk task yang mendekati batas 15 menit, ada pertimbangan praktis yang perlu diperhatikan. Semakin panjang timeout, semakin besar potensi biaya jika fungsi hang karena downstream service tidak merespons. Selalu pasang timeout eksplisit di HTTP client dan database connection di dalam kode handler — jangan hanya mengandalkan Lambda timeout sebagai safety net terakhir.
Max 900 detik"] B -->|"Mendekati 15 menit"| D{"Bisa Dipecah
Menjadi Steps?"} B -->|"Di atas 15 menit"| E["Gunakan Fargate /
ECS / AWS Batch"] D -->|"Ya"| F["AWS Step Functions
+ Multiple Lambda"] D -->|"Tidak"| E C --> G["Set Timeout = P99 Duration
+ Buffer 20-30%"] style E fill:#f8d7da,stroke:#dc3545 style F fill:#cce5ff,stroke:#004085 style C fill:#d4edda,stroke:#28a745
- Di bawah 15 menit: Lambda bisa menangani. Pilih timeout yang memberikan buffer sekitar 20-30% di atas durasi P99 aktual.
- Mendekati 15 menit: Evaluasi apakah task bisa dipecah menjadi step yang lebih kecil menggunakan AWS Step Functions.
- Di atas 15 menit: Lambda bukan pilihan yang tepat. Gunakan Fargate, ECS, atau Batch.
IAM Permission untuk Update Timeout via CLI
Jika kamu menjalankan CLI dari environment dengan IAM role terbatas (misalnya CI/CD pipeline), pastikan role tersebut memiliki permission lambda:UpdateFunctionConfiguration:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:UpdateFunctionConfiguration",
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:nama-fungsi-kamu"
}
]
}
Meningkatkan Timeout Lambda: Langkah Berikutnya
Mengubah timeout Lambda adalah operasi sederhana, tapi keputusan nilai timeout yang tepat membutuhkan data aktual dari CloudWatch Metrics — bukan tebakan. Set timeout berdasarkan P99 durasi eksekusi ditambah buffer yang wajar, bukan berdasarkan 'angka yang terasa aman'.
Untuk fungsi production, pertimbangkan juga mengaktifkan Lambda Insights untuk monitoring durasi yang lebih granular, dan gunakan AWS Step Functions jika workflow kamu terdiri dari beberapa Lambda yang perlu dikoordinasi dengan timeout berbeda.
Dokumentasi resmi: Configuring Lambda function options — AWS Documentation.
Glosarium
| Istilah | Definisi |
|---|---|
| Lambda Timeout | Batas waktu maksimum eksekusi handler Lambda sebelum runtime menghentikan fungsi secara paksa. |
| Cold Start / Init Phase | Fase inisialisasi Lambda sebelum handler dipanggil. Tidak dihitung dalam timeout fungsi. |
| Handler | Fungsi entry point yang dipanggil Lambda saat invocation terjadi. |
| CloudWatch Duration Metric | Metrik yang mencatat durasi aktual eksekusi handler Lambda dalam milidetik. |
| P99 Duration | Persentil ke-99 dari distribusi durasi eksekusi — 99% invocation selesai dalam waktu ini atau lebih cepat. |
Komentar
Posting Komentar