Implementare un'architettura scalabile per il tuo back-end può sembrare una vera sfida. Infatti, la scalabilità di un'applicazione è sempre presentata come un problema difficile da superare: anche se hai scelto le migliori tecnologie per il tuo progetto, avrai esigenze crescenti di risorse, un'inconsistenza della domanda e forse anche difficoltà ad assicurare un uptime competitivo.
Tranquillizzati, tutto questo è finito. La scalabilità è, prima di tutto, scegliere gli strumenti giusti. In questo articolo, imparerai a mettere online il tuo back-end sul servizio
Elastic Beanstalk (EBS) di AWS automaticamente durante un push sul tuo repository Github.
Motivazioni
Per chi?
Elastic Beanstalk ti permette di distribuire un'ampia gamma di tecnologie online (Java, PHP, Python, Ruby, Node.js, etc.). Amazon fattura i suoi servizi in base all'utilizzo che ne fai (il "pay as you go") e
la versione gratuita ti permette di usufruire di un utilizzo più che sufficiente di questi servizi se vuoi semplicemente scoprire AWS.
Perché?
Il nostro obiettivo è di distribuire il nostro back-end su EBS per non doverti occupare della sua scalabilità grazie alle infrastrutture di Amazon e avere un uptime competitivo. Questo articolo si dividerà in diverse parti partendo dal presupposto che tu stia scoprendo AWS:
Creare la nostra applicazione su Elastic Beanstalk (per ospitare il back-end)
Creare una chiave di accesso alla nostra applicazione (per avere i diritti di distribuire il back-end)
Creare una Github Action (per distribuire il back-end automaticamente ad ogni push)
(Opzionale) Implementare delle variabili d'ambiente
Implementazione
Prerequisiti
Creare la nostra applicazione su Elastic Beanstalk
Analizzeremo il caso pratico dell'implementazione di un'applicazione NestJS su Elastic Beanstalk. Utilizzeremo quindi l'ambiente Node.js, ma puoi naturalmente adattare in base alle tue esigenze.
Vai al servizio "Elastic Beanstalk" della console AWS. Assicurati di selezionare correttamente dal menu a tendina in alto a destra la regione in cui desideri mettere online la tua applicazione. Crea quindi la tua applicazione.

