Solucionar problemas de implementación EC2 o en las instalaciones - AWS CodeDeploy

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Solucionar problemas de implementación EC2 o en las instalaciones

nota

Las causas de muchos errores de implementación pueden identificarse revisando los archivos log creados durante el proceso de implementación. Para simplificar, recomendamos utilizar Amazon CloudWatch Logs para supervisar de forma centralizada los archivos de registro en lugar de verlos instancia por instancia. Para obtener más información, consulte Ver CodeDeploy registros en la consola de CloudWatch registros.

sugerencia

Para obtener un manual que automatice muchas tareas de solución de problemas relacionadas con las implementaciones de EC2 /On-Premises, consulte - en la referencia AWSSupportdel manual de automatización de TroubleshootCodeDeploy AWS Systems Manager.

CodeDeploy error CommandPoller de falta de credenciales en el complemento

Si aparece un error similar a InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Missing credentials - please check if this instance was started with an IAM instance profile, podría deberse a una de las siguientes causas:

  • La instancia en la que vas a realizar la implementación no tiene un perfil de IAM instancia asociado.

  • El perfil de tu IAM instancia no tiene configurados los permisos correctos.

Un perfil de IAM instancia otorga al CodeDeploy agente permiso para comunicarse con su revisión CodeDeploy y descargarla de Amazon S3. Para ver EC2 ejemplos, consulteAdministración de identidades y accesos para AWS CodeDeploy. En el caso de las instancias locales, consulte Working with On-Premises Instances.

La implementación falla y aparece el mensaje «Falló la validación del mensaje PKCS7 firmado»

Este mensaje de error indica que la instancia está ejecutando una versión del CodeDeploy agente que solo admite el algoritmo de hash SHA -1. El soporte para el algoritmo hash SHA -2 se introdujo en la versión 1.0.1.854 del CodeDeploy agente, publicada en noviembre de 2015. A partir del 17 de octubre de 2016, las implementaciones fallan si se instala una versión del CodeDeploy agente anterior a la 1.0.1.854. Para obtener más información, consulte Cómo cambiar AWS al algoritmo SHA256 hash para SSL los certificados, NOTICERetirar los agentes CodeDeploy host anteriores a la versión 1.0.1.85 y. Actualice el CodeDeploy agente

La implementación o la reimplementación de los mismos archivos en la misma instancia producen el error "The deployment failed because a specified file already exists at this location"

Cuando se CodeDeploy intenta implementar un archivo en una instancia, pero ya existe un archivo con el mismo nombre en la ubicación de destino especificada, es posible que se produzca un error en la implementación en esa instancia. Es posible que reciba el mensaje de error «Se ha producido un error en la implementación porque ya existe un archivo específico en esta ubicación: location-name». Esto se debe a que, durante cada implementación, CodeDeploy primero elimina todos los archivos de la implementación anterior, que aparecen en un archivo de registro de limpieza. Si hay archivos en las carpetas de instalación de destino que no aparecen en este archivo de limpieza, el CodeDeploy agente lo interpreta de forma predeterminada como un error y no se realiza la implementación.

nota

En las instancias de Amazon Linux y Ubuntu Server, el archivo de limpieza se encuentra en/opt/codedeploy-agent/deployment-root/deployment-instructions/. RHEL En las instancias de Windows Server, la ubicación es C:\ProgramData\Amazon\CodeDeploy\deployment-instructions\.

La forma más sencilla de evitar este error es especificar una opción distinta del comportamiento de error predeterminado de la implementación. Para cada implementación, puede elegir si la implementación produce un error, si se sobrescriben los archivos no incluidos en el archivo de limpieza o si se conservan los archivos que ya están en la instancia.

La opción de sobrescritura resulta útil cuando, por ejemplo, coloca manualmente un archivo en una instancia después de la última implementación, pero después añade un archivo con el mismo nombre a la siguiente revisión de la aplicación.

