Resolución de problemas de implementación de EC2/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.

Resolución de problemas de implementación de EC2/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-premise, consulte - en AWSSupportla referencia del manual de automatización de TroubleshootCodeDeploy Systems Manager AWS .

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 va a implementar no tiene un perfil de instancia de IAM asociado.

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

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

La implementación produce un error con el mensaje “Validation of PKCS7 signed message failed”

Este mensaje de error indica que la instancia ejecuta una versión del CodeDeploy agente que solo admite el algoritmo hash SHA-1. Support 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 para cambiar AWS al algoritmo hash SHA256 para los certificados SSL, NOTA: Retirar 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"

Si 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 aparezca el mensaje de error "The deployment failed because a specified file already exists at this location: nombre-ubicación" (Se produjo un error en la implementación porque un archivo especificado ya existe en esta ubicación: nombre-ubicación). 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, RHEL y Ubuntu Server, el archivo de limpieza se encuentra en /opt/codedeploy-agent/deployment-root/deployment-instructions/. 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 Creación de una implementación en una plataforma de informática de EC2/en las instalaciones (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 la 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 redistribución falla porque, aunque el nombre del grupo de implementación sea el mismo, CodeDeploy hace referencia a un ID de grupo de implementación 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 redistribución porque, aunque los nombres de la aplicación y del grupo de implementaciones son los mismos, CodeDeploy siguen haciendo referencia al ID del grupo de implementación 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 identificadores de grupo de implementaciones diferentes.

  • 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 aplicación y el nombre del grupo de implementaciones que usan los mismos identificadores de aplicación y grupo de implementaciones que los que está a punto de eliminar. (Puede usar el get-deployment-groupcomando para recuperar el ID del grupo de implementación). 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, active 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 Instala 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 instancias de Amazon Linux, Ubuntu Server y RHEL, 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 que se espera que los procesos en primer plano y en segundo plano, en ese caso la implementación CodeDeploy se detenga o falle, 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 (y, en relación con ello,after-install.sh) en la CodeDeploy 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 Classic Load Balancers y ConfigureHealthChecken la versión de referencia de la API 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 las instancias de Amazon Linux, Ubuntu Server y RHEL, 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 instancia de IAM de su instancia de Amazon S3 no tiene permisos para obtener acceso 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 (solo para implementaciones de EC2/on-premise) 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 todos los eventos del ciclo de vida de una implementación de EC2 o en las instalaciones se omiten, 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 un servidor de 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:

    • Asigne una dirección IP pública a la instancia y utilice su tabla de ruteo para permitir el acceso a Internet. Asegúrese de que el grupo de seguridad asociado con la instancia permite el acceso de salida a través del puerto 443 (HTTPS). Para obtener más información, consulte Protocolo de comunicación y puerto para el CodeDeploy agente.

    • Si una instancia se aprovisiona en una subred privada, utilice una gateway NAT en lugar de una gateway de Internet en la tabla de ruteo. Para obtener más información, consulte Puerta de enlace NAT.

  • CodeDeploy Es posible que el rol de servicio no 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 proxy HTTP, 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 del archivo Cannot reach InstanceService: Aws::CodeDeployCommand::Errors::InvalidSignatureException - Signature expired de registro del CodeDeploy agente. Si ve este error, siga los pasos que se indican en Solución de errores de despliegue «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 hace esto para una instancia de EC2 y el problema continúa, considere la posibilidad de utilizar 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 que va a implementar no tenga un perfil de instancia de IAM asociado o que tenga un perfil de instancia de IAM asociado que no tenga los permisos necesarios.

    • Si un perfil de instancia de IAM no está asociado a la instancia, cree uno con los permisos necesarios y, a continuación, asócielo a la instancia.

    • Si un perfil de instancia de IAM ya está asociado a la instancia, asegúrese de que dispone de 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, consulte Paso 4: Crear un perfil de instancia de IAM para las instancias de Amazon EC2 y Roles de IAM para Amazon EC2 en la Guía del usuario de Amazon EC2.

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

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 usa 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