Implementa un'applicazione Web su Amazon EC2

GUIDA ALLE OPERAZIONI DI BASE

Modulo 1: Creare la tua Infrastruttura

In questo modulo, creerai una pila AWS CDK, un gruppo di sicurezza con un accesso in entrata e un profilo dell'istanza IAM.

Introduzione

Prima di implementare l'applicazione Web, dobbiamo creare un'istanza Amazon EC2 e le risorse di supporto. In questo modulo, creeremo una nuova app AWS CDK, installare le dipendenze per le nostre risorse e infine definire un'istanza Amazon EC2, un gruppo di sicurezza con accesso in entrata e un profilo dell'istanza IAM. Con l'aiuto di CDK creeremo anche una coppia di chiavi usate per accedere all'istanza.

Cosa imparerai

  • Creare una nuova app AWS CDK
  • Installare le dipendenze per le risorse necessarie
  • Definire le risorse nell'app CDK

 Tempo richiesto per il completamento

10 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

Creare l'app CDK

Innanzitutto, assicurati che il CDK sia installato. Se non lo hai installato, segui la guida Primi passi con AWS CDK:

cdk --verison

Adesso creeremo lo scheletro dell'applicazione CDK usando TypeScript come linguaggio della scelta:

mkdir ec2-cdk
cd ec2-cdk
cdk init app --language typescript

Il risultato sarà il seguente:

Applying project template app for typescript
# Welcome to your CDK TypeScript project!

This is a blank project for TypeScript development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

## Useful commands

 * `npm run build`   compile typescript to js
 * `npm run watch`   watch for changes and compile
 * `npm run test`    perform the jest unit tests
 * `cdk deploy`      deploy this stack to your default AWS account/region
 * `cdk diff`        compare deployed stack with current state
 * `cdk synth`       emits the synthesized CloudFormation template

Executing npm install...
✅ All done!

Se visualizzi il seguente messaggio, ti consigliamo di aggiornare la tua versione CDK usando il comando fornito e successivamente eseguire npm update:

****************************************************
*** Newer version of CDK is available [1.122.0]  ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

# npm install -g aws-cdk
# npm update

Creare il codice per pila di risorse

Vai al file /lib/cdk-ecs-infra-stack.ts, qui è dove scriverai il codice per la pila di risorse che andrai a creare.

Una pila 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/Regione in cui viene effettuato il provisioning di queste risorse può essere configurato nella pila.

In questa pila di risorse, creerai le seguenti risorse:

  • Ruolo IAM: questo ruolo sarà assegnato all'istanza EC2 per permettere di chiamare altri servizi AWS.
  • Istanza EC2: la macchina virtuale che userai per ospitare la tua applicazione Web.
  • Gruppo di sicurezza: il firewall virtuale per permettere le richieste in entrata alla tua applicazione Web.
  • Coppia di chiavi EC2 SSH: una serie di credenziali che puoi usare per il SSH all'istanza per eseguire comandi e impostare tutto.

Creare un'istanza EC2

Per creare l'istanza EC2 e le altre risorse, dovrai innanzitutto importare i moduli corretti:

npm i @aws-cdk/aws-ec2 @aws-cdk/aws-iam @aws-cdk/aws-s3-assets cdk-ec2-key-pair

Dovrai quindi modificare il file lib/cdk-eb-infra-stack.ts per aggiungere la dipendenza all'inizio del file al di sotto dell'importazione esistente per @aws-cdk/core:

import * as ec2 from "@aws-cdk/aws-ec2";            // Allows working with EC2 and VPC resources
import * as iam from "@aws-cdk/aws-iam";            // Allows working with IAM resources
import * as s3assets from "@aws-cdk/aws-s3-assets"; // Allows managing files with S3
import * as keypair from "cdk-ec2-key-pair";        // Helper to create EC2 SSH keypairs
import * as path from "path";                       // Helper for working with file paths

Questi moduli forniscono accesso a tutti i componenti di cui hai bisogno per implementare l'applicazione Web. Il primo passaggio è quello di trovare il VPC di default nel tuo account aggiungendo il seguente codice sotto la linea // Il codice che definisce la tua pila va qui:

// The code that defines your stack goes here
      
      // Look up the default VPC
      const vpc = ec2.Vpc.fromLookup(this, "VPC", {
        isDefault: true
      });

Usando il pacchetto cdk-ec2-key-pair, creerai una coppia di chiavi SSH e la archivierai in AWS Secrets Manager.

 // Create a key pair to be used with this EC2 Instance
    const key = new keypair.KeyPair(this, "KeyPair", {
      name: "cdk-keypair",
      description: "Key Pair created with CDK Deployment",
    });
    key.grantReadOnPublicKey; 

Adesso dovrai creare un gruppo di sicurezza, permettendo l'accesso a SSH e HTTP da ogni parte aggiungendo 2 regole. Nota che l'accesso SSH da ogni parte è accettabile per un breve periodo di tempo in un ambiente di test ma non è sicuro per gli ambienti di produzione. Creerai anche un ruolo IAM per l'istanza EC2 per permetterle di chiamare altri servizi AWS e allegare una policy pre-costruita per leggere le configurazioni al di fuori di AWS Secrets Manager (dove la chiave pubblica SSH sarà archiviata):

