Implantar uma aplicação Web no Amazon EC2

GUIA DE CONCEITOS BÁSICOS

Módulo 1: Criar a infraestrutura

Neste módulo, você criará uma pilha do AWS CDK, um grupo de segurança com acesso de entrada e um perfil da instância do IAM.

Introdução

Antes de implantar a aplicação Web, precisamos criar uma instância do Amazon EC2 e recursos de suporte. Neste módulo, criaremos a nova aplicação do AWS CDK, instalaremos as dependências dos recursos e definiremos uma instância do Amazon EC2, um grupo de segurança com acesso de entrada e um perfil da instância do IAM. Com a ajuda do CDK, também criaremos o par de chaves usado para acessar a instância.

O que você aprenderá

  • Criar uma nova aplicação do AWS CDK
  • Instalar dependências para os recursos necessários
  • Definir os recursos na aplicação do CDK

 Tempo para a conclusão

10 minutos

 Pré-requisitos do módulo

  • Conta da AWS com acesso de administrador**
  • Navegador recomendado: versão mais recente do Chrome ou Firefox

[**]Talvez as contas criadas nas últimas 24 horas ainda não tenham acesso aos serviços necessários para este tutorial.

Implementação

Crie a aplicação do CDK

Primeiro, verifique se o CDK está instalado: caso ele não esteja, siga o guia Conceitos básicos do AWS CDK:

cdk --verison

Agora usaremos o TypeScript como linguagem-padrão para criar o esqueleto da aplicação do CDK:

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

A seguinte saída será exibida:

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 você vir a seguinte mensagem, recomendamos usar o comando informado para atualizar a versão do CDK e executar 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

Crie o código para a pilha de recursos

Acesse o arquivo /lib/cdk-ecs-infra-stack.ts. Nele você escreverá o código para a pilha de recursos que criará.

Uma pilha de recursos é um conjunto de recursos de infraestrutura em nuvem (no seu caso, recursos da AWS) que serão provisionados em uma conta específica. Na pilha, é possível configurar a conta/região em que os recursos serão provisionados.

Na pilha, você criará os seguintes recursos:

  • Função do IAM: essa função será atribuída à instância do EC2 para permitir que ela chame outros serviços da AWS.
  • Instância do EC2: a máquina virtual que você usará para hospedar a aplicação Web.
  • Grupo de segurança: o firewall virtual para permitir solicitações de entrada à aplicação Web.
  • Par de chaves SSH do EC2: um conjunto de credenciais que você pode usar para conectar-se à instância por SSH e executar comandos para configurar tudo.

Crie uma instância do EC2

Para começar a criar a instância do EC2 e outros recursos, primeiro você precisa importar os módulos corretos:

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

Depois você editará o arquivo lib/cdk-eb-infra-stack.ts para adicionar a dependência à parte superior do arquivo abaixo da importação existente para @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

Esses módulos oferecem acesso a todos os componentes necessários para implantar a aplicação Web. A primeira etapa é adicionar o seguinte código abaixo da linha // O código que define a pilha deve ser inserido aqui para identificar a VPC-padrão existente na sua conta:

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

Com o pacote cdk-ec2-key-pair, você criará e armazenará um par de chaves SSH no 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; 

Agora você precisa criar um grupo de segurança, adicionando duas regras para permitir o acesso SSH e HTTP de qualquer lugar. Observe que o acesso SSH de qualquer lugar é aceitável por um período curto em um ambiente de teste, mas não é seguro para ambientes de produção. Você também criará uma função do IAM para a instância do EC2 para permitir que ela chame outros serviços da AWS e anexará a política pré-pronta para ler configurações do AWS Secrets Manager (em que a chave pública SSH será armazenada):

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

Agora você já pode usar uma imagem de máquina da Amazon (AMI) pré-pronta para criar a instância do EC2. Neste guia, você usará o Amazon Linux 2 one para a arquitetura de CPU X86_64. Você também transferirá a função do IAM criada, a VPC-padrão e o tipo de instância a ser executada, no seu caso, uma t2.micro com 1 vCPU e 1 GB de memória. Veja todos os diferentes tipos de instância disponíveis aqui.

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

Agora você definiu a pilha do AWS CDK para criar uma instância do Amazon EC2, um grupo de segurança com acesso de entrada e um perfil da instância do IAM. Antes de implantar a pilha, instale os pacotes no sistema operacional host para executar a aplicação e copie o código da aplicação para a instância. 

O arquivo ec2-cdk-stack.ts deve estar assim:

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

Conclusão

Neste módulo, você aprendeu a criar uma aplicação do CDK para construir toda a infraestrutura necessária para implantar a aplicação Web em uma instância do EC2. No próximo módulo, você aprenderá a instalar e configurar todos os pacotes do sistema operacional e implantar o código na instância do EC2 para configurá-la quando ela for executada.

A seguir: Automatizar a configuração

Envie seus comentários.