Ritorno
Tech 6 min di lettura - 30 nov. 20 - Matthieu Locussol

Come distribuire il tuo back-end su AWS Elastic Beanstalk con Github Actions?

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:
  1. Creare la nostra applicazione su Elastic Beanstalk (per ospitare il back-end)
  2. Creare una chiave di accesso alla nostra applicazione (per avere i diritti di distribuire il back-end)
  3. Creare una Github Action (per distribuire il back-end automaticamente ad ogni push)
  4. (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.
create-application
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.
choose-platform
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".
iam-service
Ricerca del servizio "IAM" di AWS
Creeremo un nuovo utente. Vai alla sezione "Utenti" quindi clicca su "Aggiungi utente"
iam-users
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".
iam-access-strategy
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".
iam-user-created
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:
github-setup-secrets-variables
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:
github-actions-tab
Creazione di un nuovo workflow in Github Actions
choose-workflow-template
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ì:
github-commit-configuration
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") :
aws-edit-environment
Accesso alla configurazione dell'ambiente Elastic Beanstalk
Puoi definire le tue variabili d'ambiente in fondo alla pagina nella sezione "Proprietà dell'ambiente" :
ebs-variables-environment
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:
ebs-environments-list
Stato del nostro ambiente deployed

Per approfondire

  1. Puoi, se lo desideri, configurare diversi ambienti di sviluppo: "Staging" e "Production" corrispondenti rispettivamente a un branch "staging" e un branch "master".
  2. Puoi documentarti su workflow_dispatch per configurare un trigger manuale anziché automatico della tua Github Action.

Referenze

Desideri essere accompagnato per lanciare il tuo progetto digitale ?

Invia il tuo progetto ora