Puede elegir la opción de conservación para los archivos que coloca en la instancia que desea que formen parte de la siguiente implementación sin tener que añadirlos al paquete de revisión de la aplicación. La opción de conservación también resulta útil si los archivos de la aplicación ya se encuentran en el entorno de producción y desea implementarlos CodeDeploy por primera vez. Para obtener más información, consulte Cree una implementación de EC2 /On-Premises Compute Platform (consola) y Comportamiento de la restauración con contenido existente.

Solución de errores de implementación The deployment failed because a specified file already exists at this location

Si decide no especificar una opción para sobrescribir o conservar el contenido que se CodeDeploy detecte en las ubicaciones de despliegue de destino (o si no especifica ninguna opción de despliegue para gestionar el contenido existente en un comando programático), puede optar por solucionar el error.

Esta información se aplica únicamente si decide no conservar ni sobrescribir el contenido.

Si intenta volver a implementar archivos con los mismos nombres y ubicaciones, es más probable que la redespliegue se realice correctamente si especifica el nombre de la aplicación y el grupo de despliegue con el mismo ID de grupo de despliegue subyacente que utilizó anteriormente. CodeDeploy utiliza el ID del grupo de despliegue subyacente para identificar los archivos que se van a eliminar antes de una redistribución.

La implementación de nuevos archivos o la reimplementación de los mismos archivos en las mismas ubicaciones de las instancias pueden producir un error por estas razones:

  • Ha especificado un nombre de aplicación distinto para la reimplementación de la misma revisión en las mismas instancias. La nueva implementación produce un error porque aunque el nombre del grupo de implementaciones sea el mismo, el uso de un nombre de aplicación diferente significa que se está usando un ID de grupo de implementaciones subyacente distinto.

  • Ha eliminado y ha vuelto a crear un grupo de implementaciones para una aplicación y, a continuación, ha intentado volver a implementar la misma revisión en el grupo de implementaciones. La redespliegue falla porque, aunque el nombre del grupo de despliegue sea el mismo, CodeDeploy hace referencia a un ID de grupo de despliegue subyacente diferente.

  • Eliminó un grupo de aplicaciones y despliegues y CodeDeploy, a continuación, creó un nuevo grupo de aplicaciones y despliegues con los mismos nombres que los que eliminó. A continuación, ha intentado implementar de nuevo una revisión que se había implementado en el grupo de implementaciones anterior en el nuevo grupo con el mismo nombre. Se produce un error en la redespliegue porque, aunque los nombres de la aplicación y del grupo de despliegues son los mismos, CodeDeploy siguen haciendo referencia al ID del grupo de despliegue que ha eliminado.

  • Ha implementado una revisión en un grupo de implementaciones y después ha implementado la misma revisión en otro grupo de implementaciones en las mismas instancias. La segunda implementación falla porque CodeDeploy hace referencia a un ID de grupo de implementación subyacente diferente.

  • Ha implementado una revisión en un grupo de implementaciones y después ha implementado otra revisión en otro grupo de implementaciones en las mismas instancias. Hay al menos un archivo con el mismo nombre y en la misma ubicación en la que el segundo grupo de implementaciones intenta realizar la implementación. La segunda implementación falla porque CodeDeploy no elimina el archivo existente antes de que comience la segunda implementación. Ambas implementaciones >hacen referencia a un grupo de implementaciones diferente. IDs

  • Ha implementado una revisión en CodeDeploy, pero hay al menos un archivo con el mismo nombre y en la misma ubicación. La implementación falla porque, de forma predeterminada, CodeDeploy no elimina el archivo existente antes de que comience la implementación.

