¿Cómo puedo depurar plantillas de CloudFormation de forma rápida y eficaz?

83

CloudFormation es una potente oferta de AWS que permite la creación programática de pilas de recursos de AWS, como el nivel web de una aplicación, un clúster informático de alto rendimiento o una pila de aplicaciones completa, con una sola llamada a la API. Es inmensamente poderoso. Su uso seguramente se considera una buena práctica de AWS, especialmente cuando se combina con Chef, Puppet o cloud-init. Depurarlo me lleva al vicio.

Tome un ejemplo de producción: las plantillas de clúster de mongodb estándar no funcionarán para mí. Particularmente no sé por qué. Seguro que es algo sencillo como casi siempre lo es. Mi problema no es que no pueda averiguar qué está mal. Es que la pila tarda entre 20 y 30 minutos en fallar, y luego otros tres o cuatro minutos en eliminar, suponiendo que elimine los recursos correctamente.

¿Qué me estoy perdiendo? Conozco la --disable-rollbackbandera y la uso como oxígeno. Aprendí hace mucho tiempo a envolver los mensajes de salida cfn-signaly a arrojarlos como lastre de un barco que se hunde. ¿Cómo puedo hacer que el proceso de depuración de la plantilla sea más rápido o me quedo atascado para siempre notando mis errores media hora después de cometerlos?

Christopher
fuente
3
Incluso los errores tipográficos en JSON a veces no se detectan hasta más de 10 minutos en el proceso de compilación, ya que no se da cuenta de que un tipo de recurso en particular no tiene un nombre de atributo particular hasta que intenta iniciar ese recurso.
Eric Hammond
1
Mis favoritos sin ningún orden en particular: cuando cambia los contextos de recursos y encuentra atributos casi pero no del todo idénticos, se olvida de agregar una comilla de escape dentro de una declaración de script de usuario y cualquier cosa que tenga que ver con VolumeAttachments, ya que ocasionalmente fallan sin razón alguna.
Christopher
1
+1 por mencionar "deshabilitar la reversión automática" - esto fue increíble para obtener mejores mensajes de error para subestaciones
izikandrw
1
Descubrí que los errores en los segmentos de políticas harán que cosas como BucketPolicy se atasquen en la etapa CREATE para siempre; si algo está bloqueado en CREATE, comience allí.
Eric Nord

Respuestas:

46

Utilice el aws cloudformation validate-templatecomando en la herramienta AWS CLI. Solo valida si su plantilla es JSON o YAML válido, no si sus claves y valores son correctos (por ejemplo, no comprueba si hay errores tipográficos en las claves)

Luciano Issoe
fuente
1
Esto también está disponible en el cli unificado docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…
mp3foley
7
Por cierto, esto está aws cloudformation validate-templateen las nuevas herramientas de la AWS CLI.
Christopher
8
Para cualquiera que se encuentre con esta pregunta en 2017+, esto es ahora aws cloudformation validate-template, y solo valida si su plantilla es JSON o YAML válida, no si sus claves y valores son correctos (por ejemplo, no verifica errores tipográficos en las claves).
Daniel Kats
1
Por alguna razón, parece ignorar la longitud de la línea, por ejemplo Property validation failure: [Length of value {XYZ} for property {/RepositoryDescription} is greater than maximum allowed length {100}]. Según el validate-templatecomando, esto no fue un problema, pero la interfaz de usuario devuelve este error.
030
2
Si esta herramienta solo hace la validación del formato de archivo, no lo es; jsonlint o yamllint suficiente? Además, esta herramienta tiene la limitación de tamaño de archivo de 51.200 bytes.
Siva Senthil
23

Otra opción, un año después, es abstraer estas plantillas en una biblioteca de terceros, como troposfera . Esa biblioteca construye la carga útil JSON por usted y realiza una gran cantidad de validación en el camino. Esto también resuelve el problema "Wow, administrar un archivo JSON de 1000 líneas seguro es triste" .

