Tutorial: atualizar dependências de aplicações, corrigir um nó gerenciado e executar uma verificação de integridade específica da aplicação - AWS Systems Manager

Tutorial: atualizar dependências de aplicações, corrigir um nó gerenciado e executar uma verificação de integridade específica da aplicação

Em muitos casos, um nó gerenciado deve ser reinicializado depois de ter sido corrigido com a atualização de software mais recente. No entanto, a reinicialização de um nó gerenciado em produção sem proteções implementadas pode causar vários problemas, como invocação de alarmes, registro incorreto de dados de métrica e interrupção de sincronizações de dados.

Esse tutorial demonstra como evitar problemas como esses usando o documento do AWS Systems Manager (documento do SSM) AWS-RunPatchBaselineWithHooks para obter uma operação de aplicação de patches complexa e de várias etapas que realize o seguinte:

  1. Impedir novas conexões com a aplicação

  2. Instale as atualizações para o sistema operacional.

  3. Atualizar as dependências do pacote da aplicação

  4. Reinicie o daemon ().

  5. Executar uma verificação de integridade específica da aplicação

Para este exemplo, configuramos nossa infraestrutura desta forma:

  • As máquinas virtuais de destino são registradas como nós gerenciados com o Systems Manager.

  • Iptables é usado como um firewall local.

  • A aplicação hospedada em seus nós gerenciados está sendo executada na porta 443.

  • A aplicação hospedada em seus nós gerenciados é uma aplicação nodeJS.

  • A aplicação hospedada em seus nós gerenciados pelo gerenciador de processos pm2.

  • A aplicação já possui um endpoint de verificação de integridade especificado.

  • O endpoint da verificação de integridade da aplicação não requer autenticação do usuário final. O endpoint permite uma verificação de integridade que atenda aos requisitos da organização para estabelecer a disponibilidade. (Em seus ambientes, pode ser suficiente simplesmente verificar se a aplicação nodeJS está em execução e é capaz de receber solicitações. Em outros casos, também é possível verificar se uma conexão com a camada de armazenamento em cache ou com a camada de banco de dados já foi estabelecida.)

Os exemplos deste tutorial são apenas para fins de demonstração e não devem ser implementados inalterados em ambientes de produção. Além disso, tenha em mente que o recurso de ganchos de ciclo de vida doPatch Manager, um recurso do Systems Manager, com o documento AWS-RunPatchBaselineWithHooks, pode suportar vários outros cenários. Aqui estão alguns exemplos:

  • Interrompa um agente de relatório de métricas antes de aplicar patches e reiniciá-lo após a reinicialização do nó gerenciado.

  • Desconecte o nó gerenciado de um cluster CRM ou PCS antes de aplicar patches e reconecte após a reinicialização do nó.

  • Atualize software de terceiros (por exemplo, aplicações Java, Tomcat, Adobe e outras) em máquinas do Windows Server depois que as atualizações do sistema operacional (SO) forem aplicadas, mas antes da reinicialização do nó gerenciado.

