Anatomia di una pipeline con AWS CodePipeline
AWS CodePipeline modella il flusso di release come sequenza di stage, ciascuno composto da una o più action di tipo source, build, test, approval, deploy o invoke. Le action dello stesso stage girano in parallelo o in sequenza controllata dal loro runOrder; ogni stage consuma un input artifact e produce un output artifact, persistiti in un artifact bucket S3.
Per il source, CodeCommit, S3 ed ECR sono integrazioni native. Per un Git di terze parti (GitHub, GitHub Enterprise, Bitbucket, GitLab) l’approccio corretto è una connection gestita (AWS CodeConnections, ex CodeStar Connections): evita webhook manuali e Personal Access Token nel codice, delegando l’autenticazione OAuth alla connection. Sul trigger, valuta il trade-off tra polling (semplice ma con latenza e chiamate ripetute) e modello event-driven via EventBridge o webhook, preferibile in produzione per reattività e costi.
Build e test gate con AWS CodeBuild
AWS CodeBuild esegue le build in ambienti effimeri governati dal buildspec (fasi install, pre_build, build, post_build, più le sezioni artifacts, reports, cache, env). Il test gate si fonda sull’exit code: qualsiasi comando che ritorna un valore diverso da zero fa fallire la fase, quindi il progetto CodeBuild, quindi lo stage, bloccando la promozione a valle. Non serve logica custom: basta che il runner dei test propaghi correttamente il codice di uscita.
I risultati vanno raccolti in un report group (formati JUnit, TestNG, Cucumber e report di code coverage) per storicizzare pass/fail e trend senza scavare nei log. Per i segreti (token di registry, credenziali) usa variabili d’ambiente che referenziano Secrets Manager o SSM Parameter Store: mai valori in chiaro nel buildspec versionato.
Gestione delle dipendenze con AWS CodeArtifact
AWS CodeArtifact è il repository privato di package per npm, PyPI, Maven/Gradle, NuGet e altri. Un domain raggruppa più repository, condividendo storage e chiave KMS e semplificando le policy. Il pattern chiave è l’upstream repository con una external connection verso il registry pubblico: il repository interno fa da proxy e cache: la prima richiesta scarica il package da upstream, le successive lo servono localmente, rendendo le build riproducibili e proteggendo dalla sparizione o compromissione di pacchetti pubblici. L’autenticazione avviene con un token temporaneo; per traffico privato si aggiungono VPC endpoint (interface endpoint) così CodeBuild in VPC non esce su Internet.
Promozione degli artefatti fra ambienti e account
Il modello multi-account isola dev, staging e prod. Per una pipeline cross-account l’artifact bucket S3 deve essere cifrato con una customer managed KMS key, non con la chiave AWS-managed di default: solo una CMK può avere una key policy che autorizza i ruoli degli altri account a decifrare gli artifact. Servono quindi bucket policy e KMS key policy che concedano l’accesso ai ruoli cross-account, e CodePipeline assume un ruolo nell’account target per le action di deploy. La promozione fra ambienti si realizza con stage successivi separati da un’approvazione manuale come gate verso produzione.
Trappole tipiche d’esame
- Deploy cross-account che fallisce con errori di accesso agli artifact → soluzione: quasi sempre manca la CMK. Con la chiave S3 di default l’account target non decifra l’output artifact; passa a customer managed KMS key con key policy che include i ruoli cross-account.
- I test girano ma non bloccano la pipeline → soluzione: il gate dipende dall’exit code di CodeBuild, non dalla presenza di un report group. Assicurati che il comando di test propaghi un codice di uscita non-zero in caso di fallimento.
- Integrare GitHub/Bitbucket in modo sicuro → soluzione: usa una CodeConnections connection, non webhook manuali o PAT hardcoded nel source stage.
- Notificare gli approver e mettere in pausa la pipeline → soluzione: action di tipo manual approval con topic SNS: gli approver necessitano del permesso
codepipeline:PutApprovalResult, non solo dell’iscrizione al topic. - Build lente o non riproducibili per dipendenze pubbliche → soluzione: CodeArtifact con upstream repository ed external connection come proxy/cache, non download diretto dal registry pubblico a ogni build.
- CodeBuild in VPC che non raggiunge CodeArtifact o Secrets Manager → soluzione: aggiungi gli interface VPC endpoint necessari (e S3 gateway endpoint), non una NAT generica, se la richiesta è accesso privato senza uscita Internet.