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:

gsg-build-ecs-2

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:

gsg-build-ecs-3

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:

gsg-build-ecs-4

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

Envie seus comentários.

Agradecemos por seus comentários
Ficamos satisfeitos por esta página ter ajudado você. Deseja compartilhar detalhes adicionais para nos ajudar a continuar melhorando?
Fechar
Agradecemos por seus comentários
Lamentamos que esta página não tenha ajudado você. Deseja compartilhar detalhes adicionais para nos ajudar a continuar melhorando?
Fechar