Para solucionar estas situaciones, proceda del modo siguiente:

  • Elimine los archivos de las ubicaciones e instancias en las que aplicaron anteriormente implementaciones e intente realizar de nuevo la implementación.

  • En el AppSpec archivo de la revisión, ya sea en los eventos del ciclo de vida ApplicationStop o del BeforeInstall despliegue, especifique un script personalizado para eliminar los archivos en cualquier ubicación que coincida con los archivos que la revisión va a instalar.

  • Implemente o reimplemente los archivos en ubicaciones o instancias que no formaron parte de implementaciones anteriores.

  • Antes de eliminar una aplicación o un grupo de despliegues, implementa una revisión que contenga un AppSpec archivo que especifique que no hay archivos que copiar en las instancias. Para la implementación, especifique el nombre de la aplicación y el nombre del grupo de implementación que utilizan la misma aplicación y el mismo grupo IDs de implementación subyacentes que los que va a eliminar. (Puede usar el get-deployment-groupcomando para recuperar el ID del grupo de despliegue). CodeDeployutiliza el ID y el AppSpec archivo del grupo de despliegue subyacentes para eliminar todos los archivos que instaló en la anterior implementación exitosa.

Las rutas de archivo largas provocan el error “No existe tal archivo o directorio”

En el caso de las implementaciones en instancias de Windows, si tiene una ruta de archivo de más de 260 caracteres en la sección de archivos del archivo appspec.yml, es posible que las implementaciones fallen y se produzca un error similar al siguiente:

No such file or directory @ dir_s_mkdir - C:\your-long-file-path

Este error se produce porque, de forma predeterminada, Windows no permite rutas de archivos de más de 260 caracteres, como se detalla en la documentación de Microsoft.

Para las versiones 1.4.0 o posteriores del CodeDeploy agente, puede habilitar las rutas de archivo largas de dos maneras, según el proceso de instalación del agente:

Si el CodeDeploy agente aún no se ha instalado:

  1. En el equipo en el que va a instalar el CodeDeploy agente, habilite la clave de registro de LongPathsEnabled Windows mediante este comando:

    New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
  2. Instale el CodeDeploy agente. Para obtener más información, consulte Instale el CodeDeploy agente.

Si el CodeDeploy agente ya se ha instalado:

  1. En el equipo CodeDeploy agente, habilite la clave de registro de LongPathsEnabled Windows mediante este comando:

    New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
  2. Reinicie el CodeDeploy agente para que el cambio de clave de registro surta efecto. Para reiniciar el agente, utilice este comando:

    powershell.exe -Command Restart-Service -Name codedeployagent

Los procesos de larga duración pueden producir un error en la implementación

En el caso de las implementaciones en Amazon Linux, Ubuntu Server e RHEL instancias, si tiene un script de implementación que inicia un proceso de ejecución prolongada, es CodeDeploy posible que pase mucho tiempo esperando durante el evento del ciclo de vida de la implementación y, luego, no se realice la implementación. Esto se debe a que si el proceso se ejecuta durante más tiempo del previsto para los procesos en primer plano y en segundo plano, la implementación CodeDeploy se detiene y produce un error, incluso si el proceso sigue ejecutándose según lo previsto.

Suponga, por ejemplo, que la revisión de la aplicación contiene dos archivos en su raíz, after-install.sh y sleep.sh. Su AppSpec archivo contiene las siguientes instrucciones:

version: 0.0 os: linux files: - source: ./sleep.sh destination: /tmp hooks: AfterInstall: - location: after-install.sh timeout: 60

El after-install.sh archivo se ejecuta durante el evento del ciclo de vida de la AfterInstall aplicación. Este es su contenido:

#!/bin/bash /tmp/sleep.sh

El archivo sleep.sh contiene lo siguiente, que suspende la ejecución del programa durante tres minutos (180 segundos), lo que simula un proceso de larga duración:

#!/bin/bash sleep 180

Cuando after-install.sh llamasleep.sh, se sleep.sh inicia y se ejecuta durante tres minutos (180 segundos), es decir, dos minutos (120 segundos) después de la hora prevista sleep.sh ( CodeDeploy y, en relación con ello,after-install.sh) que dejará de ejecutarse. Tras el tiempo de espera de un minuto (60 segundos), CodeDeploy se detiene y se produce un error en el momento del ciclo de vida de la AfterInstall aplicación, aunque sleep.sh sigue ejecutándose según lo previsto. Se muestra el siguiente error:

