Solucionar problemas de implantação no EC2/On-Premises
Tópicos
Erro de credenciais ausentes do plug-in do CodeDeploy CommandPoller
A implantação falha com a mensagem "Validation of PKCS7 signed message failed"
Caminhos de arquivo longos causam erros do tipo “Nenhum arquivo ou diretório”
Processos de execução longa podem fazer com que as implantações falhem
Solução de problemas de erros relacionados a todos os eventos de ciclo de vida ignorados
nota
As causas de muitas falhas de implantação podem ser identificadas por meio da revisão dos arquivos de log criados durante o processo de implantação. Por questões de simplicidade, recomendamos usar o Amazon CloudWatch Logs para monitorar arquivos de log centralmente em vez de visualizá-los a casa instância. Para obter mais informações, consulte Exibir registros do CodeDeploy no console do CloudWatch Logs
dica
Para obter um runbook que automatiza muitas tarefas de solução de problemas relacionadas a implantações EC2/On-Premises, consulte AWSSupport-TroubleshootCodeDeploy na referência do runbook do AWS Systems Manager Automation.
Erro de credenciais ausentes do plug-in do CodeDeploy CommandPoller
Se você receber um erro semelhante a InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please
check if this instance was started with an IAM instance profile, a causa pode ser uma das seguintes:
-
A instância que você está implantando não tem um perfil de instância do IAM associado a ela.
-
Seu perfil de instância do IAM não tem as permissões corretas configuradas.
Um perfil de instância do IAM concede ao agente do CodeDeploy permissão para se comunicar com o CodeDeploy e fazer download da sua revisão do Amazon S3. Para instâncias do EC2, consulte Gerenciamento de identidade e acesso para o AWS CodeDeploy. Para instâncias locais, consulte Working with On-Premises Instances.
A implantação falha com a mensagem "Validation of PKCS7 signed message failed"
Essa mensagem de erro indica que a instância está executando uma versão do agente do CodeDeploy que apenas oferece suporte ao algoritmo de hash SHA-1. O suporte para o algoritmo de hash SHA-2 foi introduzido na versão 1.0.1.854 do agente do CodeDeploy, lançada em novembro de 2015. Desde 17 de outubro de 2016, as implantações falham caso uma versão do agente do CodeDeploy anterior à 1.0.1.854 esteja instalada. Para obter mais informações, consulte AWS para mudar para o algoritmo de hash SHA256 para certificados SSL
A implantação ou reimplantação dos mesmos arquivos nos mesmos locais de instância falha com um erro indicando que a implantação falhou porque um arquivo especificado já existe na localização
Quando o CodeDeploy tenta implantar um arquivo em uma instância, mas um arquivo com o mesmo nome já existe na localização de destino especificada, a implantação nessa instância pode falhar. Você poderá receber a mensagem de erro indicando que a implantação falhou porque um arquivo especificado já existe na localização location-name. Isso ocorre porque, durante cada implantação, o CodeDeploy primeiro exclui todos os arquivos da implantação anterior, que estão listados em um arquivo de log de limpeza. Se houver arquivos nas pastas de instalação de destino que não estão listados nesse arquivo de limpeza, o agente do CodeDeploy, por padrão, interpretará isso como um erro e reprovará a implantação.
nota
Nas instâncias do Amazon Linux, RHEL e Ubuntu Server, o arquivo de limpeza está localizado em /opt/codedeploy-agent/deployment-root/deployment-instructions/. Em instâncias do Windows Server, o local é C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\.
A maneira mais fácil de evitar esse erro é especificar uma opção diferente do comportamento padrão de reprovar a implantação. Para cada implantação, você pode optar por reprovar a implantação, substituir os arquivos não listados no arquivo de limpeza ou manter os arquivos que já estão na instância.
A opção de substituição é útil quando, por exemplo, você colocou manualmente um arquivo em uma instância após a última implantação, mas adicionou um arquivo com o mesmo nome à próxima revisão de aplicativo.
É possível escolher a opção de retenção para os arquivos colocados na instância que você deseja que façam parte da próxima implantação sem precisar adicioná-los ao pacote de revisão de aplicativo. A opção de retenção também é útil quando seus arquivos de aplicativo já estão em seu ambiente de produção, e você deseja implantar usando o CodeDeploy pela primeira vez. Para obter mais informações, consulte Componentes de implantação em uma plataforma de computação EC2/On-Premises (console) e Comportamento de reversão com conteúdo existente.
Solução de problemas de erros de implantação The deployment failed because a specified file already exists at
this location
Se você optar por não especificar uma opção para substituir ou reter o conteúdo detectado pelo CodeDeploy nos seus locais de implantação de destino (ou se não especificar nenhuma opção de implantação para lidar com conteúdo existente em um comando programático), será possível optar por solucionar o erro.
As informações a seguir aplicam-se somente quando você opta por não reter ou substituir o conteúdo.
Se você tentar redistribuir arquivos com os mesmos nomes e localizações, a reimplantação terá melhores chances de sucesso se você especificar o nome do aplicativo e o grupo de implantação com o mesmo ID de grupo de implantação subjacente usado antes. O CodeDeploy usa o ID de grupo de implantação subjacente para identificar arquivos a serem removidos antes de uma reimplantação.
A implantação de novos arquivos ou a reimplantação dos mesmos arquivos nas mesmas localizações em instâncias pode falhar por estes motivos:
-
Você especificou um nome de aplicativo diferente para uma redistribuição da mesma revisão nas mesmas instâncias. A redistribuição falha porque, mesmo que o nome do grupo de implantação seja o mesmo, o uso de um nome de aplicativo diferente significa que um ID de grupo de implantação subjacente diferente está sendo usado.
-
Você excluiu e recriou um grupo de implantação para um aplicativo e depois tentou reimplantar a mesma revisão no grupo de implantação. A reimplantação falha porque, mesmo que o nome do grupo de implantação seja o mesmo, o CodeDeploy faz referência a um ID de grupo de implantação subjacente diferente.
-
Você excluiu um aplicativo e um grupo de implantação no CodeDeploy e, depois, criou um aplicativo e um grupo de implantação novos com os mesmos nomes daqueles que foram excluídos. Depois disso, você tentou reimplantar uma revisão que havia sido implantada no grupo de implantação anterior no novo grupo de implantação com o mesmo nome. A redistribuição falha porque, mesmo que os nomes de aplicativo e grupo de implantação sejam os mesmos, o CodeDeploy ainda faz referência ao ID do grupo de implantação que você excluiu.
-
Você implantou uma revisão em um grupo de implantação e, em seguida, implantou a mesma revisão em outro grupo de implantação para as mesmas instâncias. A segunda implantação falha porque o CodeDeploy faz referência a um ID de grupo de implantação subjacente diferente.
-
Você implantou uma revisão em um grupo de implantação e, em seguida, implantou outra revisão em outro grupo de implantação para as mesmas instâncias. Existe pelo menos um arquivo com o mesmo nome e no mesmo local em que o segundo grupo de implantação está tentando implantar. A segunda implantação falha porque o CodeDeploy não remove o arquivo existente antes do início da segunda implantação. Ambas as implantações fazem referência a diferentes IDs de grupo de implantação.
-
Você implantou uma revisão no CodeDeploy, mas há pelo menos um arquivo com o mesmo nome e no mesmo local. A implantação falha porque, por padrão, o CodeDeploy não remove o arquivo existente antes do início da implantação.
Para resolver essas situações, siga um destes procedimentos:
-
Remova os arquivos das localizações e instâncias em que eles foram implantados anteriormente e, em seguida, tente de novo a implantação.
-
No arquivo AppSpec da sua revisão, nos eventos de ciclo de vida de implantação ApplicationStop ou BeforeInstall, especifique um script personalizado para excluir arquivos em qualquer localização que corresponda aos arquivos que sua revisão está prestes a instalar.
-
Implante ou reimplante os arquivos em localizações ou instâncias que não faziam parte de implementações anteriores.
-
Antes de excluir um aplicativo ou um grupo de implantação, implemente uma revisão contendo um arquivo AppSpec que não especifique arquivos para copiar nas instâncias. Para a implantação, especifique o nome do aplicativo e o nome do grupo de implantação que usam os mesmos IDs de aplicativo e grupo de implantação subjacentes que aqueles que você está prestes a excluir. (É possível usar o comando get-deployment-group para recuperar o ID do grupo de implantação.) O CodeDeploy usa o ID do grupo de implantação subjacente e o arquivo do AppSpec para remover todos os arquivos instalados na implantação bem-sucedida anterior.
Caminhos de arquivo longos causam erros do tipo “Nenhum arquivo ou diretório”
Para implantações em instâncias do Windows, se você tiver um caminho de arquivo com mais de 260 caracteres na seção de arquivos do seu arquivo appspec.yml, talvez as implantações falhem com um erro semelhante ao seguinte:
No such file or directory @ dir_s_mkdir -
C:\your-long-file-path
Esse erro ocorre porque, por padrão, o Windows não permite caminhos de arquivo maiores que 260 caracteres, conforme detalhado na documentação da Microsoft
Para as versões 1.4.0 ou posteriores do agente do CodeDeploy, você pode ativar caminhos de arquivo longos de duas maneiras, dependendo do processo de instalação do agente:
Se o agente do CodeDeploy ainda não tiver sido instalado:
-
Na máquina em que você planeja instalar o agente do CodeDeploy, habilite a chave de registro
LongPathsEnableddo Windows usando este comando:New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force -
Instalar o agente do CodeDeploy Para obter mais informações, consulte Instalar o agente do CodeDeploy.
Se o agente do CodeDeploy já tiver sido instalado:
-
Na máquina do agente do CodeDeploy, habilite a chave de registro
LongPathsEnableddo Windows usando este comando:New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force -
Reinicie o agente do CodeDeploy para que a alteração da chave do registro entre em vigor. Para reiniciar o agente, use o seguinte comando:
powershell.exe -Command Restart-Service -Name codedeployagent
Processos de execução longa podem fazer com que as implantações falhem
Para implantações em instâncias Amazon Linux, Ubuntu Server e RHEL, se você tiver um script de implantação que inicia um processo de longa execução, o CodeDeploy poderá demorar muito tempo em espera no evento de ciclo de vida de implantação e reprovar a implantação. Isso ocorre porque, se o processo demorar mais que o tempo esperado para os processos de primeiro e segundo plano nesse evento, o CodeDeploy interromperá e reprovará a implantação, mesmo que o processo ainda esteja sendo executado conforme o esperado.
Por exemplo, uma revisão de aplicativo contém dois arquivos em sua raiz, after-install.sh e sleep.sh. Seu arquivo AppSpec contém as seguintes instruções:
version: 0.0 os: linux files: - source: ./sleep.sh destination: /tmp hooks: AfterInstall: - location: after-install.sh timeout: 60
O arquivo after-install.sh é executado durante o evento de ciclo de vida de aplicativo AfterInstall. Seu conteúdo é o seguinte:
#!/bin/bash /tmp/sleep.sh
O arquivo sleep.sh contém o seguinte, que suspende a execução do programa por três minutos (180 segundos), simulando alguns processos de execução longa:
#!/bin/bash sleep 180
Quando after-install.sh chamar sleep.sh, sleep.sh será iniciado e executado por três minutos (180 segundos), o que corresponde a dois minutos (120 segundos) além do tempo estimado pelo CodeDeploy sleep.sh para a interrupção da execução (e, por conseguinte, after-install.sh). Após o tempo limite de um minuto (60 segundos), o CodeDeploy interromperá e reprovará a implantação no evento de ciclo de vida de aplicativo AfterInstall, mesmo que sleep.sh continue a ser executado conforme o esperado. O seguinte erro é exibido:
Script at specified location: after-install.sh failed to complete in 60
seconds.
Você não pode simplesmente adicionar um E comercial (&) em after-install.sh para executar sleep.sh em segundo plano.
#!/bin/bash # Do not do this. /tmp/sleep.sh &
Ao fazer isso, é possível que a implantação fique em um estado pendente até o período de tempo limite do evento de ciclo de vida de implementação padrão de uma hora, após o qual o CodeDeploy interromperá e reprovará a implantação no evento de ciclo de vida de aplicativo AfterInstall, como antes.
Em after-install.sh, chame sleep.sh da seguinte maneira, o que permite que o CodeDeploy continue depois que o processo começar a ser executado:
#!/bin/bash /tmp/sleep.sh > /dev/null 2> /dev/null < /dev/null &
Na chamada anterior, sleep.sh é o nome do processo que você deseja começar a executar em segundo plano, redirecionando stdout, stderr e stdin para /dev/null.
Solucionando problemas com um evento de ciclo de vida AllowTraffic com falha em erro relatado nos logs de implantação
Em alguns casos, uma implantação azul/verde falha durante o evento de ciclo de vida AllowTraffic, mas os logs de implantação não indicam a causa da falha.
Essa falha geralmente é devido a verificações de integridade que são configuradas incorretamente no Elastic Load Balancing para o Classic Load Balancer, Application Load Balancer ou Network Load Balancer usado para gerenciar o tráfego do grupo de implantação.
Para resolver o problema, revise e corrija quaisquer erros na configuração de verificação de integridade do load balancer.
Para Classic Load Balancers, consulte Configurar verificações de integridade no Guia do usuário para Classic Load Balancers e ConfigureHealthCheck na Referência da API do Elastic Load Balancing versão 2012-06-01.
Para Application Load Balancer, consulte Verificações de integridade de grupos de destino no Manual do usuário de Application Load Balancers.
Para Network Load Balancer, consulte Verificações de integridade de grupos de destino no Manual do usuário de Network Load Balancers.
Solução de problemas com eventos de ciclo de vida de implantação ApplicationStop, BeforeBlockTraffic e AfterBlockTraffic
Durante uma implantação, o agente do CodeDeploy executa os scripts especificados para ApplicationStop, BeforeBlockTraffic e AfterBlockTraffic no arquivo AppSpec a partir da implantação anterior bem-sucedida. (Todos os outros scripts são executados a partir do arquivo AppSpec na implantação atual.) Se um desses scripts contiver um erro e não for executado com sucesso, a implantação poderá falhar.
Os possíveis motivos dessas falhas incluem:
-
O agente do CodeDeploy encontra o arquivo
no local correto, mas o local listado no arquivodeployment-group-id_last_successful_installnão existe.deployment-group-id_last_successful_installEm instâncias do Amazon Linux, do Ubuntu Server e do RHEL, o arquivo deve existir em
/opt/codedeploy-agent/deployment-root/deployment-instructions.Em instâncias do Windows Server, esse arquivo deve ser armazenado na pasta
C:\ProgramData\Amazon\CodeDeploy\deployment-instructions. -
Na localização listada no arquivo
, o arquivo AppSpec é inválido ou os scripts não foram executados com sucesso.deployment-group-id_last_successful_install -
O script contém um erro que não pode ser corrigido e, portanto, nunca é executado com êxito.
Use o console do CodeDeploy para investigar por que uma implantação pode ter falhado durante qualquer um desses eventos. Na página de detalhes da implantação, escolha View events (Exibir eventos). Na página de detalhes para a instância, na linha ApplicationStop, BeforeBlockTraffic ou AfterBlockTraffic, escolha View logs (Exibir logs). Ou use o AWS CLI para chamar o comando get-deployment-instance.
Se a causa da falha for um script da última implantação bem-sucedida que nunca é executado com êxito, crie uma implantação e especifique que as falhas ApplicationStop, BeforeBlockTraffic e AfterBlockTraffic devem ser ignoradas. Há duas maneiras de fazer isso:
-
Use o console do CodeDeploy para criar uma implantação. Na página Create deployment (Criar implantação), em ApplicationStop lifecycle event failure (Falha de evento do ciclo de vida do ApplicationStop), escolha Don't fail the deployment to an instance if this lifecycle event on the instance fails (Não falhar a implantação para uma instância se esse evento de ciclo de vida na instância falhar).
-
Use a AWS CLI para chamar o comando create-deployment e incluir a opção
--ignore-application-stop-failures.
Quando você implantar a revisão de aplicativo novamente, a implantação continuará mesmo se algum desses três eventos de ciclo de vida falhar. Se a nova revisão incluir scripts fixos para esses eventos de ciclo de vida, as implementações futuras poderão ser bem-sucedidas sem a aplicação dessa correção.
Solucionar problemas com um evento de ciclo de vida de implantação DownloadBundle com falha que indica "UnknownError: not opened for reading"
Se você estiver tentando implantar uma revisão de aplicativo a partir do Amazon S3 e essa implantação falhar durante o evento de ciclo de vida de implantação DownloadBundle com o erro UnknownError: not opened
for reading:
-
Houve um erro interno do serviço do Amazon S3. Implante novamente a revisão de aplicativo.
-
O perfil de instância do IAM na sua instância do EC2 não tem permissões para acessar a revisão de aplicativo no Amazon S3. Para obter informações sobre políticas de bucket do Amazon S3, consulte Enviar uma revisão para CodeDeploy ao Amazon S3 (somente implantações do EC2/On-Premises) e Pré-requisitos de implantação.
-
As instâncias nas quais você faz a implantação estão associadas a uma região da AWS (por exemplo, Oeste dos EUA (Oregon)), mas o bucket do Amazon S3 que contém a revisão de aplicativo está associado a outra região da AWS (por exemplo, Leste dos EUA (Norte da Virgínia)). Verifique se a revisão de aplicativo está em um bucket do Amazon S3 associado à mesma região AWS que as instâncias.
Na página de detalhes do evento da implantação, na linha Download bundle (Fazer download do pacote), escolha View logs (Exibir logs). Ou use o AWS CLI para chamar o comando get-deployment-instance. Se esse erro tiver ocorrido, deverá haver um erro na saída com o código UnknownError e a mensagem not opened for reading.
Para determinar o motivo desse erro:
-
Habilite o registro em log em pelo menos uma das instâncias e depois implante novamente a revisão de aplicativo.
-
Examine o arquivo de log para encontrar o erro. Mensagens de erro comuns para esse problema incluem a frase "acesso negado".
-
Depois de examinar os arquivos de log, recomendamos que você desabilite o registro em log para reduzir o tamanho do arquivo de log e a quantidade de informações confidenciais que poderão aparecer na saída em texto sem formatação na instância no futuro.
Para obter informações sobre como encontrar o arquivo de log e habilitar e desabilitar o registro em log, consulte :log_aws_wire: em Referência de configuração do agente do CodeDeploy.
Solução de problemas de erros relacionados a todos os eventos de ciclo de vida ignorados
Se todos os eventos de ciclo de vida de uma implantação do EC2 ou on-premises forem ignorados, você poderá receber um erro semelhante a The overall deployment failed because too many
individual instances failed deployment, too few healthy instances are available for
deployment, or some instances in your deployment group are experiencing problems. (Error
code: HEALTH_CONSTRAINTS). Aqui estão algumas causas e soluções possíveis:
-
O agente do CodeDeploy pode não estar instalado ou em execução na instância. Para determinar se o agente do CodeDeploy está em execução:
-
Para um servidor Amazon Linux RHEL ou Ubuntu, execute o seguinte:
systemctl status codedeploy-agent -
Para o Windows, execute o seguinte:
powershell.exe -Command Get-Service -Name CodeDeployagent
Se o agente do CodeDeploy não estiver instalado ou em execução, consulte Verificar se o agente do CodeDeploy está em execução.
Sua instância pode não ser capaz de alcançar o endpoint público do CodeDeploy ou do Amazon S3 usando a porta 443. Faça uma das coisas a seguir:
-
Atribua um endereço IP público à instância e use a respectiva tabela de rotas para permitir o acesso à Internet. Verifique se o grupo de segurança associado à instância permite o acesso de saída pela porta 443 (HTTPS). Para obter mais informações, consulte Protocolo de comunicação e porta do agente do CodeDeploy.
-
Se uma instância for provisionada em uma sub-rede privada, use um gateway NAT em vez de um gateway da Internet na tabela de rotas. Para obter mais informações, consulte Gateways NAT.
-
-
A perfil de serviço do CodeDeploy pode não ter as permissões necessárias. Para configurar uma perfil de serviço do CodeDeploy, consulte Etapa 2: Criar um perfil de serviço para CodeDeploy.
-
Se você usa um proxy HTTP, verifique se ele está especificado na configuração
:proxy_uri:no arquivo de configuração do agente do CodeDeploy. Para obter mais informações, consulte Referência de configuração do agente do CodeDeploy. -
A assinatura de data e hora da sua instância de implantação pode não corresponder à assinatura de data e hora da sua solicitação de implantação. Procure um erro semelhante a
Cannot reach InstanceService: Aws::CodeDeployCommand::Errors::InvalidSignatureException - Signature expiredno arquivo de log do agente do CodeDeploy. Se você vir esse erro, siga as etapas em Solucionando erros de implantação que indicam "InvalidSignatureException – Signature expired: [time] is now earlier than [time]". Para obter mais informações, consulte Exibir dados de log para implantações do CodeDeploy EC2/On-Premises. -
O agente do CodeDeploy pode interromper a execução devido ao fato de uma instância ter pouca memória ou espaço em disco insuficiente. Tente reduzir o número de implantações arquivadas em sua instância atualizando a configuração
max_revisionsna configuração do agente do CodeDeploy. Se você fizer isso para uma instância do EC2 e o problema persistir, considere o uso de uma instância maior. Por exemplo, se o tipo de instância fort2.small, tente usart2.medium. Para obter mais informações, consulte Arquivos instalados pelo agente do CodeDeploy , Referência de configuração do agente do CodeDeploy e Tipos de instância. -
A instância na qual você está fazendo a implantação pode não ter um perfil de instância do IAM anexado, ou pode ter um perfil de instância do IAM anexado que não tenha as permissões necessárias.
-
Se não houver um perfil de instância do IAM anexado à sua instância, crie um com as permissões necessárias e anexe-o.
-
Se já houver um perfil de instância do IAM anexado à sua instância, verifique se ele tem as permissões necessárias.
Depois de confirmar que o perfil de instância anexado está configurado com as permissões necessárias, reinicie a instância. Para obter mais informações, consulte Etapa 4: criar um perfil de instância do IAM para as suas instâncias do Amazon EC2 e Perfis do IAM para o Amazon EC2 no Guia do usuário do Amazon EC2.
-
Os scripts do Windows PowerShell não conseguem usar a versão de 64 bits do Windows PowerShell por padrão
Se um script do Windows PowerShell executado como parte de uma implantação depender da funcionalidade de 64 bits (por exemplo, porque consome mais memória do que um aplicativo de 32 bits permite ou chama bibliotecas que são oferecidas somente em uma versão de 64 bits), o script poderá falhar ou não ser executado conforme o esperado. Isso ocorre porque, por padrão, o CodeDeploy usa a versão de 32 bits do Windows PowerShell para executar scripts do Windows PowerShell que fazem parte de uma revisão de aplicativo.
Adicione um código como o seguinte ao início de qualquer script que deve ser executado com a versão de 64 bits do Windows PowerShell:
# Are you running in 32-bit mode? # (\SysWOW64\ = 32-bit mode) if ($PSHOME -like "*SysWOW64*") { Write-Warning "Restarting this script under 64-bit Windows PowerShell." # Restart this script under 64-bit Windows PowerShell. # (\SysNative\ redirects to \System32\ for 64-bit mode) & (Join-Path ($PSHOME -replace "SysWOW64", "SysNative") powershell.exe) -File ` (Join-Path $PSScriptRoot $MyInvocation.MyCommand) @args # Exit 32-bit script. Exit $LastExitCode } # Was restart successful? Write-Warning "Hello from $PSHOME" Write-Warning " (\SysWOW64\ = 32-bit mode, \System32\ = 64-bit mode)" Write-Warning "Original arguments (if any): $args" # Your 64-bit script code follows here... # ...
Embora as informações de caminho de arquivo nesse código possam não parecer intuitivas, o Windows PowerShell de 32 bits usa um caminho como:
c:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
O Windows PowerShell de 64 bits usa um caminho como:
c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe