Implantar uma aplicação Node.js com o DynamoDB no Elastic Beanstalk - AWS Elastic Beanstalk

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Implantar uma aplicação Node.js com o DynamoDB no Elastic Beanstalk

Este tutorial e seu aplicativo de exemplo nodejs-example-dynamo.zip orientam você pelo processo de implantação de um aplicativo Node.js que usa o AWS SDK JavaScript em Node.js para interagir com o serviço Amazon DynamoDB. Você criará uma tabela do DynamoDB em um banco de dados desacoplado ou externo do ambiente. AWS Elastic Beanstalk Você também configurará o aplicativo para usar um banco de dados desacoplado. Em um ambiente de produção, é uma prática recomendada usar um banco de dados desacoplado do ambiente Elastic Beanstalk para que seja independente do ciclo de vida do ambiente. Essa prática também permite que você execute implantações azul/verde.

O aplicativo de exemplo ilustra o seguinte:

  • Uma tabela do DynamoDB que armazena dados de texto fornecidos pelo usuário.

  • Os arquivos de configuração para criar a tabela.

  • Um tópico do Amazon Simple Notification Service.

  • O uso de um arquivo package.json para instalar pacotes durante a implantação.

Pré-requisitos

Este tutorial requer os seguintes pré-requisitos:

  • Os tempos de execução do Node.js

  • O software gerenciador de pacotes Node.js padrão, npm

  • O gerador de linha de comando Express

  • A Elastic Beanstalk Command Line Interface (EB CLI)

Para obter detalhes sobre como instalar os três primeiros componentes listados e configurar seu ambiente de desenvolvimento local, consulte Configurar seu ambiente de desenvolvimento Node.js. Para este tutorial, você não precisa instalar o AWS SDK para Node.js, que também é mencionado no tópico referenciado.

Para obter detalhes sobre como instalar e configurar a EB CLI, consulte Instalar a EB CLI e Configurar a EB CLI.

Criar um ambiente do Elastic Beanstalk

Seu diretório de aplicativos

Este tutorial usa um diretório chamado nodejs-example-dynamo para o pacote de origem do aplicativo. Crie o diretório nodejs-example-dynamo para este tutorial.

~$ mkdir nodejs-example-dynamo
nota

Cada tutorial neste capítulo usa seu próprio diretório para o pacote de origem do aplicativo. O nome do diretório corresponde ao nome do aplicativo de amostra usado pelo tutorial.

Altere seu diretório de trabalho atual para nodejs-example-dynamo.

~$ cd nodejs-example-dynamo

Agora, vamos configurar um ambiente do Elastic Beanstalk executando a plataforma Node.js e o aplicativo de amostra. Usaremos a interface de linha de comando do Elastic Beanstalk (EB CLI).

Para configurar um repositório EB CLI para seu aplicativo e criar um ambiente Elastic Beanstalk executando a plataforma Node.js
  1. Crie um repositório com o comando eb init.

    ~/nodejs-example-dynamo$ eb init --platform node.js --region <region>

    Esse comando cria um arquivo de configuração em uma pasta chamada .elasticbeanstalk que especifica as configurações para a criação de ambientes para a aplicação e cria uma aplicação do Elastic Beanstalk com nome baseado na pasta atual.

  2. Crie um ambiente executando um aplicativo de exemplo com o comando eb create.

    ~/nodejs-example-dynamo$ eb create --sample nodejs-example-dynamo

    Esse comando cria um ambiente com balanceamento de carga com as configurações padrão da plataforma do Node.js e os seguintes recursos:

    • Instância do EC2: uma máquina virtual do Amazon Elastic Compute Cloud (Amazon EC2) configurada para executar aplicações Web na plataforma escolhida.

      Cada plataforma executa um conjunto específico de software, arquivos de configuração e scripts para oferecer suporte a uma versão de linguagem, framework, contêiner da web específicos ou a uma combinação deles. A maioria das plataformas usa o Apache ou o NGINX como um proxy reverso que fica na frente da aplicação Web, encaminha solicitações para ela, atende ativos estáticos e gera logs de acesso e de erro.

    • Grupo de segurança de instância: um grupo de segurança do Amazon EC2 configurado para permitir tráfego de entrada na porta 80. Esse recurso permite que o tráfego HTTP do load balancer chegue à instância do EC2 que executa seu aplicativo Web. Por padrão, o tráfego não é permitido em outras portas.

    • Balanceador de carga: um balanceador de carga do Elastic Load Balancing configurado para distribuir solicitações para as instâncias que executam a aplicação. Um load balancer também elimina a necessidade de expor suas instâncias diretamente à Internet.

    • Grupo de segurança do balanceador de carga: um grupo de segurança do Amazon EC2 configurado para permitir tráfego de entrada na porta 80. Esse recurso permite que o tráfego HTTP da Internet acesse o load balancer. Por padrão, o tráfego não é permitido em outras portas.

    • Grupo de Auto Scaling: grupo de Auto Scaling configurado para substituir uma instância se ela for encerrada ou ficar indisponível.

    • Bucket do Amazon S3: um local de armazenamento do seu código-fonte, logs e outros artefatos criados quando o Elastic Beanstalk é utilizado.

    • CloudWatch Alarmes da Amazon — Dois CloudWatch alarmes que monitoram a carga nas instâncias em seu ambiente e que são acionados se a carga for muito alta ou muito baixa. Quando um alarme é acionado, o seu grupo de Auto Scaling pode aumentar ou diminuir.

    • AWS CloudFormation stack — O Elastic AWS CloudFormation Beanstalk usa para lançar os recursos em seu ambiente e propagar as alterações de configuração. Os recursos são definidos em um modelo que você pode visualizar no console do AWS CloudFormation.

    • Nome de domínio: um nome de domínio que encaminha para a aplicação Web no formato subdomínio.região.elasticbeanstalk.com.

      nota

      Para aumentar a segurança de suas aplicações do Elastic Beanstalk, o domínio elasticbeanstalk.com é registrado na Lista Pública de Sufixos (PSL). Para maior segurança, recomendamos que você use cookies com um prefixo __Host- se precisar definir cookies confidenciais no nome de domínio padrão para suas aplicações do Elastic Beanstalk. Essa prática ajudará a defender seu domínio contra tentativas de falsificação de solicitação entre sites (CSRF). Para obter mais informações, consulte a página Set-Cookie na Mozilla Developer Network.

  3. Quando a criação do ambiente for concluída, use o comando eb open para abrir o URL do ambiente no navegador padrão.

    ~/nodejs-example-dynamo$ eb open

