Implementazione di un'app Web su AWS Elastic Beanstalk

GUIDA ALLE OPERAZIONI DI BASE

Modulo 2: creazione dell'infrastruttura usando AWS CDK

In questo modulo creerai un'applicazione CDK che creerà tutta l'infrastruttura necessaria per implementare l'app Web NodeJS utilizzando Elastic Beanstalk.

Introduzione

In questo modulo creerai un'applicazione CDK che creerà tutta l'infrastruttura necessaria per implementare l'app Web NodeJS usando AWS Elastic Beanstalk.

Argomenti affrontati

  • Creazione di un'applicazione CDK semplice
  • Caricamento di un pacchetto su S3 usando le risorse S3
  • Creazione di un'app CDK, una versione dell'app e l'ambiente su Elastic Beanstalk

 Tempo richiesto per il completamento

15 minuti

 Prerequisiti del modulo

  • Account AWS con accesso da amministratore**
  • Browser consigliato: l'ultima versione di Chrome o Firefox

[**]Gli account creati nelle ultime 24 ore potrebbero non avere ancora accesso a tutti servizi richiesti per questo tutorial.

Implementazione

Creazione dell'app CDK

Assicurati di avere la versione CDK più recente.

npm install -g cdk

Crea una nuova directory ed entraci.

mkdir cdk-eb-infra
cd cdk-eb-infra

Avvia l'applicazione CDK che userai per creare l'infrastruttura.

cdk init app --language typescript

Creazione del codice per stack di risorse

Vai al file /lib/cdk-eb-infra-stack.ts, lì è dove scriverai il codice per lo stack di risorse che andrai a creare. 

Uno stack di risorse è una serie di risorse delle infrastrutture cloud (nel tuo caso particolare saranno tutte risorse AWS) di cui è stato effettuato il provisioning in un account specifico. L'account dove vengono assegnate queste risorse è lo stack che hai configurato nelle fasi dei prerequisiti. In questo stack di risorse, creerai le seguenti risorse:

  • Risorse S3: ti aiuteranno a caricare la tua applicazione in formato zip su S3 e consentiranno all'applicazione CDK di ottenere la posizione dell'oggetto.
  • App Elastic Beanstalk: è una raccolta logica di componenti di Elastic Beanstalk tra cui ambienti, versioni e configurazione dell'ambiente.
  • Versione dell'app Elastic Beanstalk: riguarda un'iterazione specifica ed etichettata di un codice implementabile per un'applicazione Web. Una versione dell'applicazione punta a un oggetto Amazon Simple Storage Service (Amazon S3) che contiene il codice implementabile, nel tuo caso il file zip che caricherai su S3 utilizzando le risorse S3. Le applicazioni possono avere molte versioni e ciascuna versione dell'applicazione è unica.
  • Profilo dell'istanza e ruolo: è un container per un ruolo AWS Identity and Access Management (IAM) che puoi usare per passare informazioni sul ruolo a un'istanza Amazon EC2 all'avvio della stessa.
  • Ambiente Elastic Beanstalk: è una raccolta di risorse AWS che eseguono una versione dell'applicazione. Ciascun ambiente esegue solo una versione dell'applicazione alla volta.

Caricamento automatico dell'app su S3

Per implementare la tua app Web devi creare un pacchetto e caricarlo su Amazon Simple Storage Service (S3) in modo che Elastic Beanstalk implementi quell'applicazione nell'ambiente.

Creeremo il pacchetto dell'applicazione nel Modulo 3 di questa guida, ma per ora concentriamoci sul caricarlo su S3. Per farlo, userai un costruttore CDK chiamato Risorse S3. Questo modulo spiega come caricare i file locali e la directory su S3.

Per farlo nella nostra applicazione CDK occorrerà prima installare il modulo aws-s3-assets.

npm i @aws-cdk/aws-s3-assets

Poi nel file lib/cdk-eb-infra-stack.ts aggiungiamo la dipendenza nella parte superiore del file.

import s3assets = require('@aws-cdk/aws-s3-assets');

