# Deploierea aplicațiilor containerizate pe AWS ECS Fargate: Ghid practic
<!-- meta: Ghid practic AWS ECS Fargate: task definitions, servicii, load balancer, auto-scaling, optimizarea costurilor și când alegi Fargate în loc de EC2 sau EKS. -->

Rularea containerelor în producție necesită orchestrare fiabilă, scalare automată și un efort operațional minim. AWS Elastic Container Service (ECS) cu tipul de lansare Fargate răspunde tuturor acestor cerințe prin eliminarea completă a necesității de a aproviziona sau administra servere. În acest ghid, parcurgem ce este Fargate, cum se configurează un deployment pregătit pentru producție și cum se optimizează costurile.

## Ce este AWS ECS Fargate?

Amazon ECS este un serviciu complet administrat de orchestrare a containerelor. Atunci când alegeți tipul de lansare Fargate, AWS preia responsabilitatea pentru întreaga infrastructură de calcul. Definiți containerele, specificați cerințele de CPU și memorie, iar Fargate se ocupă de restul: aprovizionarea gazdelor, plasarea task-urilor, actualizarea sistemului de operare și scalarea flotei.

Spre deosebire de tipul de lansare EC2, unde administrați singuri un cluster de instanțe EC2, Fargate abstractizează complet nivelul de server. Plătiți doar pentru resursele de vCPU și memorie pe care task-urile le consumă efectiv, facturarea fiind pe secundă cu un minim de un minut.

## Configurare pas cu pas

### 1. Construirea și publicarea imaginii Docker

Începeți prin crearea unei imagini Docker pentru aplicația dumneavoastră și publicarea acesteia în Amazon Elastic Container Registry (ECR). ECR se integrează nativ cu ECS și suportă scanarea imaginilor, politici de ciclu de viață și replicare între regiuni.

```bash
aws ecr create-repository --repository-name aplicatia-mea
docker build -t aplicatia-mea:latest .
docker tag aplicatia-mea:latest <account-id>.dkr.ecr.<region>.amazonaws.com/aplicatia-mea:latest
aws ecr get-login-password | docker login --username AWS --password-stdin <account-id>.dkr.ecr.<region>.amazonaws.com
docker push <account-id>.dkr.ecr.<region>.amazonaws.com/aplicatia-mea:latest
```

### 2. Crearea Task Definition-ului

Un task definition este schița containerului. Specifică imaginea Docker, alocarea de CPU și memorie, maparea porturilor, variabilele de mediu, configurația de logging și rolurile IAM.

Parametri esențiali de configurat:

- **networkMode**: Setat pe `awsvpc` (obligatoriu pentru Fargate). Fiecare task primește propria interfață de rețea elastică și o adresă IP privată.
- **requiresCompatibilities**: Setat pe `FARGATE`.
- **cpu / memory**: Alegeți din combinațiile suportate (de exemplu, 0.25 vCPU / 512 MB, 1 vCPU / 2 GB, până la 16 vCPU / 120 GB).
- **logConfiguration**: Folosiți driver-ul `awslogs` pentru a transmite logurile containerului către CloudWatch.
- **executionRoleArn**: Un rol IAM care acordă ECS-ului permisiunea de a descărca imaginile din ECR și de a scrie loguri.
- **taskRoleArn**: Un rol IAM pe care codul aplicației îl asumă la runtime pentru a accesa alte servicii AWS.

### 3. Configurarea rețelei

Task-urile Fargate rulează în interiorul unui VPC. Creați sau selectați subrețele private pentru task-uri și asociați un security group care permite trafic inbound doar pe porturile pe care aplicația le expune. Pentru servicii accesibile din internet, plasați un Application Load Balancer (ALB) în subrețele publice și direcționați traficul către task-uri în subrețelele private.

### 4. Crearea unui serviciu ECS

Un serviciu ECS menține numărul dorit de instanțe de task-uri în execuție și se integrează cu ALB-ul pentru verificări de sănătate și distribuirea traficului. La crearea serviciului, specificați:

- Clusterul și task definition-ul.
- Numărul dorit de task-uri.
- Configurația de rețea (subrețele, security groups, asignare IP public).
- Target group-ul load balancer-ului, numele containerului și portul containerului.

Scheduler-ul serviciului înlocuiește automat task-urile cu probleme și le distribuie între Availability Zones pentru disponibilitate ridicată.

## Integrarea cu Application Load Balancer

Un ALB este esențial pentru deployment-urile Fargate de producție. Oferă rutare bazată pe cale și pe host, terminare TLS, verificări de sănătate și connection draining. Creați un target group cu tipul de target setat pe `ip` (nu `instance`, deoarece task-urile Fargate folosesc modul de rețea `awsvpc`). Configurați căi de health check care returnează HTTP 200 de la aplicație și setați valori adecvate pentru deregistration delay, asigurând opriri grațioase în timpul deployment-urilor.

## Politici de auto-scaling

ECS Service Auto Scaling ajustează numărul dorit de task-uri pe baza metricilor CloudWatch. Trei tipuri de politici sunt disponibile:

