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