ECS Fargate
Fargate menghapus seluruh lapisan instans EC2 dari persamaan. Yang tersisa adalah tiga konsep: cluster sebagai wadah, task sebagai kontainer yang berjalan, dan service sebagai penjaga jumlah task.
Intisari
- Cluster = pengelompokan logis. Task = kontainer yang berjalan. Service = menjaga jumlah task tetap sesuai.
- Aplikasi Laravel butuh tiga service: web, worker antrean, dan penjadwal.
- CPU dan memori dipilih dari kombinasi yang tersedia; harganya per detik pemakaian.
- Ada dua IAM role yang berbeda: execution role (untuk ECS) dan task role (untuk aplikasimu).
- Migrasi database dijalankan sebagai task sekali jalan, bukan di dalam entrypoint kontainer web.
Tiga konsep
| Konsep | Artinya |
|---|---|
| Cluster | Pengelompokan logis. Dengan Fargate ia tidak memuat server apa pun |
| Task definition | Cetak biru: image, CPU, memori, environment, log, health check |
| Task | Satu instansiasi yang sedang berjalan dari cetak biru itu |
| Service | Menjaga N task tetap berjalan, mendaftarkannya ke ALB, menangani deploy |
Tiga service untuk Laravel
| Service | Perintah | Task | ALB |
|---|---|---|---|
portal-web | octane:frankenphp | 2โ20, diskalakan otomatis | Ya |
portal-worker | queue:work | 1โ10, diskalakan dari panjang antrean | Tidak |
portal-scheduler | schedule:work | Tepat 1 | Tidak |
Kenapa penjadwal dipisah dan hanya satu. Kalau schedule:work ikut berjalan di setiap
task web, laporan harianmu terkirim sebanyak jumlah task yang sedang hidup. Satu service dengan
desiredCount: 1 menyelesaikannya โ dan ->onOneServer() dari Fase 3 tetap dipasang
sebagai pengaman untuk momen deploy, ketika sesaat ada dua task berjalan bersamaan.
Ukuran task
| Peran | vCPU | Memori | Catatan |
|---|---|---|---|
| Web (worker mode) | 1 | 2 GB | Setel num_threads sesuai memori ini |
| Worker antrean | 0,5 | 1 GB | Naikkan kalau memproses gambar |
| Penjadwal | 0,25 | 0,5 GB | Hanya mengantre pekerjaan |
| Migrasi (sekali jalan) | 0,5 | 1 GB | Berhenti setelah selesai |
Lebih banyak task kecil mengalahkan sedikit task besar. Empat task 1 vCPU lebih baik daripada satu task 4 vCPU: penyebaran lalu lintasnya lebih halus, kegagalan satu task menghilangkan seperempat kapasitas alih-alih seluruhnya, dan penskalaannya bisa lebih presisi. Ini juga cocok dengan bagaimana PHP memakai CPU โ ia tidak menskalakan satu permintaan ke banyak inti.
Dua IAM role yang sering tertukar
| Role | Dipakai oleh | Untuk |
|---|---|---|
| Execution role | Agen ECS, sebelum kontainer menyala | Menarik image dari ECR, membaca rahasia, menulis ke CloudWatch Logs |
| Task role | Aplikasimu, saat berjalan | Akses S3, SQS, dan layanan AWS lain dari kode PHP |
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AksesAplikasi",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": "arn:aws:s3:::portal-media/*"
},
{
"Effect": "Allow",
"Action": ["sqs:SendMessage", "sqs:ReceiveMessage", "sqs:DeleteMessage",
"sqs:GetQueueAttributes"],
"Resource": "arn:aws:sqs:ap-southeast-1:123456789012:portal-*"
}
]
}
Gejala kalau tertukar: "task gagal menarik image" atau "tidak bisa membaca rahasia" berarti execution role yang kurang. "AccessDenied saat mengunggah ke S3 dari kode" berarti task role yang kurang. Membedakan keduanya di awal menghemat banyak waktu menebak.
Dengan task role, aplikasimu tidak butuh satu pun access key. SDK AWS di dalam kontainer mengambil
kredensial sementara dari endpoint metadata ECS secara otomatis. Konfigurasi S3 di Laravel cukup menyebutkan
region dan bucket โ tanpa AWS_ACCESS_KEY_ID sama sekali.
Migrasi sebagai task sekali jalan
aws ecs run-task \
--cluster portal \
--task-definition portal-migrasi:12 \
--launch-type FARGATE \
--network-configuration "awsvpcConfiguration={subnets=[subnet-a,subnet-b],securityGroups=[sg-app]}" \
--overrides '{"containerOverrides":[{"name":"app","command":["php","artisan","migrate","--force"]}]}'
Jangan pernah menjalankan migrasi di entrypoint kontainer web. Saat ECS menyalakan lima task
sekaligus, kelimanya akan menjalankan migrate bersamaan. Laravel memang memakai kunci, tapi
hasilnya tetap kacau: task yang menunggu bisa gagal health check dan dibunuh sebelum sempat melayani apa pun.
Migrasi adalah langkah pipeline tersendiri yang harus selesai sebelum task baru menerima lalu lintas.
Menjalankan perintah di task yang sedang berjalan
aws ecs execute-command \
--cluster portal --task <task-id> --container app \
--interactive --command "php artisan tinker"
ECS Exec adalah pengganti SSH. Ia butuh enableExecuteCommand aktif pada service dan izin SSM di
task role. Sangat berguna saat insiden โ dan setiap sesinya tercatat di CloudTrail, tidak seperti SSH ke server
yang tidak meninggalkan jejak siapa melakukan apa.
Yang perlu diperiksa saat task gagal menyala
| Gejala | Penyebab yang paling sering |
|---|---|
CannotPullContainerError | Execution role tidak punya izin ECR, atau tidak ada rute ke internet/VPC endpoint |
| Task menyala lalu langsung berhenti | Perintahnya keluar seketika โ baca log CloudWatch |
| Health check selalu gagal | Port salah, atau /up menyentuh database yang belum bisa dihubungi |
ResourceInitializationError soal rahasia | Execution role kurang izin Secrets Manager atau KMS |
| Task dibunuh setelah beberapa saat | Melebihi batas memori โ periksa num_threads dan memory_limit |
Latihan: buat cluster, satu task definition, dan jalankan satu task tanpa ALB. Buka log-nya di
CloudWatch dan pastikan aplikasi menyala. Lalu jalankan aws ecs execute-command dan panggil
php artisan about dari dalam kontainer.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.