Interface AWS Elastic Beanstalk
Inserisci il nome della tua applicazione, ad esempio "MonapplicationAPI". Seleziona quindi la piattaforma (per il nostro caso d'esempio, "Node.js"). Puoi lasciare gli altri campi così come sono. Clicca su "Crea applicazione" in fondo alla pagina.

Scelta della piattaforma dell'applicazione Beanstalk
AWS ha creato la tua applicazione "MonapplicationAPI" e sta ora creando l'ambiente associato all'applicazione: "Monapplicationapi-env". Questa operazione può richiedere 5 minuti. Possiamo passare al passo successivo durante questo tempo.
Creare una chiave di accesso alla nostra applicazione
Il nostro obiettivo è di distribuire automaticamente il nostro back-end tramite Github Actions. Per questo, creeremo una chiave di accesso che permetterà a Github di connettersi al nostro account AWS.
Cambia servizio (menu in alto a sinistra) e vai al servizio "IAM".

Ricerca del servizio "IAM" di AWS
Creeremo un nuovo utente. Vai alla sezione "Utenti" quindi clicca su "Aggiungi utente"

Sezione "Utenti" del servizio IAM di AWS
Daremo il nome " al nostro utenteMonapplicationAPIDeploy" e selezioneremo il tipo di accesso "Accesso programmatico". Puoi quindi cliccare su "Avanti: Autorizzazioni".
Ora possiamo selezionare "Allega direttamente le policy esistenti" e spuntare la policy "AWSElasticBeanstalkFullAccess". Puoi quindi cliccare su "Avanti: Tag".

Selezione di una policy di accesso per l'utente IAM
Niente da fare per il passaggio "Tag". puoi cliccare su "Avanti: Verifica" e poi su "Crea utente".

Recupero delle chiavi di accesso IAM
Annota il tuo ID della chiave di accesso "AWS_ACCESS_KEY_ID" e la tua chiave di accesso segreta "AWS_SECRET_ACCESS_KEY". Li useremo subito dopo per configurare il deployment su Github.
Crea una Github Action
Preambolo
Prima di continuare e configurare la nostra azione di deployment automatico, dovrai aggiungere due file nel tuo repository per configurare Elastic Beanstalk. Nessuna paura, la procedura è molto semplice. Posizionati nella radice (dove si trova il tuo package.json):
1. Crea un file ".ebignore" in cui metterai:
node_modules
2. Crea un file "Procfile" in cui metterai il tuo comando per avviare il back-end (nel mio caso "npm run start:prod") :
web: npm run start:prod
3. Dovrai necessariamente ascoltare sulla porta fornita nella variabile d'ambiente PORT da Beanstalk. Nel caso di NestJS, verifica che il tuo "main.ts" contenga questa riga:
await app.listen(process.env.PORT);
Dovrai poi inserire le due chiavi AWS che abbiamo creato in precedenza nel servizio IAM. Vai sul tuo repository Github, nella sezione "Settings > Secrets". Aggiungi quindi le due chiavi create:

Aggiunta di variabili segrete su un repository Github
Creazione dell'azione
Vai sul tuo repository Github, nella sezione "Actions". Creeremo un nuovo workflow cliccando sul pulsante "New workflow" in alto a sinistra. Configura un nuovo workflow manualmente:

Creazione di un nuovo workflow in Github Actions

Configurazione di un workflow manualmente
Sostituisci il contenuto del file "main.yml" con questo:
name: Deploy back-end
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v1
- name: Load cache
uses: actions/cache@v2
with:
path: "**/node_modules"
key: ${{ runner.os }}-modules
- name: Install dependencies
run: yarn install
- name: Build App
run: yarn build
- name: Generate deployment package
run: zip -r deploy.zip . -x '*.git*'
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v13
env:
VERSION_LABEL: monapplication-api-${{ github.run_id }}
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: MonapplicationAPI
environment_name: Monapplicationapi-env
version_label: ${{ env.VERSION_LABEL }}
region: eu-west-3
deployment_package: deploy.zip
Sostituisci i valori di "application_name", "environment_name" e "region" con quelli che ti riguardano. Il nome dell'applicazione corrisponde al nome dell'applicazione Elastic Beanstalk e il nome dell'ambiente a quello dell'ambiente Beanstalk.
Se non utilizzi Yarn e/o JavaScript, ricordati di adattare i comandi per installare le dipendenze della tua applicazione e per la build. Qui, realizzo queste azioni negli step 2, 3 e 4: "Yarn cache", "Install dependencies" e "Build app". Per lo step 2 di caching delle dipendenze, puoi documentarti sulla procedura da seguire in base al linguaggio che utilizzi su questa pagina. Una volta effettuate le modifiche, puoi commitare il tuo file di configurazione così:

Creazione del file di configurazione della nostra Github Action
(Opzionale) Implementare delle variabili d'ambiente
Se hai delle variabili d'ambiente da esporre al tuo back-end, puoi aggiungerle dall'interfaccia dell'ambiente della tua applicazione Beanstalk. Per farlo, vai nel servizio "Elastic Beanstalk" e seleziona il tuo ambiente (in questo tutorial "Monapplicationapi-env") :

Accesso alla configurazione dell'ambiente Elastic Beanstalk
Puoi definire le tue variabili d'ambiente in fondo alla pagina nella sezione "Proprietà dell'ambiente" :

Aggiunta delle variabili d'ambiente
Conclusione
Congratulazioni, sei arrivato alla fine di questo articolo. D'ora in poi, un push effettuato sul branch "master" del tuo repository triggererà il deployment della tua applicazione sulla tua applicazione Elastic Beanstalk. Puoi osservare lo stato della tua applicazione sul servizio "Elastic Beanstalk" di AWS:

Stato del nostro ambiente deployed
Per approfondire
Puoi, se lo desideri, configurare diversi ambienti di sviluppo: "Staging" e "Production" corrispondenti rispettivamente a un branch "staging" e un branch "master".
Puoi documentarti su
workflow_dispatch per configurare un trigger manuale anziché automatico della tua Github Action.
Referenze