Implantar uma aplicação Web em contêiner no Amazon ECS
GUIA DE CONCEITOS BÁSICOS
Módulo 2: Criar a infraestrutura e implantar a aplicação
Neste módulo, você criará um cluster ECS e implantará sua aplicação com o CDK
Introdução
Neste módulo, você criará uma aplicação do AWS CDK que criará toda a infraestrutura necessária para configurar um cluster do ECS e implantar um contêiner de exemplo nele.
O que você aprenderá
- Criar uma aplicação simples do CDK
- Criar um cluster do ECS, com Fargate para capacidade
- Criar uma definição de tarefa e serviço para implantar nossa aplicação
Tempo para a conclusão
15 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, certifique-se de ter o CDK instalado. Se você não o instalou, siga os procedimentos descritos em Conceitos básicos do AWS CDK:
cdk --version
Agora usaremos o TypeScript como linguagem-padrão para criar o esqueleto da aplicação do CDK. Execute o seguinte comando no terminal:
mkdir cdk-ecs-infra
cd cdk-ecs-infra
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!
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 na 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 (conforme abordado no guia Conceitos básicos do AWS CDK).
Na pilha de recursos, você criará os seguintes recursos:
- Função do IAM: essa função será atribuída ao contêiner para permitir que ele chame outros serviços da AWS.
- Definição de tarefa do ECS: os parâmetros específicos a serem usados ao iniciar o contêiner.
- Padrão do ECS para serviço de balanceamento de carga Fargate: abstrai a complexidade de todos os componentes necessários para criar o cluster, o balanceador de carga, o serviço e configura tudo para funcionar em conjunto.
Crie o cluster do ECS
Para começar a criar o cluster do ECS, primeiro é necessário importar os módulos corretos:
npm i @aws-cdk/aws-s3-assets
No seu arquivo lib/cdk-eb-infra-stack.ts, adicione a dependência ao topo do arquivo.
npm i @aws-cdk/aws-ec2 @aws-cdk/aws-ecs @aws-cdk/aws-ecs-patterns @aws-cdk/aws-iam
Em seguida, você editará o arquivo lib/cdk-eb-infra-stack.ts para adicionar a dependência na parte superior do arquivo:
import ecs = require('@aws-cdk/aws-ecs'); // Allows working with ECS resources
import ec2 = require('@aws-cdk/aws-ec2'); // Allows working with EC2 and VPC resources
import iam = require('@aws-cdk/aws-iam'); // Allows working with IAM resources
import ecsPatterns = require('@aws-cdk/aws-ecs-patterns') // Helper to create ECS services with loadbalancers, and configure them
Esses módulos oferecem acesso a todos os componentes necessários para implantar a aplicação Web. A primeira etapa é encontrar a VPC padrão existente em sua conta adicionando o seguinte código:
// Look up the default VPC
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
isDefault: true
});
Em seguida, você precisará definir qual contêiner usar e como ele deve ser configurado. Isso é feito criando-se uma definição de tarefa para fornecer a porta do contêiner, a quantidade de CPU e memória necessárias e a imagem do contêiner a ser usada. Para este guia, construiremos a imagem do contêiner fornecida com a aplicação de exemplo na pasta SampleApp e faremos com que o CDK gerencie a construção, a transferência e a implantação do contêiner para nós. Também criaremos uma função do IAM vazia para anexar à definição de tarefa para guias futuros.
Para criar a definição da tarefa e o papel do IAM, adicione o seguinte código:
const taskIamRole = new iam.Role(this, "AppRole", {
roleName: "AppRole",
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
});
const taskDefinition = new ecs.FargateTaskDefinition(this, 'Task', {
taskRole: taskIamRole,
});
taskDefinition.addContainer('MyContainer', {
image: ecs.ContainerImage.fromAsset('../SampleApp'),
portMappings: [{ containerPort: 80 }],
memoryReservationMiB: 256,
cpu : 256,
});
No código acima, você pode ver que especificou um tipo de definição de tarefa para implantar no Fargate usando FargateTaskDefintion e ContainerImage.fromAsset. O CDK construirá a imagem do contêiner usando o Dockerfile no diretório SampleApp.
Em seguida, você precisa configurar o cluster do ECS, definir um serviço, criar um balanceador de carga, configurá-lo para se conectar ao serviço e configurar as regras de grupo de segurança necessárias. Um serviço no ECS é usado para iniciar uma definição de tarefa especificando o número de cópias desejadas, estratégias de implantação e outras configurações. Para este exemplo, lançaremos apenas 1 cópia do contêiner. Um grupo de segurança atua como um firewall virtual para sua instância para controlar o tráfego de entrada e saída, mas você não precisa configurá-lo, pois o padrão do ECS que você está usando fará isso para você.
Adicione o seguinte código ao seu projeto abaixo da definição da tarefa:
new ecsPatterns.ApplicationLoadBalancedFargateService(this, "MyApp", {
vpc: vpc,
taskDefinition: taskDefinition,
desiredCount: 1,
serviceName: 'MyWebApp',
assignPublicIp: true,
publicLoadBalancer: true,
})
Você está transmitindo o objeto da VPC que consultou anteriormente para especificar onde criar todos os recursos, junto com a definição de tarefa que define qual imagem de contêiner implementar. O parâmetro desiredCount indica quantas cópias você deseja, serviceName é o nome desejado para o serviço e publicLoadBalancer é definido como true (verdadeiro) para que você possa acessá-lo via Internet. A linha que define assignPublicIp como true (verdadeiro) é importante neste exemplo, pois estamos usando a VPC padrão que não tem sub-redes privadas. A prática recomendada sugere o lançamento de serviços em sub-redes privadas, mas isso está fora do escopo deste guia.
Agora você está pronto para implantar a aplicação Web, mas primeiro, você precisa configurar o CDK na conta em que está implantando.
Edite o arquivo bin/cdk-ecs-infra.ts e remova o comentário da linha 14:
env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },
O ID e a região da conta configurados na AWS CLI serão usados. Antes de usar o CDK, é preciso fazer seu bootstraping. Isso criará a infraestrutura necessária para que o CDK gerencie a infraestrutura na sua conta. Para iniciar o CDK, execute cdk bootstrap. A saída será semelhante a:
cdk bootstrap
#output
⏳ Bootstrapping environment aws://0123456789012/<region>...
✅ Environment aws://0123456789012/<region> bootstrapped
Isso criará a infraestrutura necessária para o CDK gerenciar a infraestrutura em sua conta. Recomendamos trabalhar com o guia Conceitos básicos do AWS CDK se você não estiver familiarizado com a configuração de aplicações do CDK.
Assim que o bootstrapping for concluído, você executará cdk deploy para implantar o contêiner, o cluster e todas as outras infraestruturas necessárias. A saída será semelhante à seguinte:

O CDK emitirá um aviso antes de criar a infraestrutura, já que ela é uma infraestrutura que altera a configuração de segurança. No seu caso, pela criação de funções do IAM e grupos de segurança. Pressione y e, em seguida, Enter para implantar. O CDK iniciará toda a configuração da infraestrutura que você definiu, o que levará alguns minutos para ser concluído.
Enquanto estiver em execução, você verá atualizações como esta:

Concluído o processo, você verá uma saída com o link para o URL público para acessar seu serviço da seguinte forma:

Exemplo de código completo
import * as cdk from '@aws-cdk/core';
import ecs = require('@aws-cdk/aws-ecs');
import ec2 = require('@aws-cdk/aws-ec2');
import iam = require('@aws-cdk/aws-iam');
import ecsPatterns = require('@aws-cdk/aws-ecs-patterns')
export class CdkEcsInfraStack extends cdk.Stack {
constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// Look up the default VPC
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
isDefault: true
});
const taskIamRole = new iam.Role(this, "AppRole", {
roleName: "AppRole",
assumedBy: new iam.ServicePrincipal('ecs-tasks.amazonaws.com'),
});
const taskDefinition = new ecs.FargateTaskDefinition(this, 'Task', {
taskRole: taskIamRole,
});
taskDefinition.addContainer('MyContainer', {
image: ecs.ContainerImage.fromAsset('../SampleApp'),
portMappings: [{ containerPort: 80 }],
memoryReservationMiB: 256,
cpu : 256,
});
new ecsPatterns.ApplicationLoadBalancedFargateService(this, "MyApp", {
vpc: vpc,
taskDefinition: taskDefinition,
desiredCount: 1,
serviceName: 'MyWebApp',
assignPublicIp: true,
publicLoadBalancer: true,
})
}
}
Conclusão
Neste módulo, você aprendeu a criar um cluster do ECS com um balanceador de carga para servir o tráfego de seu contêiner em execução no Fargate usando um padrão do ECS fornecido pelo CDK. No próximo módulo, você limpará todos os recursos criados neste guia.
A seguir: Limpar recursos