Implantar uma aplicação Web no AWS Elastic Beanstalk

GUIA DE CONCEITOS BÁSICOS

Módulo 2: Usar o AWS CDK para criar a infraestrutura

Neste módulo, você desenvolverá uma aplicação do CDK que criará toda a infraestrutura necessária para implantar a aplicação Web NodeJS com o Elastic Beanstalk.

Introdução

Neste módulo, você desenvolverá uma aplicação do CDK que criará toda a infraestrutura necessária para implantar a aplicação Web NodeJS com o AWS Elastic Beanstalk.

O que você aprenderá

  • Crie uma aplicação simples do CDK
  • Usar o S3Assets para carregar um pacote no S3
  • Criar uma aplicação do CDK, uma versão da aplicação e um ambiente no Elastic Beanstalk

 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

Criar a aplicação do CDK

Verifique se você tem a versão mais atual do CDK.

npm install -g cdk

Crie um diretório e acesse-o.

mkdir cdk-eb-infra
cd cdk-eb-infra

Inicialize a aplicação CDK que você usará para criar a infraestrutura.

cdk init app --language typescript

Criar o código para a pilha de recursos

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

Uma pilha de recursos é um conjunto de recursos da infraestrutura em nuvem (no seu caso, recursos da AWS) que serão provisionados em uma conta específica. A conta em que os recursos serão provisionados é a pilha configurada nas etapas de pré-requisitos. Na pilha, você criará os seguintes recursos:

  • S3Assets: ele ajudará você a carregar a aplicação compactada no S3 e permitirá que a aplicação do CDK acesse o local do objeto.
  • Aplicação do Elastic Beanstalk: é uma coleção lógica de componentes do Elastic Beanstalk, com componentes, versões e configurações de ambientes.
  • Versão da aplicação do Elastic Beanstalk: refere-se a uma iteração específica e rotulada do código implantável de uma aplicação Web. A versão da aplicação aponta para o Amazon Simple Storage Service (Amazon S3) o objeto que contém o código implantável (no seu caso, o arquivo ZIP que você carregará no S3 com o S3Assets). As aplicações podem ter várias versões, e cada uma é única.
  • Perfil da instância e role: é um contêiner para uma AWS Identity and Access Management (IAM) role que você pode usar para transferir informações da role para uma instância Amazon EC2 quando ela for iniciada.
  • Ambiente do Elastic Beanstalk: é uma coleção de recursos da AWS que executam uma versão da aplicação. Cada ambiente executa apenas uma versão da aplicação por vez.

Carregar automaticamente a aplicação no S3

Para implantar a aplicação Web, você precisa empacotá-la e carregá-la no Amazon Simple Storage Service (S3) para que o Elastic Beanstalk implante-a no ambiente.

Empacotaremos a aplicação no Módulo 3 do guia, mas por ora nosso foco será no carregamento dela no S3. Para isso, você usará um construtor do CDK chamado S3Assets. Esse módulo carregará os arquivos e o diretório locais no S3.

Para fazer isso na aplicação do CDK, primeiro instale o módulo aws-s3-assets.

npm i @aws-cdk/aws-s3-assets

No arquivo lib/cdk-eb-infra-stack.ts, adicione a dependência à parte superior do arquivo.

import s3assets = require('@aws-cdk/aws-s3-assets');

Na linha comentada da pilha “The code that defines your stack goes here” (O código que define a pilha deve ser inserido aqui), adicione o código a seguir.

 // Construct an S3 asset from the ZIP located from directory up.
const webAppZipArchive = new s3assets.Asset(this, 'WebAppZip', {
      path: `${__dirname}/../app.zip`,
});

O código usa o módulo S3Assets, recupera o arquivo ZIP da aplicação Web localizado na raiz da aplicação do CDK e carrega-o no S3. Sempre que você atualizar o arquivo ZIP e implantar a pilha, o arquivo será atualizado no S3.

Adicionar as dependências do CDK no Elastic Beanstalk

Vamos criar a aplicação, a versão da aplicação e o ambiente do Elastic Beanstalk para implantar a aplicação Web carregada no S3 com o S3Assets.

Primeiro, instale o módulo do Elastic Beanstalk para o CDK.