Agora você criou um ambiente Node.js Elastic Beanstalk com um aplicativo de amostra. Você pode atualizá-lo com seu próprio aplicativo. Em seguida, atualizamos o aplicativo de exemplo para usar a framework do Express.

Adicionar permissões às instâncias do seu ambiente

Seu aplicativo é executado em uma ou mais instâncias do EC2 por trás de um load balancer, atendendo a solicitações HTTP da Internet. Quando recebe uma solicitação que exige o uso de AWS serviços, o aplicativo usa as permissões da instância em que é executado para acessar esses serviços.

O aplicativo de amostra usa permissões de instância para gravar dados em uma tabela do DynamoDB e enviar notificações para um tópico do Amazon SNS com o SDK em Node.js. JavaScript Adicione as políticas gerenciadas a seguir ao perfil da instância padrão para conceder às instâncias do EC2 no ambiente permissão para acessar o DynamoDB e o Amazon SNS:

  • AmazonDynamoDB FullAccess

  • Amazon SNS FullAccess

Para adicionar políticas ao perfil da instância padrão
  1. Abra a página Roles (Funções) no console do IAM.

  2. Escolha aws-elasticbeanstalk-ec2 funções.

  3. Na guia Permissions (Permissões), escolha Attach policies (Anexar políticas).

  4. Selecione a política gerenciada para os serviços adicionais que o seu aplicativo utiliza. Para este tutorial, selecione AmazonSNSFullAccess e AmazonDynamoDBFullAccess.

  5. Escolha Anexar política.

Consulte Gerenciar perfis de instância do Elastic Beanstalk para saber mais sobre o gerenciamento de perfis de instância.

Implante o aplicativo de exemplo

Agora seu ambiente está pronto para você implantar e executar o aplicativo de exemplo deste tutorial: nodejs-example-dynamo.zip.

Para implantar e executar o aplicativo de exemplo do tutorial
  1. Altere seu diretório de trabalho atual para o diretório do aplicativo nodejs-example-dynamo.

    ~$ cd nodejs-example-dynamo
  2. Baixe e extraia o conteúdo do pacote de origem do aplicativo de exemplo nodejs-example-dynamo.zip para o diretório do aplicativo. nodejs-example-dynamo

  3. Implante o aplicativo de exemplo em seu ambiente Elastic Beanstalk com o comando eb deploy.

    ~/nodejs-example-dynamo$ eb deploy
    nota

    Por padrão, o eb deploy comando cria um arquivo ZIP da pasta do seu projeto. Você pode configurar a EB CLI para implantar um artefato do seu processo de compilação, em vez de criar um arquivo ZIP da pasta do projeto. Para ter mais informações, consulte Implantar um artefato, em vez da pasta do projeto.

  4. Quando a criação do ambiente for concluída, use o comando eb open para abrir o URL do ambiente no navegador padrão.

    ~/nodejs-example-dynamo$ eb open