Para atualizar dependências de aplicações, corrigir um nó gerenciado e executar uma verificação de integridade específica da aplicação
  1. Crie um documento do SSM para o script de pré-instalação com o conteúdo a seguir e nomeie-o como NodeJSAppPrePatch. Substituir your_application pelo nome da sua aplicação.

    Este script bloqueia imediatamente novas solicitações de entrada e fornece cinco segundos para que as já ativas sejam concluídas antes de iniciar a operação de patch. Para a opção sleep, especifique um número de segundos maior do que normalmente leva para que as solicitações recebidas sejam concluídas.

    # exit on error set -e # set up rule to block incoming traffic iptables -I INPUT -j DROP -p tcp --syn --destination-port 443 || exit 1 # wait for current connections to end. Set timeout appropriate to your application's latency sleep 5 # Stop your application pm2 stop your_application

    Para obter informações sobre como criar um documento do SSM, consulte Criar conteúdo de documento do SSM.

  2. Crie outro documento SSM com o conteúdo a seguir para o script após a instalação, para atualizar as dependências da aplicação e dê a ele o nome NodeJSAppPostPatch. Substituir /your/application/path pelo caminho para a sua aplicação.

    cd /your/application/path npm update # you can use npm-check-updates if you want to upgrade major versions
  3. Crie outro documento SSM com o seguinte conteúdo para o scipt do onExit para fazer backup da aplicação e executar uma verificação de integridade. Nomeie este documento do SSMNodeJSAppOnExitPatch. Substituir your_application pelo nome da sua aplicação.

    # exit on error set -e # restart nodeJs application pm2 start your_application # sleep while your application starts and to allow for a crash sleep 10 # check with pm2 to see if your application is running pm2 pid your_application # re-enable incoming connections iptables -D INPUT -j DROP -p tcp --syn --destination-port # perform health check /usr/bin/curl -m 10 -vk -A "" http://localhost:443/health-check || exit 1
  4. Criar uma associação no State Manager, um recurso do AWS Systems Manager para emitir a operação executando as seguintes etapas:

    1. Abra o console AWS Systems Manager em https://console.aws.amazon.com/systems-manager/.

    2. No painel de navegação, escolha State Manager e selecione Create association.

    3. Para Name (Nome), forneça um nome para ajudar a identificar a finalidade da associação.

    4. Na lista Document (Documento), escolha AWS-RunPatchBaselineWithHooks.

    5. Em Action (Ação), selecione Install (Instalar).

    6. (Opcional) Em Snapshot Id (ID do snapshot), forneça um GUID que você gera para ajudar a acelerar a operação e garantir a consistência. O valor GUID pode ser tão simples quanto00000000-0000-0000-0000-111122223333.

    7. Para Pre Install Hook Doc Name (Nome do Doc do Hook antes da instalação), insira NodeJSAppPrePatch.

    8. Para Post Install Hook Doc Name (Nome do Doc do Hook após instalação), insira NodeJSAppPostPatch.

    9. Para On ExitHook Doc Name (No nome do documento ExitHook), insira NodeJSAppOnExitPatch.

  5. Para Targets (Destinos), identifique os nós gerenciados especificando etiquetas, escolhendo os nós manualmente, escolhendo um grupo de recursos ou escolhendo todos os nós gerenciados.

  6. Para Specify schedule (Especificar programação), especifique a frequência com que a associação deve ser executada. Por exemplo, a aplicação de patches em nós gerenciados uma vez por semana é uma cadência comum.

  7. Na seção Rate control (Controle de taxa), escolha opções para controlar como a associação é executada em vários nós gerenciados. Verifique se apenas uma parte dos nós gerenciados é atualizada de cada vez. Caso contrário, toda ou a maior parte da sua frota poderá ficar offline de uma só vez. Para obter mais informações sobre como usar controles de taxa, consulte Sobre destinos e controles de taxa em associações do State Manager.

  8. (Opcional) Em Opções de saída, para salvar a saída de comando em um arquivo, selecione a caixa Habilitar a gravação da saída no S3. Digite os nomes de bucket e prefixo (pastas) nas caixas de texto.

    nota

    As permissões do S3 que concedem a possibilidade de gravar os dados em um bucket do S3 são as do perfil da instância atribuído ao nó gerenciado, e não as do usuário do IAM que realiza essa tarefa. Para obter mais informações, consulte Configurar permissões de instância obrigatórias para o Systems Manager ou Criar um perfil de serviço do IAM para um ambiente híbrido. Além disso, se o bucket do S3 especificado estiver em uma conta da Conta da AWS diferente, verifique se o perfil da instância ou a função de serviço IAM associada ao nó gerenciado tenha as permissões necessárias para gravar nesse bucket.

  9. Escolha Create Association (Criar associação).