- **Target Tracking**: Opțiunea cea mai simplă. Setați o valoare țintă pentru o metrică precum utilizarea medie a CPU (de exemplu, 60%), iar ECS ajustează automat numărul de task-uri pentru a menține acea țintă.
- **Step Scaling**: Definiți ajustări de scalare care corespund pragurilor alarmelor CloudWatch. Util când aveți nevoie de comportamente diferite de scale-out și scale-in.
- **Scheduled Scaling**: Creșteți sau reduceți capacitatea la momente predeterminate, ideal pentru sarcini cu tipare de trafic previzibile.

Pentru majoritatea aplicațiilor, începeți cu target tracking pe utilizarea CPU la 60-70%. Adăugați o a doua politică care urmărește numărul de cereri pe target din ALB dacă sarcina este mai degrabă legată de I/O decât de CPU.

## Strategii de optimizare a costurilor

Prețurile Fargate sunt transparente, dar pot crește rapid. Iată metode practice de reducere a costurilor:

- **Dimensionați corect task-urile**: Evitați supra-aprovizionarea de CPU și memorie. Folosiți metricile Container Insights pentru a identifica utilizarea reală a resurselor și ajustați task definition-urile în consecință.
- **Folosiți Fargate Spot**: Pentru sarcinile tolerante la întreruperi (job-uri batch, procesoare de cozi), Fargate Spot oferă economii de până la 70%. Task-urile pot fi întrerupte cu un avertisment de două minute, așa că proiectați pentru oprire grațioasă.
- **Valorificați Savings Plans**: Compute Savings Plans se aplică și la Fargate și pot reduce costurile cu până la 50% în schimbul unui angajament de unu sau trei ani.
- **Optimizați dimensiunea imaginilor**: Imaginile mai mici reduc costurile de stocare ECR și accelerează timpul de pornire al task-urilor. Folosiți build-uri multi-etape și imagini de bază minimale precum Alpine sau distroless.
- **Revizuiți volumul de logging**: CloudWatch Logs facturează ingestia și stocarea. Filtrați logurile detaliate la nivelul aplicației și setați politici de retenție a logurilor.

## Fargate vs. EC2 vs. EKS: Alegerea abordării potrivite

| Criteriu | Fargate | EC2 Launch Type | EKS (Kubernetes) |
|---|---|---|---|
| Administrare servere | Niciuna | Administrați instanțele | Configurați control plane-ul |
| Granularitate scalare | Per task | Per instanță + per task | Per pod + per nod |
| Timp de pornire | 30-60 secunde | Depinde de lansarea instanței | Depinde de aprovizionarea nodului |
| Model de cost | Plătiți per resurse task | Plătiți per instanță (Reserved/Spot) | Taxă control plane + compute |
| Suport GPU | Limitat | Suport complet | Suport complet |
| Ideal pentru | Microservicii, API-uri, job-uri batch | Sarcini mari și stabile | Echipe cu experiență Kubernetes |

Alegeți Fargate când doriți zero administrare a infrastructurii și sarcinile au trafic variabil sau imprevizibil. Alegeți EC2 când aveți nevoie de instanțe GPU, tipuri specifice de instanțe sau doriți să optimizați costurile pentru sarcini mari și stabile. Alegeți EKS când echipa are expertiză Kubernetes și aveți nevoie de portabilitate între furnizori cloud sau funcționalități avansate de planificare.

Dacă alegi între Fargate și App Runner pe criteriul prețului, am [calculat aceeași aplicație pe ambele](/ro/blog/fargate-vs-app-runner-cost), cu load balancer și NAT incluse.

## Sfaturi practice pentru deployment-uri de producție

- **Folosiți deployment-uri rolling** cu `minimumHealthyPercent` setat la 100 și `maximumPercent` setat la 200. Aceasta asigură deployment-uri fără downtime prin lansarea noilor task-uri înainte de oprirea celor vechi.
- **Activați ECS Exec** pentru depanare. Oferă acces interactiv la shell-ul containerelor în execuție fără SSH, folosind AWS Systems Manager în spate.
- **Setați timeout-uri de oprire** adecvate. Parametrul `stopTimeout` oferă aplicației timp să finalizeze cererile în curs înainte ca containerul să fie oprit forțat.
- **Implementați verificări de sănătate** atât la nivelul containerului (în task definition), cât și la nivelul target group-ului ALB. Folosiți endpoint-uri distincte dacă este necesar.
- **Folosiți AWS Copilot sau CDK** pentru a gestiona infrastructura ca cod. Ambele instrumente simplifică aprovizionarea resurselor ECS și suportă generarea de pipeline-uri CI/CD.
- **Monitorizați cu Container Insights** pentru vizibilitate asupra metricilor de CPU, memorie, rețea și stocare la nivelul task-ului și serviciului.

## Concluzie

AWS ECS Fargate oferă un echilibru convingător între simplitate și putere pentru rularea aplicațiilor containerizate. Prin eliminarea administrării serverelor, permite echipelor de inginerie să se concentreze pe logica aplicației în loc de infrastructură. Cu dimensionare atentă a task-urilor, politici de auto-scaling și strategii de optimizare a costurilor, Fargate poate servi drept fundație robustă pentru sarcinile de producție de orice dimensiune.