O site coleta informações de contato do usuário e usa uma tabela do DynamoDB para armazenar os dados. Para adicionar uma entrada, escolha Sign up today, insira um nome e um endereço de e-mail e, em seguida, selecione Sign Up!. A aplicação Web grava o conteúdo do formulário na tabela e aciona uma notificação por e-mail do Amazon SNS.

No momento, o tópico do Amazon SNS está configurado com um espaço reservado para notificações de e-mail. Você atualizará a configuração em breve, mas enquanto isso, pode verificar a tabela do DynamoDB e o tópico do Amazon SNS no Console de Gerenciamento da AWS Management Console.

Para visualizar a tabela
  1. Abra a página Tables (Tabelas) no console do DynamoDB.

  2. Encontre a tabela que o aplicativo criou. O nome começa com awseb e contém. StartupSignupsTable

  3. Selecione a tabela, escolha Items e Start search para visualizar todos os itens na tabela.

A tabela contém uma entrada para cada endereço de e-mail enviado no site de inscrição. Além de gravar na tabela, a aplicação envia uma mensagem para um tópico do Amazon SNS que tem duas assinaturas, uma para notificações por e-mail para você e outra para uma fila do Amazon Simple Queue Service que uma aplicação de operador pode ler para processar solicitações e enviar e-mails para os clientes interessados.

Para visualizar o tópico
  1. Abra a página Topics (Tópicos) no console do Amazon SNS.

  2. Encontre o tópico que o aplicativo criou. O nome começa com awseb e contém. NewSignupTopic

  3. Escolha o tópico para visualizar as assinaturas.

O aplicativo (app.js) define duas rotas. O caminho raiz (/) retorna uma página da Web renderizada a partir de um modelo Embedded JavaScript (EJS) com um formulário que o usuário preenche para registrar seu nome e endereço de e-mail. A submissão do formulário envia uma solicitação POST com os dados do formulário para a rota /signup, que grava uma entrada na tabela do DynamoDB e publica uma mensagem para o tópico do Amazon SNS para notificar o proprietário da inscrição.

A aplicação demonstrativa inclui os arquivos de configuração que criam a tabela do DynamoDB, o tópico do Amazon SNS e a fila do Amazon SQS usados pela aplicação. Isso permite que você crie um novo ambiente e teste a funcionalidade imediatamente, mas tem a desvantagem de vincular a tabela do DynamoDB ao ambiente. Para um ambiente de produção, você deve criar a tabela do DynamoDB fora do seu ambiente para evitar perdê-lo quando encerrar o ambiente ou atualizar sua configuração.

Criar uma tabela do DynamoDB

Para usar uma tabela do DynamoDB externa com uma aplicação em execução no Elastic Beanstalk primeiro crie uma tabela no DynamoDB. Quando uma instância é criada fora do Elastic Beanstalk, ela é completamente independente do Elastic Beanstalk e dos ambientes do Elastic Beanstalk e não será encerrada pelo Elastic Beanstalk.

Crie uma tabela com as seguintes configurações:

  • Table name (Nome da tabela): nodejs-tutorial

  • chave primária: email

  • Tipo de chave primária: string

Como criar uma tabela do DynamoDB
  1. Abra a página Tables (Tabelas) no console de gerenciamento do DynamoDB.

  2. Escolha Create table.

  3. Digite um nome de tabela e chave primária.

  4. Escolha o tipo de chave primária.

  5. Escolha Criar.

Atualizar os arquivos de configuração do aplicativo

Atualize os arquivos de configuração na origem do aplicativo para usar a tabela nodejs-tutorial em vez de criar uma nova.

Para atualizar o aplicativo de exemplo para uso em produção
  1. Altere seu diretório de trabalho atual para o diretório do aplicativo nodejs-example-dynamo.

    ~$ cd nodejs-example-dynamo
  2. Abra .ebextensions/options.config e altere os valores das configurações a seguir:

    • NewSignupEmail— Seu endereço de e-mail.

    • STARTUP_SIGNUP_TABLE: nodejs-tutorial

    exemplo .ebextensions/options.config
    option_settings: aws:elasticbeanstalk:customoption: NewSignupEmail: you@example.com aws:elasticbeanstalk:application:environment: THEME: "flatly" AWS_REGION: '`{"Ref" : "AWS::Region"}`' STARTUP_SIGNUP_TABLE: nodejs-tutorial NEW_SIGNUP_TOPIC: '`{"Ref" : "NewSignupTopic"}`' aws:elasticbeanstalk:container:nodejs: ProxyServer: nginx aws:elasticbeanstalk:container:nodejs:staticfiles: /static: /static aws:autoscaling:asg: Cooldown: "120" aws:autoscaling:trigger: Unit: "Percent" Period: "1" BreachDuration: "2" UpperThreshold: "75" LowerThreshold: "30" MeasureName: "CPUUtilization"

    Isso aplica as seguintes configurações para o aplicativo:

    • O endereço de e-mail que o tópico do Amazon SNS usa para notificações é definido como seu endereço ou aquele que você insere no arquivo options.config.

    • A tabela nodejs-tutorial será usada em vez da criada por .ebextensions/create-dynamodb-table.config.

  3. Remover .ebextensions/create-dynamodb-table.config.

    ~/nodejs-tutorial$ rm .ebextensions/create-dynamodb-table.config

    Na próxima vez que você implantar o aplicativo, a tabela criada por esse arquivo de configuração será excluída.

  4. Implante o aplicativo atualizado em seu ambiente Elastic Beanstalk com o comando eb deploy.

    ~/nodejs-example-dynamo$ eb deploy
  5. Quando a criação do ambiente for concluída, use o comando eb open para abrir o URL do ambiente no navegador padrão.

    ~/nodejs-example-dynamo$ eb open