Script at specified location: after-install.sh failed to complete in 60 seconds.

No basta con añadir un signo de ampersand (&) en after-install.sh para ejecutar sleep.sh en segundo plano.

#!/bin/bash # Do not do this. /tmp/sleep.sh &

Si lo hace, puede dejar la implementación en un estado pendiente durante el tiempo de espera predeterminado de una hora para el evento del ciclo de vida de la implementación, después del cual, CodeDeploy se detiene y falla la implementación en el evento del ciclo de vida de la AfterInstall aplicación, como antes.

Enafter-install.sh, llame de la sleep.sh siguiente manera, lo que le permitirá CodeDeploy continuar una vez que el proceso comience a ejecutarse:

#!/bin/bash /tmp/sleep.sh > /dev/null 2> /dev/null < /dev/null &

En la llamada anterior, sleep.sh es el nombre del proceso que desea empezar a ejecutar en segundo plano, redirigiendo stdout, stderr y stdin a /dev/null.

Solución de problemas de un evento AllowTraffic de ciclo de vida fallido sin que se haya registrado ningún error en los registros de implementación

En algunos casos, una implementación azul/verde falla durante el AllowTraffic ciclo de vida, pero los registros de implementación no indican la causa del error.

Este error se debe normalmente a que las comprobaciones de estado se han configurado incorrectamente en Elastic Load Balancing para la instancia del Equilibrador de carga clásico, del Equilibrador de carga de aplicación o del Equilibrador de carga de red usada para administrar el tráfico del grupo de implementación.

Para resolver el problema, revise y corrija los errores en la configuración de la comprobación de estado del balanceador de carga.

Para los balanceadores de carga clásicos, consulte Configurar comprobaciones de estado en la Guía del usuario de los balanceadores de carga clásicos y ConfigureHealthChecken la versión de API referencia de Elastic Load Balancing, versión 2012-06-01.

Para los equilibradores de carga de aplicación, consulte Comprobaciones de estado de los grupos de destino en la Guía del usuario de los equilibradores de carga de aplicación.

Para los equilibradores de carga de red, consulte Comprobaciones de estado de los grupos de destino en la Guía del usuario de los equilibradores de carga de red.

Solución de problemas relacionados con un error o un evento del ciclo de vida de ApplicationStop la BeforeBlockTraffic implementación AfterBlockTraffic

Durante una implementación, el CodeDeploy agente ejecuta los scripts especificados para ApplicationStop y AfterBlockTraffic en el AppSpec archivo de la implementación anterior exitosa. BeforeBlockTraffic (Todos los demás scripts se ejecutan desde el AppSpec archivo de la implementación actual). Si alguno de estos scripts contiene un error y no se ejecuta correctamente, la implementación puede producir un error.

Los posibles motivos de estos errores son los siguientes:

  • El CodeDeploy agente encuentra el deployment-group-id_last_successful_install archivo en la ubicación correcta, pero la ubicación que aparece en el deployment-group-id_last_successful_install archivo no existe.

    En Amazon Linux, Ubuntu Server e RHEL instancias, este archivo debe existir en/opt/codedeploy-agent/deployment-root/deployment-instructions.

    En las instancias de Windows Server, este archivo se debe almacenar en la carpeta C:\ProgramData\Amazon\CodeDeploy\deployment-instructions.

  • En la ubicación que aparece en el deployment-group-id_last_successful_install archivo, el AppSpec archivo no es válido o los scripts no se ejecutan correctamente.

  • El script contiene un error que no se puede corregir, por lo que nunca se ejecuta correctamente.

