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.
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.
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.
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.
# 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"
}
]
}
]
}
[ ] 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).
12factor.net (Manifesto originale)
AWS Whitepapers sull'architettura Cloud-Native e Microservizi