Quando você implanta, o Elastic Beanstalk atualiza a configuração do tópico do Amazon SNS e exclui a tabela do DynamoDB que ele criou quando a primeira versão da aplicação foi implantada.

Agora, quando você encerrar o ambiente, a tabela nodejs-tutorial não será excluída. Isso permite que você realize implantações azul/verde, modifique os arquivos de configuração ou desative seu site sem o risco de perda de dados.

Abra seu site em um navegador e verifique se o formulário funciona como esperado. Crie alguma entradas e, depois, verifique o console do DynamoDB para verificar a tabela.

Para visualizar a tabela
  1. Abra a página Tables (Tabelas) no console do DynamoDB.

  2. Encontre a tabela nodejs-tutorial.

  3. Selecione a tabela, escolha Items e Start search para visualizar todos os itens na tabela.

Você também pode ver que o Elastic Beanstalk excluiu a tabela que foi criada anteriormente.

Configurar seu ambiente para alta disponibilidade

Por fim, configure o grupo de Auto Scaling do seu ambiente com uma contagem mínima de instâncias mais alta. Execute pelo menos duas instâncias o tempo todo para impedir que os servidores Web em seu ambiente sejam um ponto único de falha e para permitir que você implante alterações sem colocar seu site fora do serviço.

Para configurar o grupo de Auto Scaling de seu ambiente para alta disponibilidade
  1. Abra o console do Elastic Beanstalk e, na lista Regiões, selecione sua. Região da AWS

  2. No painel de navegação, selecione Ambientes e selecione o nome do ambiente na lista.

    nota

    Se você tiver muitos ambientes, use a barra de pesquisa para filtrar a lista de ambientes.

  3. No painel de navegação, escolha Configuration (Configuração).

  4. Na categoria de configuração Capacity (Capacidade), escolha Edit (Editar).

  5. Na seção Auto Scaling group (Grupo de Auto Scaling) defina Min instances (Mínimo de instâncias) como 2.

  6. Para salvar as alterações, escolha Apply (Aplicar) na parte inferior da página.

Limpeza

Ao terminar de trabalhar com o Elastic Beanstalk, você pode encerrar o ambiente. O Elastic Beanstalk AWS encerra todos os recursos associados ao seu ambiente, como instâncias do Amazon EC2, instâncias de banco de dados, balanceadoresde carga, grupos de segurança e alarmes.

Para encerrar seu ambiente do Elastic Beanstalk a partir do console
  1. Abra o console do Elastic Beanstalk e, na lista Regiões, selecione sua. Região da AWS

  2. No painel de navegação, selecione Ambientes e selecione o nome do ambiente na lista.

    nota

    Se você tiver muitos ambientes, use a barra de pesquisa para filtrar a lista de ambientes.

  3. Escolha Actions (Ações) e depois Terminate Environment (Encerrar ambiente).

  4. Use a caixa de diálogo na tela para confirmar o encerramento do ambiente.

Com o Elastic Beanstalk, é possível criar facilmente um ambiente para a aplicação a qualquer momento.

Você também pode excluir as tabelas externas do DynamoDB que você criou.

Como excluir uma tabela do DynamoDB
  1. Abra a página Tables (Tabelas) no console do DynamoDB.

  2. Selecione uma tabela.

  3. Escolha Actions e, em seguida, escolha Delete table.

  4. Escolha Excluir.

Próximas etapas

O aplicativo de exemplo usa arquivos de configuração para definir as configurações do software e criar AWS recursos como parte do seu ambiente. Consulte Personalização avançada de ambiente com arquivos de configuração (.ebextensions) para obter mais informações sobre os arquivos de configuração e seu uso.

O aplicativo de exemplo para este tutorial usa a framework da Web Express para Node.js. Para obter mais informações sobre o Express, consulte a documentação oficial em expressjs.com.

Por fim, se você planeja usar seu aplicativo em um ambiente de produção, configure um nome de domínio personalizado para seu ambiente e habilite o HTTPS para conexões seguras.