All'interno dello stack, sotto la riga con il commento "The code that defines your stack goes here" (Il codice che definisce il tuo stack va qui), aggiungi il codice seguente.

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

Questo codice usa il modulo Risorse S3 e prende il file zip dell'app Web che si trova nella cartella root dell'app CDK e lo carica su S3. Ogni volta che aggiorni il file zip e implementi questo stack, il file si aggiorna in S3.

Aggiungere le dipendenze CDK di Elastic Beanstalk

Creiamo l'applicazione Elastic Beanstalk, la versione dell'applicazione e l'ambiente così potrai implementare l'app Web che hai appena caricato su S3 usando le risorse S3.

Innanzitutto è necessario installare il modulo Elastic Beanstalk per CDK.

npm i @aws-cdk/aws-elasticbeanstalk

Quindi aggiungi la dipendenza nella parte superiore del file lib/cdk-eb-infra-stack.ts.

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Creazione dell'applicazione Elastic Beanstalk

Creazione dell'app Elastic Beanstalk. Come detto sopra, un'applicazione Elastic Beanstalk è una raccolta logica di componenti Elastic Beanstalk, come una cartella.

Inserisci questo codice sotto il codice delle risorse S3. Questo codice creerà l'applicazione con il nome MyWebApp in Elastic Beanstalk.

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Creazione della versione dell'applicazione Elastic Beanstalk

Ora dovrai creare una versione dell'applicazione dalla risorsa S3 creata precedentemente. Questa parte di codice creerà la versione dell'app usando il nome del bucket S3 e la chiave oggetto S3 che le risorse S3 e CDK forniranno a questo metodo.

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

Prima di andare avanti, assicurati che l'applicazione Elastic Beanstalk esista prima di creare la versione dell'app, che è una procedura estremamente semplice da effettuare con CDK.

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

Creazione del profilo dell'istanza

Per creare il tuo ambiente Elastic Beanstalk, dovrai fornire un nome del profilo dell'istanza esistente.

Un profilo dell'istanza è un container per un ruolo AWS Identity and Access Management (IAM) che puoi usare per passare informazioni sul ruolo a un'istanza Amazon EC2 all'avvio della stessa.

Nel tuo caso al ruolo sarà collegata una policy gestita: AWSElasticBeanstalkWebTier. Questa policy concede all'applicazione l'autorizzazione per caricare i registri su Amazon S3 ed eseguire il debug delle informazioni su AWS X-Ray.

La prima cosa da fare è installare il modulo IAM nella tua app CDK.

npm i @aws-cdk/aws-iam

Quindi importa la dipendenza nello stack CDK su cui abbiamo lavorato:

import iam = require('@aws-cdk/aws-iam');

Dopo il codice per creare la versione dell'applicazione, puoi aggiungere questo codice:

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

La prima cosa che fa il codice è creare un nuovo ruolo IAM (myRole).

Per permettere alle istanze EC2 nel tuo ambiente di assumere il ruolo, il profilo dell'istanza specifica Amazon EC2 come entità attendibile nella policy della relazione di attendibilità.

A quel ruolo poi aggiungiamo la policy gestita AWSElasticBeanstalkWebTier e con quel ruolo e nome del profilo creeremo il profilo dell'istanza.

Creazione dell'ambiente Elastic Beanstalk

L'ultima parte che dovrai creare è l'ambiente Elastic Beanstalk. L'ambiente è una raccolta di risorse AWS che eseguono una versione dell'applicazione. Per l'ambiente dovremo fornire alcune informazioni sull'infrastruttura.

Iniziamo creando l'ambiente. Quando si crea un ambiente occorre assegnargli un nome che comparirà nella console Elastic Beanstalk, in questo caso lo chiameremo MyWebAppEnvironment.

Poi dovrai assegnare un nome all'applicazione, che otterrai dalla precedente definizione dell'applicazione Elastic Beanstalk.