Utilice la CodeDeploy consola para investigar por qué una implementación podría haber fallado durante alguno de estos eventos. En la página de detalles de la implementación, elija View events (Ver eventos). En la página de detalles de la instancia, en la ApplicationStopAfterBlockTrafficfila o, selecciona Ver registros. BeforeBlockTraffic O usa el AWS CLI para llamar al get-deployment-instancecomando.

Si la causa del error es un script de la última implementación correcta que nunca se ejecutó correctamente, cree una implementación y especifique que se deben ignorar AfterBlockTraffic los errores y. ApplicationStop BeforeBlockTraffic Hay dos formas de hacer esto:

  • Utilice la CodeDeploy consola para crear una implementación. En la página Crear despliegue, en Fallo de un evento ApplicationStop del ciclo de vida, selecciona No fallar el despliegue en una instancia si este evento del ciclo de vida de la instancia falla.

  • Use AWS CLI para llamar al create-deployment comando e incluir la --ignore-application-stop-failures opción.

Cuando vuelva a implementar la revisión de la aplicación, la implementación continuará aunque algunos de estos eventos de ciclo de vida produzcan un error. Si la nueva revisión incluye scripts fijos para los eventos de ciclo de vida, puede que las implementaciones futuras se realicen correctamente si aplica esta solución.

Solución de problemas de un evento fallido en el ciclo de vida de una DownloadBundle implementación con UnknownError: no abierto para lectura

Si está intentando implementar una revisión de la aplicación desde Amazon S3 y la implementación falla durante el evento del ciclo de vida de la DownloadBundle implementación con el siguiente UnknownError: not opened for reading error:

  • Se ha producido un error interno del servicio de Amazon S3. Implemente de nuevo la revisión de la aplicación.

  • El perfil de IAM instancia de su EC2 instancia no tiene permisos para acceder a la revisión de la aplicación en Amazon S3. Para obtener información sobre las políticas de buckets de Amazon S3, consulte Enviar una revisión CodeDeploy a Amazon S3 (EC2/Solo implementaciones locales) y Requisitos previos para una implementación.

  • Las instancias en las que despliega están asociadas a una AWS región (por ejemplo, EE.UU. Oeste (Oregón)), pero el bucket de Amazon S3 que contiene la revisión de la aplicación está asociado a otra AWS región (por ejemplo, EE.UU. Este (Norte de Virginia)). Asegúrese de que la revisión de la aplicación esté en un bucket de Amazon S3 asociado a la misma AWS región que las instancias.

En la página de detalles del evento de la implementación, en la fila Download bundle (Descargar paquete), elija View logs (Ver registros). O utilice el AWS CLI para llamar al get-deployment-instancecomando. Si se produce un error, debería aparecer un error en el resultado con el código de error UnknownError y el mensaje de error not opened for reading.

Para determinar la causa de este error:

  1. Habilite el registro en red en al menos una de las instancias y, a continuación, implemente de nuevo la revisión de la aplicación.

  2. Examine el archivo de registro en red para encontrar el error. Los mensajes de error comunes para este problema incluyen la frase "access denied".

  3. Después de examinar los archivos de registro, le recomendamos que deshabilite el registro en red para reducir el tamaño de los archivos de registro y la cantidad de información confidencial que puede aparecer en la salida en texto sin formato en la instancia en el futuro.

Para obtener información sobre cómo encontrar el archivo de registro de cables y habilitar y deshabilitar el registro de cables, consulte :log_aws_wire: la referencia de configuración del CodeDeploy agente.

Solución de problemas cuando se omiten todos los eventos del ciclo de vida

