โ† Semua pembelajaran / Laravel Nol โ†’ Enterprise
Fase 9 ยท Deploy di AWS

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

KonsepArtinya
ClusterPengelompokan logis. Dengan Fargate ia tidak memuat server apa pun
Task definitionCetak biru: image, CPU, memori, environment, log, health check
TaskSatu instansiasi yang sedang berjalan dari cetak biru itu
ServiceMenjaga N task tetap berjalan, mendaftarkannya ke ALB, menangani deploy

Tiga service untuk Laravel

ServicePerintahTaskALB
portal-weboctane:frankenphp2โ€“20, diskalakan otomatisYa
portal-workerqueue:work1โ€“10, diskalakan dari panjang antreanTidak
portal-schedulerschedule:workTepat 1Tidak

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

PeranvCPUMemoriCatatan
Web (worker mode)12 GBSetel num_threads sesuai memori ini
Worker antrean0,51 GBNaikkan kalau memproses gambar
Penjadwal0,250,5 GBHanya mengantre pekerjaan
Migrasi (sekali jalan)0,51 GBBerhenti 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

RoleDipakai olehUntuk
Execution roleAgen ECS, sebelum kontainer menyalaMenarik image dari ECR, membaca rahasia, menulis ke CloudWatch Logs
Task roleAplikasimu, saat berjalanAkses 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

GejalaPenyebab yang paling sering
CannotPullContainerErrorExecution role tidak punya izin ECR, atau tidak ada rute ke internet/VPC endpoint
Task menyala lalu langsung berhentiPerintahnya keluar seketika โ€” baca log CloudWatch
Health check selalu gagalPort salah, atau /up menyentuh database yang belum bisa dihubungi
ResourceInitializationError soal rahasiaExecution role kurang izin Secrets Manager atau KMS
Task dibunuh setelah beberapa saatMelebihi 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.