Il nome dello stack di soluzioni è il nome della piattaforma gestita che Elastic Beanstalk offre per eseguire le applicazioni Web. Usando il nome della soluzione giusto, Elastic Beanstalk effettuerà il provisioning delle risorse giuste per la tua applicazione, ad esempio le istanze di Amazon Elastic Compute Cloud (Amazon EC2). Dovrai scegliere il giusto stack di software a seconda del framework e della piattaforma che scegli per distribuire la tua app Web. Per questo particolare caso, dovrai inserire questa stringa "64bit Amazon Linux 2 v5.4.4 running Node.js 14". Alla fine di questo modulo sono riportate ulteriori informazioni sui nomi dello stack di soluzioni se vuoi sapere da dove proviene questa stringa.

L'attributo delle impostazioni delle opzioni consente di configurare l'ambiente Elastic Beanstalk in base alle tue necessità:

  • IamInstanceProfile: qui farai riferimento al profilo dell'istanza creato nei passaggi precedenti.
  • MinSize, MaxSize e InstanceTypes: queste sono configurazioni per le tue istanze e il gruppo di scalabilità automatica che Elastic Beanstalk genera per te. Questi sono parametri opzionali, se non vengono configurati Elastic Beanstalk sceglierà il tipo di istanza e le dimensioni minima e massima del gruppo di scalabilità automatica secondo la definizione della piattaforma. Li stai definendo quindi puoi rimanere nel piano gratuito di AWS.

Ulteriori informazioni sulle Opzioni di configurazione per Elastic Beanstalk

Per definire tutte queste opzioni di configurazione, aggiungi le seguenti righe di codice:

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

Infine abbiamo l'etichetta della versione. Questo è un attributo importante perché deve essere un riferimento alla versione dell'applicazione che abbiamo appena creato.

Con tutte queste informazioni ora puoi creare il tuo ambiente Elastic Beanstalk.

Incolla questo codice nel tuo file di definizione dello stack.

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

Errori comuni

Usare più versioni delle librerie CDK

Un errore comune che può verificarsi durante l'uso di CDK è che quando si importa una libreria e si inizia a usarla nell'applicazione, la parola "this" (questo) viene evidenziata e puoi vedere un problema di compilazione.

gsg_build_elb_1

Questo può accedere perché stai usando un modulo CDK con una versione diversa da quella della libreria principale CDK. CDK si aggiorna molto spesso quindi è un errore abbastanza comune.

Per risolverlo, occorre aggiornare tutti i pacchetti CDK alla stessa versione. Puoi vedere la versione dei tuoi pacchetti CDK nel file package.json nella tua applicazione CDK.

gsg_build_elb_2

Ulteriori informazioni

Ulteriori informazioni sul nome dello stack di soluzioni Elastic Beanstalk

Nella documentazione puoi trovare informazioni su tutte le piattaforme supportate per Elastic Beanstalk. Questa pagina continua ad aggiornarsi man mano che vengono aggiunte nuove piattaforme e quelle vecchie vengono ritirate.

Per ulteriori informazioni su come ottenere il giusto nome della piattaforma (ad esempio, 64bit Amazon Linux 2 v5.4.4 running Node.js 14), puoi usare la AWS CLI e ottenere una lista di tutte le piattaforme supportate.

aws elasticbeanstalk list-available-solution-stacks

Verrà visualizzato un lungo elenco di stringhe di piattaforme supportate che puoi usare nella tua applicazione CDK.

Conclusione

In questo modulo abbiamo imparato come creare tutte le risorse di Elastic Beanstalk necessarie per implementare automaticamente la tua applicazione. Nel modulo successivo implementeremo il servizio su cloud e scopriremo come aggiornare l'app in caso di modifiche.

A seguire: implementazione dell'applicazione

Facci sapere com'è andata.

Grazie per il tuo feedback
Siamo contenti che questa pagina ti sia stata d’aiuto. Vuoi condividere ulteriori dettagli per aiutarci a continuare a migliorare?
Chiudi
Grazie per il tuo feedback
Ci dispiace che questa pagina non ti sia stata d'aiuto. Vuoi condividere ulteriori dettagli per aiutarci a continuare a migliorare?
Chiudi