Si se omiten todos los eventos del ciclo de vida de una implementación local EC2 o de una implementación local, es posible que reciba un error similar 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) Estas son algunas posibles causas y soluciones:

  • Es posible que el CodeDeploy agente no esté instalado o en ejecución en la instancia. Para determinar si el CodeDeploy agente se está ejecutando:

    • Para el servidor Amazon Linux RHEL o Ubuntu, ejecute lo siguiente:

      systemctl status codedeploy-agent
    • Para Windows, ejecute lo siguiente:

      powershell.exe -Command Get-Service -Name CodeDeployagent

    Si el CodeDeploy agente no está instalado o en ejecución, consulteCompruebe que el CodeDeploy agente se esté ejecutando.

    Es posible que tu instancia no pueda llegar al punto de conexión público CodeDeploy o a Amazon S3 mediante el puerto 443. Pruebe con una de las siguientes acciones:

  • Es posible que el rol de servicio no CodeDeploy tenga los permisos necesarios. Para configurar un rol de servicio de CodeDeploy, consulte Paso 2: Crear un rol de servicio para CodeDeploy.

  • Si utiliza un HTTP proxy, asegúrese de que esté especificado en la :proxy_uri: configuración del archivo de configuración del CodeDeploy agente. Para obtener más información, consulte CodeDeploy referencia de configuración del agente.

  • Es posible que la firma de fecha y hora de la firma de su instancia de implementación no coincida con la firma de fecha y hora de la solicitud de implementación. Busque un error similar al que aparece Cannot reach InstanceService: Aws::CodeDeployCommand::Errors::InvalidSignatureException - Signature expired en el archivo de registro del CodeDeploy agente. Si ve este error, siga los pasos que se indican en Solución de errores de implementación del tipo «InvalidSignatureException — Firma caducada: [hora] es anterior a [hora]». Para obtener más información, consulte Vea los datos de registro de las implementaciones locales CodeDeploy de EC2/.

  • Es posible que el CodeDeploy agente deje de ejecutarse porque una instancia se está quedando sin memoria o espacio en el disco duro. Intenta reducir el número de implementaciones archivadas en la instancia actualizando la max_revisions configuración del CodeDeploy agente. Si haces esto para una EC2 instancia y el problema persiste, considera usar una instancia más grande. Por ejemplo, si el tipo de instancia es t2.small, intente usar una t2.medium. Para obtener más información, consulte Archivos instalados por el agente CodeDeploy , CodeDeploy referencia de configuración del agente y Tipos de instancias.

  • Es posible que la instancia en la que vas a realizar la implementación no tenga un perfil de IAM instancia adjunto o que tenga un perfil de IAM instancia adjunto que no tenga los permisos necesarios.

    • Si un perfil de IAM instancia no está adjunto a la instancia, crea uno con los permisos necesarios y, a continuación, adjúntalo.

    • Si ya hay un perfil de IAM instancia adjunto a tu instancia, asegúrate de que tenga los permisos necesarios.

    Después de confirmar que el perfil de instancia asociado está configurado con los permisos necesarios, reinicie la instancia. Para obtener más información, consulta Paso 4: Crea un perfil de IAM instancia para tus EC2 instancias de Amazon IAMRoles for Amazon EC2 en la Guía del EC2 usuario de Amazon.

PowerShell Los scripts de Windows no utilizan la versión de 64 bits de Windows de forma PowerShell predeterminada

Si un PowerShell script de Windows que se ejecuta como parte de una implementación utiliza una funcionalidad de 64 bits (por ejemplo, porque consume más memoria de la que permite una aplicación de 32 bits o porque llama a bibliotecas que solo se ofrecen en una versión de 64 bits), es posible que el script se bloquee o no se ejecute según lo esperado. Esto se debe a que, de forma predeterminada, CodeDeploy utiliza la versión de 32 bits de Windows PowerShell para ejecutar los PowerShell scripts de Windows que forman parte de la revisión de una aplicación.

Agregue un código como el siguiente al principio de cualquier script que deba ejecutarse con la versión de 64 bits de 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... # ...

Si bien la información sobre la ruta de archivo de este código puede parecer contradictoria, Windows de 32 bits PowerShell utiliza una ruta como la siguiente:

c:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe

Windows de 64 bits PowerShell usa una ruta como la siguiente:

c:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe