AWS 12factor — Cheat Sheet

Tag: aws, 12factor, cloud-native, microservices, architecture, devops

Livello: intermedio

TL;DR: Mappatura della metodologia 12-Factor App sui servizi cloud AWS per la progettazione e il deploy di applicazioni scalabili, stateless e resilienti.

Concetti chiave

Codebase: Un singolo repository per app, multipli deploy. Su AWS si implementa tramite AWS CodeCommit, GitHub o GitLab collegati ad AWS CodePipeline.

Dependencies: Dichiarazione esplicita e isolata. Utilizzo di container (Amazon ECR) o Lambda Layers per pacchettizzare le dipendenze in modo immutabile.

Config: Configurazione salvata nell'ambiente. Esternalizzare tramite AWS Systems Manager Parameter Store o AWS Secrets Manager, iniettando i valori come variabili d'ambiente.

Backing services: Trattare i servizi di supporto come risorse collegate. Utilizzare servizi gestiti come Amazon RDS, DynamoDB, ElastiCache o SQS.

Build, release, run: Separazione rigida delle fasi. CodeBuild per la pacchettizzazione, CodePipeline/CodeDeploy per la release, ECS/EKS/Lambda per l'esecuzione.

Processes: Esecuzione come uno o più processi stateless. I container su AWS Fargate o le funzioni AWS Lambda non devono mantenere stato locale; lo stato va su servizi esterni.

Port binding: Esposizione del servizio tramite port binding. Implementato tramite Application Load Balancer (ALB) o Amazon API Gateway che instradano il traffico ai container/funzioni.

Concurrency: Scalabilità orizzontale. Ottenuta configurando Auto Scaling Groups per EC2, Service Auto Scaling per ECS, o affidandosi allo scaling automatico di Lambda.

Disposability: Avvio rapido e spegnimento pulito. I container ECS devono gestire correttamente i segnali SIGTERM. Lambda offre disposability nativa.

Dev/prod parity: Mantenere gli ambienti simili. Garantita automatizzando il provisioning delle infrastrutture con Infrastructure as Code (AWS CloudFormation, AWS CDK o Terraform).

Logs: Log trattati come stream di eventi. I processi scrivono su stdout/stderr; l'infrastruttura (ECS, Lambda) invia gli stream direttamente ad Amazon CloudWatch Logs.

Admin processes: Task amministrativi eseguiti come processi una tantum. Utilizzo di ECS RunTask o funzioni Lambda dedicate per migrazioni DB o script di manutenzione.

Domande tipiche e risposte pronte

Q: Come gestisci la configurazione in modo sicuro rispettando il terzo factor su AWS?R: Salvo i parametri non sensibili in SSM Parameter Store e le password in Secrets Manager. Li inietto nei container ECS o nelle Lambda direttamente come variabili d'ambiente a runtime.

Q: In che modo AWS Lambda supporta il factor "Processes" (esecuzione stateless)?R: Lambda è intrinsecamente effimera. Qualsiasi stato persistente lo delego obbligatoriamente a servizi esterni di backing come DynamoDB o S3, costringendomi a un design stateless.

Q: Come garantisci la parità tra ambienti di sviluppo e produzione su AWS?R: Scrivo tutta l'infrastruttura utilizzando AWS CDK. Questo mi permette di fare il deploy di stack identici su account AWS separati per dev, staging e prod con minime variazioni parametrizzate.

Insidie e errori comuni

Salvare file o sessioni utente sul file system locale di un container o di un'istanza EC2, violando il principio di statelessness (Processi).

Hardcodare credenziali del database o chiavi API direttamente nel codice sorgente invece di iniettarle dall'ambiente.

Utilizzare database o servizi di cache leggeri in locale (es. SQLite) e servizi enterprise in produzione (es. Aurora), rompendo la parità Dev/Prod e mascherando bug.

Scrivere log su file fisici all'interno del container invece di fare streaming su stdout/stderr delegando l'ingestione a CloudWatch.

Snippet e comandi

# Esempio di recupero parametri da SSM per simulare il caricamento della configurazione (Factor 3)
aws ssm get-parameters-by-path \
    --path "/myapp/prod/" \
    --with-decryption \
    --query "Parameters[*].[Name,Value]" \
    --output text

JSON

// Esempio di task definition ECS che inietta configurazioni da Secrets Manager come variabili d'ambiente
{
  "containerDefinitions": [
    {
      "name": "app-container",
      "image": "my-app-image:latest",
      "secrets": [
        {
          "name": "DB_PASSWORD",
          "valueFrom": "arn:aws:secretsmanager:eu-west-1:123456789012:secret:prod/db-password-1234"
        }
      ]
    }
  ]
}

Da ripassare

[ ] Meccanismi di invio dei segnali SIGTERM e lifecycle dei container su AWS Fargate per garantire la Disposability.

[ ] Configurazione ottimale di ECS Service Auto Scaling basata su metriche custom (es. lunghezza coda SQS).

Riferimenti

12factor.net (Manifesto originale)

AWS Whitepapers sull'architettura Cloud-Native e Microservizi

Jarvis Interviews
Jarvis