Christopher
fuente
3
"Wow, administrar un archivo JSON de 1000 líneas es una pena". Seguramente es por eso que se crearon pilas anidadas. ;-) Aunque estoy de acuerdo, ¡la troposfera es increíble!
YFP
10

¿Cómo puedo hacer que el proceso de depuración de la plantilla sea más rápido o me quedo atascado para siempre notando mis errores media hora después de cometerlos?

Aquí hay algunas sugerencias de mejores prácticas, que se centran específicamente en mejorar la velocidad de iteración del desarrollo complejo de plantillas de CloudFormation:

Utilice las herramientas de CloudFormation para validar plantillas y apilar actualizaciones

AWS ya los describió en su propio documento de Mejores prácticas , por lo que no los repetiré:

El objetivo de este paso es detectar errores lógicos o de sintaxis obvios antes de realizar una creación / actualización de la pila.

Probar recursos de forma aislada

Antes de usar cualquier recurso de CloudFormation individual en una pila compleja, asegúrese de comprender a fondo el alcance total del comportamiento de creación / actualización / eliminación de ese recurso, incluidos los límites de uso y los tiempos de inicio / desmontaje típicos, probando su comportamiento en pilas independientes más pequeñas. primero.

  • Si está desarrollando o utilizando recursos personalizados de terceros, escriba pruebas unitarias con las bibliotecas adecuadas para la plataforma del lenguaje, para asegurarse de que la lógica de la aplicación se comporte como se espera en todos los casos de uso.
  • Tenga en cuenta que la cantidad de tiempo para que un recurso individual cree / actualice / elimine puede variar ampliamente entre los tipos de recursos, según el comportamiento de las llamadas API subyacentes. Por ejemplo, un AWS::CloudFront::Distributionrecurso complejo a veces puede tardar entre 30 y 60 minutos en crearse / actualizarse / eliminarse, mientras que un recurso se AWS::EC2::SecurityGroupactualiza en segundos.
  • Los recursos individuales pueden tener errores / problemas / limitaciones en su implementación, que son mucho más fáciles de depurar y desarrollar soluciones cuando se prueban de forma aislada, en lugar de dentro de una pila mucho más grande. Tenga en cuenta las limitaciones, como los límites del servicio de AWS, según la configuración de su cuenta de AWS individual, o la disponibilidad regional de los servicios, según la región en la que cree su pila.

Construya pilas complicadas en pequeños incrementos

Al realizar la creación / actualización de una pila, una falla en cualquier recurso hará que la pila revierta todo el conjunto de cambios de recursos, lo que puede destruir innecesariamente otros recursos creados con éxito y tomar mucho tiempo cuando se construye una pila complicada con un largo gráfico de dependencia de recursos asociados.

La solución a esto es construir su Pila de forma incremental en lotes de Actualización más pequeños, agregando Recursos uno (o unos pocos) a la vez. De esta manera, si / cuando ocurre una falla en la creación / actualización de un recurso, la reversión no hace que se destruyan todos los recursos de su Pila, solo el conjunto de Recursos cambiado en la última Actualización.

Supervisar el progreso de las actualizaciones de la pila

Asegúrese de monitorear el progreso de la actualización de su pila viendo los eventos de la pila mientras se realiza una creación / actualización. Este será el punto de partida para depurar más problemas con recursos individuales.

wjordania
fuente
Acerca de CloudFront y cuánto tiempo lleva, ¿sabe usted de todos modos que la pila esté en estado completo, sin esperar? Quiero obtener los resultados, pero no necesito esperar a que se implemente la distribución en mi caso
mcfedr
9

¿Ha examinado el editor de plantillas de AWS CloudFormation que se incluye en AWS Toolkit for Eclipse ? Tiene resaltado de sintaxis, finalización de declaraciones e implementación en AWS CloudFormation.

Wade Matveyenko
fuente
6
"AWS Toolkit for Visual Studio" ha sido indispensable para mí.
Ed Norris
5

Llegó tarde a la fiesta, pero también podría agregar que vale la pena dedicar un poco de tiempo a configurar y aprender a su editor. Sé que suena ridículamente básico como respuesta, pero pruébalo.