npm i @aws-cdk/aws-elasticbeanstalk

Adicione a dependência à parte superior do arquivo lib/cdk-eb-infra-stack.ts.

import elasticbeanstalk = require('@aws-cdk/aws-elasticbeanstalk');

Criar a aplicação do Elastic Beanstalk

Agora você pode criar a aplicação do Elastic Beanstalk. Conforme mencionado anteriormente, uma aplicação do Elastic Beanstalk é uma coleção lógica de componentes do serviço, como uma pasta.

Adicione o código ao código do S3Assets. Ele criará a aplicação com o nome MyWebApp no Elastic Beanstalk.

// Create a ElasticBeanStalk app.
const appName = 'MyWebApp';
const app = new elasticbeanstalk.CfnApplication(this, 'Application', {
    applicationName: appName,
});

Criar a versão da aplicação do Elastic Beanstalk

Agora você precisa criar uma versão da aplicação do ativo do S3 criado anteriormente. Essa parte do código criará a versão da aplicação com o nome do bucket do S3 e a chave do objeto do S3 que o S3Assets e o CDK apresentarão ao método.

// Create an app version from the S3 asset defined earlier
const appVersionProps = new elasticbeanstalk.CfnApplicationVersion(this, 'AppVersion', {
    applicationName: appName,
    sourceBundle: {
        s3Bucket: webAppZipArchive.s3BucketName,
        s3Key: webAppZipArchive.s3ObjectKey,
    },
});

Antes de criar a versão da aplicação, verifique se a aplicação do Elastic Beanstalk já existe. É muito fácil fazer isso com o CDK.

// Make sure that Elastic Beanstalk app exists before creating an app version
appVersionProps.addDependsOn(app);

Criar o perfil da instância

Para criar o ambiente do Elastic Beanstalk, você precisará fornecer o nome de um perfil da instância existente.

Um perfil da instância é um contêiner para uma AWS Identity and Access Management (IAM) role que você pode usar para transferir informações da role para uma instância Amazon EC2 quando ela for iniciada.

No seu caso, a role terá uma política gerenciada anexada: AWSElasticBeanstalkWebTier. Essa política concede permissões à aplicação para que ela carregue logs no Amazon S3 e corrija informações no AWS X-Ray.

Primeiro, instale o módulo do IAM na aplicação do CDK.

npm i @aws-cdk/aws-iam

Depois disso, importe a dependência na pilha do CDK em que você está trabalhando:

import iam = require('@aws-cdk/aws-iam');

Após o código para criar a versão da aplicação, você pode adicionar o seguinte código:

// Create role and instance profile
const myRole = new iam.Role(this, `${appName}-aws-elasticbeanstalk-ec2-role`, {
    assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
});

const managedPolicy = iam.ManagedPolicy.fromAwsManagedPolicyName('AWSElasticBeanstalkWebTier')
myRole.addManagedPolicy(managedPolicy);

const myProfileName = `${appName}-InstanceProfile`

const instanceProfile = new iam.CfnInstanceProfile(this, myProfileName, {
    instanceProfileName: myProfileName,
    roles: [
        myRole.roleName
    ]
});

Primeiro, o código cria uma IAM role (myRole).

Para permitir que as instâncias do EC2 do ambiente assumam a role, o perfil da instância precisa especificar o Amazon EC2 como uma entidade confiável na política de relação de confiança.

Adicionaremos a política gerenciada AWSElasticBeanstalkWebTier à role e, com a role e o nome do perfil, criaremos o perfil da instância.

Criar o ambiente do Elastic Beanstalk

Por último, você precisa criar o ambiente do Elastic Beanstalk. Ele é uma coleção de recursos da AWS que executam uma versão da aplicação. Precisaremos fornecer algumas informações sobre a infraestrutura para o ambiente.

Primeiro, vamos criar o ambiente. Ao criar o ambiente, você precisa indicar um nome que aparecerá na console do Elastic Beanstalk. Nesse caso, vamos usar o nome MyWebAppEnvironment.

Depois, você precisa dar um nome à aplicação, que será recuperado da definição anterior da aplicação do Elastic Beanstalk.