// Security group for the EC2 instance
    const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
      vpc,
      description: "Allow SSH (TCP port 22) and HTTP (TCP port 80) in",
      allowAllOutbound: true,
    });

    // Allow SSH access on port tcp/22
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      "Allow SSH Access"
    );

    // Allow HTTP access on port tcp/80
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      "Allow HTTP Access"
    );

    // IAM role to allow access to other AWS services
    const role = new iam.Role(this, "ec2Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
    });

    // IAM policy attachment to allow access to 
    role.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")
    );

Adesso sei pronto per creare l'istanza EC2 usando un'Amazon Machine Image (AMI) pre-costruita. In questa guida, userai Amazon Linux 2 per un'architettura CPU X86_64. Passerai inoltre il ruolo IAM che hai creato, il VPC di default e il tipo di istanza da eseguire, nel tuo caso, su t2.micro- che ha 1 vCPU e 1GB di memoria - visualizzerai tutti i tipi di istanze differenti disponibili qui.

// Look up the AMI Id for the Amazon Linux 2 Image with CPU Type X86_64
    const ami = new ec2.AmazonLinuxImage({
      generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      cpuType: ec2.AmazonLinuxCpuType.X86_64,
    });
// Create the EC2 instance using the Security Group, AMI, and KeyPair defined.
    const ec2Instance = new ec2.Instance(this, "Instance", {
      vpc,
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.T2,
        ec2.InstanceSize.MICRO
      ),
      machineImage: ami,
      securityGroup: securityGroup,
      keyName: key.keyPairName,
      role: role,
    });

Adesso hai definito la tua pila AWS CDK per creare un'istanza Amazon EC2, un gruppo di sicurezza con un accesso in entrata e un profilo dell'istanza IAM. Prima di implementare la pila, devi ancora installare i pacchetti sull'OS host per far funzionare la tua applicazione, nonché copiare il codice dell'applicazione all'istanza. 

Il tuo file ec2-cdk-stack.ts dovrebbe avere questo aspetto:

import * as cdk from '@aws-cdk/core';
import * as ec2 from "@aws-cdk/aws-ec2"; // Allows working with EC2 and VPC resources
import * as iam from "@aws-cdk/aws-iam"; // Allows working with IAM resources
import * as s3assets from "@aws-cdk/aws-s3-assets"; // Allows managing files with S3
import * as keypair from "cdk-ec2-key-pair"; // Helper to create EC2 SSH keypairs
import * as path from "path"; // Helper for working with file paths

export class Ec2CdkStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // The code that defines your stack goes here
          
    // Look up the default VPC
    const vpc = ec2.Vpc.fromLookup(this, "VPC", {
      isDefault: true
    });

    // Create a key pair to be used with this EC2 Instance
    const key = new keypair.KeyPair(this, "KeyPair", {
      name: "cdk-keypair",
      description: "Key Pair created with CDK Deployment",
    });
    key.grantReadOnPublicKey; 

    // Security group for the EC2 instance
    const securityGroup = new ec2.SecurityGroup(this, "SecurityGroup", {
      vpc,
      description: "Allow SSH (TCP port 22) and HTTP (TCP port 80) in",
      allowAllOutbound: true,
    });

    // Allow SSH access on port tcp/22
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(22),
      "Allow SSH Access"
    );

    // Allow HTTP access on port tcp/80
    securityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      "Allow HTTP Access"
    );

    // IAM role to allow access to other AWS services
    const role = new iam.Role(this, "ec2Role", {
      assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
    });

    // IAM policy attachment to allow access to 
    role.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")
    );

    // Look up the AMI Id for the Amazon Linux 2 Image with CPU Type X86_64
    const ami = new ec2.AmazonLinuxImage({
      generation: ec2.AmazonLinuxGeneration.AMAZON_LINUX_2,
      cpuType: ec2.AmazonLinuxCpuType.X86_64,
    });

    // Create the EC2 instance using the Security Group, AMI, and KeyPair defined.
    const ec2Instance = new ec2.Instance(this, "Instance", {
      vpc,
      instanceType: ec2.InstanceType.of(
        ec2.InstanceClass.T2,
        ec2.InstanceSize.MICRO
      ),
      machineImage: ami,
      securityGroup: securityGroup,
      keyName: key.keyPairName,
      role: role,
    });
  }
}

Conclusione

In questo modulo, hai imparato a creare un'applicazione CDK per creare tutte le infrastrutture necessarie per implementare la tua applicazione Web su un'istanza EC2. Nel modulo successivo, imparerai a configurare l'istanza EC2 quando si avvia installando tutti i pacchetti OS, configurandoli e implementando il tuo codice sull'istanza.

Successivo: Configurazione automatizzata

Facci sapere com'è andata.