En mi caso, con vim, funcioné mucho mejor una vez que me tomé un tiempo para instalar los complementos de sintaxis json y también (finalmente) entendí las técnicas de plegado para navegar fácilmente en archivos CF grandes. El mío ahora sugiere errores tipográficos (comas donde no deberían estar, etc.) y el resaltado de color ahorra mucho tiempo dando pistas visuales claras.

Esto podría ayudar a mitigar los errores de sintaxis, pero los errores lógicos en la plantilla se corrigen mejor con otras herramientas. Con suerte, algún día habrá un modo de "vista previa" en CF.

Perra
fuente
1
No es una sugerencia ridícula en absoluto. No estoy seguro de poder codificar sin resaltar la sintaxis.
Christopher
2
hay una vista previa de CFN que muestra todos los recursos que está a punto de crear, y también le dirá cuánto costará su pila. Estoy usando la API de Java, por lo que no estoy seguro de que esté disponible en la CLI, pero intente esto: enlace
iGili
4

Para los IDE de JetBrains (IntelliJ IDEA PhpStorm WebStorm PyCharm RubyMine AppCode CLion Gogland DataGrip Rider Android Studio), existe el complemento AWS CloudFormation que admite la verificación profunda de las plantillas JSON y YAML CFN

Jason
fuente
4

El linter de AWS CloudFormation proporciona análisis estático adicional más alláaws cloudformation validate-template

Le informará qué tipos de recursos y tipos de instancias no están disponibles en ciertas regiones, validará los valores de propiedad contra los valores permitidos, detectará dependencias circulares de recursos, errores de sintaxis, límites de plantilla y mucho más

Además de la CLI, uno de los mecanismos más populares para recordar ejecutar el linter es instalar un complemento de editor como la extensión de Visual Studio Code que se ejecuta en cada archivo guardado.

Aquí se describen otros mecanismos como los ganchos de Git de confirmación previa

Captura de pantalla de ejemplo de extensión de código de Visual Studio

Pat Myron
fuente
2

Si está tratando con máquinas EC2, le recomendaría que inicie sesión en la máquina EC2 y siga el archivo boot.log (/var/log/boot.log en RHEL6 / Centos). Este archivo se actualiza con todas sus actividades de shell (actividades como: instalación, descarga de archivos, copia de archivos, etc.).

Además, use editores como http://www.jsoneditoronline.org/ para obtener una representación TREE de su JSON. Esto le ayuda a verificar el orden de los elementos JSON.

Y cuando actualice archivos, utilice siempre herramientas como http://www.git-tower.com/blog/diff-tools-mac/ o un sistema de control de versiones real para asegurarse de que no haya cambiado accidentalmente algo que pueda romper el script.

ChaitanyaBhatt
fuente
1

Una nueva característica reciente agregada a Cloudformation en diciembre pasado fue la adición de tipos de parámetros adicionales . Estos nuevos tipos permiten que sus plantillas realicen una verificación de datos más sólida y también pueden "fallar rápidamente" al crear recursos y pilas de Cloudformation anidadas. También tiene la capacidad de proporcionar mensajes de error personalizados legibles por humanos más agradables cuando se pasan valores no válidos utilizando el nuevo atributo ConstraintDescription .

Los nuevos tipos son especialmente útiles cuando se trata de varios recursos de VPC. Puede asegurarse de que los parámetros de sus plantillas sean del tipo correcto y sean explícitos sobre la expectativa de un valor único frente a una lista.

Por ejemplo:

"Parameters" : {
  "SingleGroup": { "Type": "AWS::EC2::SecurityGroup::Id", ...},
  "GroupList": {"Type": "List<AWS::EC2::SecurityGroup::Id>", ...}
}
Mikelax
fuente
1

Consulte mi validador de formación en la nube en https://pypi.org/project/cloudformation-validator/

Esto validará el esquema y luego validará nuevamente una lista de reglas y permitirá reglas personalizadas. También permite una fácil integración con las herramientas de implementación.

WillRubel
fuente