O nome da pilha de soluções é o nome da plataforma gerenciada que o Elastic Beanstalk fornece para executar aplicações Web. Com o nome certo da solução, o Elastic Beanstalk provisionará os recursos certos para a aplicação, por exemplo, as instâncias do Amazon Elastic Compute Cloud (Amazon EC2). Escolha a pilha de softwares certa de acordo com o framework e a plataforma selecionados para desenvolver a aplicação Web. Nesse caso específico, você usará a string “64bit Amazon Linux 2 v5.4.4 running Node.js 14”. Caso você queira saber a origem da string, vá para o fim do módulo e veja mais informações sobre os nomes das pilhas de soluções.

O atributo option settings permite configurar o ambiente do Elastic Beanstalk de acordo com suas necessidades:

  • IamInstanceProfile: referencie o perfil da instância criado nas etapas anteriores.
  • MinSize, MaxSize e InstanceTypes: são configurações para as instâncias e o grupo de autoscaling que o Elastic Beanstalk gera. Esses parâmetros são opcionais. Caso você não queira defini-los, o Elastic Beanstalk escolherá o tipo de instância e os tamanhos máximo e mínimo do grupo de autoscaling de acordo com a definição da plataforma. Defina-os para continuar no nível gratuito da AWS.

Mais informações sobre as opções de configuração do Elastic Beanstalk

Para definir todas as opções de configuração, adicione as seguintes linhas do código:

// Example of some options which can be configured
const optionSettingProperties: elasticbeanstalk.CfnEnvironment.OptionSettingProperty[] = [
    {
        namespace: 'aws:autoscaling:launchconfiguration',
        optionName: 'IamInstanceProfile',
        value: myProfileName,
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MinSize',
        value: '1',
    },
    {
        namespace: 'aws:autoscaling:asg',
        optionName: 'MaxSize',
        value: '1',
    },
    {
        namespace: 'aws:ec2:instances',
        optionName: 'InstanceTypes',
        value: 't2.micro',
    },
];

Por mim, temos a identificação da versão. Esse atributo é importante, pois ele precisa ser uma referência para a versão da aplicação recém-criada.

Com todas essas informações, agora você já pode criar o ambiente do Elastic Beanstalk.

Cole o código a seguir no arquivo da definição da pilha.

// Create an Elastic Beanstalk environment to run the application
const elbEnv = new elasticbeanstalk.CfnEnvironment(this, 'Environment', {
    environmentName: 'MyWebAppEnvironment',
    applicationName: app.applicationName || appName,
    solutionStackName: '64bit Amazon Linux 2 v5.4.4 running Node.js 14',
    optionSettings: optionSettingProperties,
    versionLabel: appVersionProps.ref,
});

Erros comuns

Usar várias versões das bibliotecas do CDK

Ao usar o CDK, você pode encontrar um erro comum. Quando você importar e começar a usar uma biblioteca na aplicação, a palavra “this” será sublinhada, e você verá um erro na compilação.

gsg_build_elb_1

Esse erro pode ocorrer porque você está usando o módulo do CDK com uma versão diferente da biblioteca principal do CDK. O CDK é atualizado com frequência, então esse erro é bem comum.

Para corrigi-lo, atualize todos os pacotes do CDK para a mesma versão. No arquivo package.json da aplicação do CDK, é possível ver a versão de cada pacote.

gsg_build_elb_2

Mais informações

Mais informações sobre o nome das pilhas de soluções do Elastic Beanstalk

Na documentação, você pode encontrar mais informações sobre as plataformas compatíveis com o Elastic Beanstalk. Esta página é atualizada sempre que novas plataformas são adicionadas e que plataformas antigas são desativadas.

Caso você queira saber o nome correto da plataforma, por exemplo, “64bit Amazon Linux 2 v5.4.4 running Node.js 14”, use a AWS CLI para ver a lista de todas as plataformas compatíveis.

aws elasticbeanstalk list-available-solution-stacks

Ela retornará uma lista completa das strings de plataformas compatíveis que você pode usar na aplicação do CDK.

Conclusão

Neste módulo, você aprendeu a criar todos os recursos necessários do Elastic Beanstalk para implantar automaticamente sua aplicação. No próximo módulo, você aprenderá a fazer a implantação na nuvem e a atualizar a aplicação quando houver mudanças.

A seguir: Implantar a aplicação

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