Déployer une application web sur Amazon EC2

GUIDE DE DÉMARRAGE

Module 1 : créer votre infrastructure

Dans ce module, vous créerez une pile AWS CDK, un groupe de sécurité avec accès entrant et un profil d'instance IAM.

Introduction

Avant de déployer l'application web, nous devons créer une instance Amazon EC2 et les ressources requises. Dans ce module, nous apprendrons à créer la nouvelle application AWS CDK, installer les dépendances pour nos ressources, et définir une instance Amazon EC2, un groupe de sécurité avec un accès entrant, et un profil d'instance IAM. Nous pourrons en outre, avec l'aide du kit CDK, créer la paire de clés utilisée pour accéder à l'instance.

Ce que vous apprendrez

  • Créer une nouvelle application AWS CDK
  • Installer les dépendances pour les ressources requises
  • Définir les ressources dans l'application CDK

 Durée

10 minutes

 Prérequis du module

  • Compte AWS avec accès administrateur**
  • Dernière version de Chrome ou de Firefox (recommandé)

[**] Les comptes créés dans les dernières 24 heures sont susceptibles de ne pas encore avoir accès aux services nécessaires pour ce tutoriel.

Implémentation

Créer l'application CDK

Tout d'abord, assurez-vous que le kit CDK est installé. À défaut, suivez les instructions du guide Démarrer avec le kit AWS CDK :

cdk --verison

Nous allons à présent créer le squelette de l'application CDK en utilisant TypeScript comme langage de prédilection :

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

Cette opération produira le résultat suivant :

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!

Si le message suivant s'affiche, nous vous recommandons de mettre à niveau votre version du kit CDK en utilisant la commande fournie, puis en exécutant 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

Créer le code pour la pile de ressources

Accédez au fichier /lib/cdk-ecs-infra-stack.ts, dans lequel vous écrirez le code de la pile de ressources que vous allez créer.

Une pile de ressources est un ensemble de ressources d'infrastructure cloud (dans votre cas particulier, il s'agira de toutes les ressources AWS), qui seront allouées dans un compte spécifique. Le compte/la région d'allocation de ces ressources peut être configuré dans la pile.

Dans cette pile de ressources, vous créerez les ressources suivantes :

  • Rôle IAM : le rôle qui sera attribué à l'instance EC2 l'autorisant à appeler d'autres services AWS.
  • Instance EC2 : la machine virtuelle que vous utiliserez pour héberger votre application web.
  • Groupe de sécurité : le pare-feu virtuel pour autoriser les demandes entrantes vers votre application web.
  • Paire de clés EC2 SSH : ensemble d'informations d'identification à utiliser pour accéder par SSH à l'instance en vue d'exécuter des commandes pour tout configurer.

Créer l'instance EC2

Avant de démarrer la création de l'instance EC2 et des autres ressources, vous devez d'abord importer les modules appropriés :

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

Vous modifierez ensuite le fichier lib/cdk-eb-infra-stack.ts pour ajouter la dépendance en haut du fichier, sous l'importation existante pour @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

Dans ces modules, vous avez accès à tous les outils dont vous avez besoin pour déployer l'application web. La première étape consiste à trouver le VPC par défaut existant dans votre compte en ajoutant le code suivant sous la ligne // Le code qui définit votre pile s'inscrit ici :

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

À l'aide du package cdk-ec2-key-pair, vous allez créer une paire de clés SSH et la stocker dans 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; 

Vous devez à présent créer un groupe de sécurité qui autorise l'accès SSH et HTTP depuis un emplacement quelconque en ajoutant 2 règles. Il convient de noter que l'accès SSH depuis un emplacement quelconque est acceptable pour une courte période dans un environnement de test et qu'en revanche, il est dangereux pour les environnements de production. Vous créerez également un rôle IAM pour l'instance EC2 qui l'autorise l'appel d'autres services AWS, et attacherez la politique préconfigurée pour lire les configurations à partir d'AWS Secrets Manager (où la clé publique SSH sera stockée) :

// 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")
    );

Vous êtes désormais prêt à créer l'instance EC2 à l'aide d'une Amazon Machine Image (AMI) préconfigurée. Pour ce guide, vous utiliserez l'image Amazon Linux 2 pour l'architecture de CPU X86_64. Vous appliquerez en outre le rôle IAM que vous avez créé, le VPC par défaut et le type d'instance à utiliser. Il s'agit, dans votre cas d'utilisation, d'un t2.micro avec 1 vCPU et 1 Go de mémoire – vous trouverez tous les types d'instance disponibles ici.

// 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,
    });

Vous avez à présent défini votre pile AWS CDK pour créer une instance Amazon EC2, un groupe de sécurité avec accès entrant et un profil d'instance IAM. Avant le déploiement de la pile, vous devrez d'abord installer les packages sur le système d'exploitation hôte pour exécuter votre application, puis copier le code de votre application sur l'instance. 

Votre fichier ec2-cdk-stack.ts se présentera comme suit :

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,
    });
  }
}

Conclusion

À travers ce module, vous avez appris à créer une application CDK en vue de mettre en œuvre toute l'infrastructure indispensable au déploiement de votre application web sur une instance EC2. Dans le module suivant, vous apprendrez à configurer l'instance EC2 à l'amorçage, notamment en installant et en configurant tous les packages du système d'exploitation, ainsi qu'en déployant votre code sur cette instance.

À suivre :configuration automatique

Dites-nous si nous avons répondu à vos attentes.