Tutorial: Creación de una canalización para pilas de prueba y pilas de producción - AWS CloudFormation

Tutorial: Creación de una canalización para pilas de prueba y pilas de producción

Imagine un proceso de publicación en el que envía una plantilla de AWS CloudFormation que AWS CloudFormation utiliza a continuación para crear una pila de prueba de forma automática. Después de revisar la pila de prueba, puede obtener una vista previa de cómo modificarán sus cambios la pila de producción y, a continuación, decidir si desea implementarlos. Para aplicar este flujo de trabajo, podría usar AWS CloudFormation para crear la pila de prueba, eliminar la pila de prueba, crear un conjunto de cambios y, a continuación, ejecutar el conjunto de cambios. No obstante, con cada acción deberá interactuar manualmente con AWS CloudFormation. En este tutorial vamos a crear una canalización de CodePipeline que automatiza muchas de estas acciones, lo que le ayudará a conseguir un flujo de trabajo de entrega continua con sus pilas de AWS CloudFormation.

Requisitos previos

Este tutorial presupone que ha utilizado CodePipeline y AWS CloudFormation, y sabe cómo funcionan las canalizaciones, las pilas y las plantillas de AWS CloudFormation. Para obtener más información sobre CodePipeline, consulte la Guía del usuario de AWS CodePipeline. También debe contar con un bucket de Amazon S3 en la región de AWS en la que creará la canalización.

importante

La plantilla de ejemplo de WordPress crea una instancia de EC2 que requiere una conexión a Internet. Compruebe que dispone de una VPC y subred predeterminadas que permitan el tráfico a Internet.

Información general del tutorial

En este tutorial se crea una canalización para un sitio de WordPress de ejemplo en una pila. La canalización se divide en tres fases. Cada fase debe contener al menos una acción, que es una tarea que la canalización realiza sobre los artefactos (la entrada que usted especifica). Una fase organiza las acciones en una canalización. CodePipeline debe completar todas las acciones de una fase antes de que esta procese nuevos artefactos; por ejemplo, cuando haya enviado nuevas entradas para volver a ejecutar la canalización.

Al final de este tutorial tendrá una canalización que aplicará el siguiente flujo de trabajo:

  1. La primera fase de la canalización recupera un artefacto de origen (una plantilla de AWS CloudFormation y sus archivos de configuración) de un repositorio.

    Preparará un artefacto que incluirá una plantilla de WordPress de ejemplo y lo cargará en un bucket de S3.

  2. En la segunda fase, la canalización crea una pila de prueba y, a continuación, espera su aprobación.

    Después de revisar la pila de prueba, puede elegir entre continuar con la canalización original o crear y enviar otro artefacto para realizar cambios. Si da su aprobación, esta fase elimina la pila de prueba y, a continuación, la canalización continúa con la siguiente fase.

  3. En la tercera fase, la canalización crea un conjunto de cambios para una pila de producción y, a continuación, espera su aprobación.

    En la ejecución inicial, no habrá una pila de producción. El conjunto de cambios muestra todos los recursos que AWS CloudFormation creará. Si da su aprobación, esta fase ejecuta el conjunto de cambios y crea la pila de producción.

nota

AWS CloudFormation es un servicio gratuito. Sin embargo, se le cobrará por los recursos de AWS que incluya en la pila, como la instancia de EC2, aplicando la tarifa actual para cada una de ellos. Para obtener más información sobre los precios de AWS, consulte la página de detalles correspondiente a cada producto en http://aws.amazon.com.

Paso 1: Editar el artefacto y cargarlo en un bucket de S3

Antes de crear la canalización, debe configurar el repositorio de origen y los archivos. CodePipeline copia estos archivos de origen en el almacén de artefactos de su canalización y, a continuación, los utiliza para llevar a cabo las acciones de la canalización, como, por ejemplo, crear una pila de AWS CloudFormation.

Cuando se usa Amazon Simple Storage Service (Amazon S3) como repositorio de origen, CodePipeline requiere que comprima los archivos de origen antes de cargarlos a un bucket de S3. El archivo comprimido es un artefacto de CodePipeline que puede contener una plantilla de AWS CloudFormation, un archivo de configuración de plantilla o ambos. En la guía proporcionamos un artefacto que contiene como ejemplo una plantilla de WordPress y dos archivos de configuración de plantilla. Los dos archivos de configuración especifican los valores de los parámetros de la plantilla de WordPress. CodePipeline los utiliza cuando crea las pilas de WordPress. Un archivo contiene los valores de los parámetros para una pila de prueba y el otro para una pila de producción. Tendrá que editar los archivos de configuración, por ejemplo, para especificar el nombre de un par de claves de EC2 de su propiedad. Para obtener más información acerca de los artefactos, consulte Artefactos de AWS CloudFormation.

Después de crear el artefacto, deberá cargarlo en un bucket de S3.

Para editar y cargar el artefacto
  1. Descargue y abra el artefacto de ejemplo: https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/wordpress-single-instance.zip.

    El artefacto contiene tres archivos:

    • La plantilla de WordPress de ejemplo: wordpress-single-instance.yaml

    • El archivo de configuración de plantilla para la pila de prueba: test-stack-configuration.json

    • El archivo de configuración de plantilla para la pila de producción: prod-stack-configuration.json

  2. Extraiga todos los archivos y, a continuación, utilice cualquier editor de texto para modificar los archivos de configuración de la plantilla.

    Abra los archivos de configuración para comprobar que contienen los pares clave-valor que se asignarán a los parámetros de la plantilla de WordPress. Los archivos de configuración especifican los valores de los parámetros que la canalización utiliza al crear las pilas de prueba y de producción.

    Edite el archivo test-stack-configuration.json para especificar los valores de los parámetros para la pila de prueba y el archivo prod-stack-configuration.json para la pila de producción.

    • Cambie los valores de las claves DBPassword y DBRootPassword por contraseñas que sirvan para iniciar sesión en la base de datos de WordPress. Siguiendo la definición de la plantilla de WordPress, los valores de los parámetros solo pueden contener caracteres alfanuméricos.

    • Cambie el valor de la clave KeyName por un nombre de par de claves de EC2 existente en la región en la que creará la canalización.

  3. Agregue los archivos de configuración modificados al archivo (.zip) del artefacto original sustituyendo los archivos duplicados.

    Ahora tiene un artefacto personalizado que puede cargar en un bucket de S3.

  4. Cargue el artefacto en un bucket de S3 de su propiedad.

    Observe la ubicación del archivo. Tendrá que especificarla después al crear la canalización.

    Notas sobre el artefacto y el bucket de S3:

    • Utilice un bucket que se encuentre en la misma región de AWS en la que creará la canalización.

    • CodePipeline requiere que el bucket tenga el control de versiones habilitado.

    • También puede utilizar como repositorio de origen servicios que no requieren comprimir los archivos antes de cargarlos, como GitHub o CodeCommit.

    • Los artefactos pueden contener información confidencial, por ejemplo contraseñas. Limite el acceso para que solo los usuarios autorizados puedan ver el archivo. Al hacerlo, asegúrese de que CodePipeline siga teniendo acceso al archivo.

Ahora tiene un artefacto que CodePipeline puede incluir en la canalización. En el siguiente paso, especificará la ubicación del artefacto y creará la canalización de WordPress.

Paso 2: Crear la pila de la canalización

Para crear la canalización de WordPress, utilizará una plantilla de AWS CloudFormation de ejemplo. Además de crear la canalización, la plantilla configura roles del servicio de AWS Identity and Access Management (IAM) para CodePipeline y AWS CloudFormation, un bucket de S3 para el almacén de artefactos de CodePipeline y un tema de Amazon Simple Notification Service (Amazon SNS) al que la canalización envía notificaciones, como, por ejemplo, las relacionadas con comentarios. La plantilla de ejemplo facilita las tareas de aprovisionamiento y configuración de estos recursos en una única pila de AWS CloudFormation.

Para obtener más detalles sobre la configuración de la canalización, consulte Operaciones que realiza la canalización.

importante

La plantilla de ejemplo de WordPress crea una instancia de EC2 que requiere una conexión a Internet. Compruebe que su VPC y subred predeterminadas permiten dirigir tráfico a Internet.

Para crear la pila de la canalización
  1. Descargue la plantilla de ejemplo en https://s3.amazonaws.com/cloudformation-examples/user-guide/continuous-deployment/basic-pipeline.yml. Guárdela en su equipo.

  2. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation/.

  3. Elija una región de AWS compatible con CodePipeline y AWS CloudFormation.

    Para obtener más información, consulte Regiones y puntos de enlace de AWS en la Referencia general de AWS.

  4. Seleccione Crear pila.

  5. En Specify template (Especificar plantilla), elija Upload a template file (Cargar un archivo de plantilla) y, a continuación, elija la plantilla que acaba de descargar, basic-pipeline.yml.

  6. Seleccione Siguiente.

  7. Para Stack name (Nombre de pila), escriba sample-WordPress-pipeline.

  8. En la sección Parameters (Parámetros) especifique los valores siguientes para los parámetros y, a continuación, elija Next (Siguiente). Al configurar los parámetros de la pila, si mantuvo los mismos nombres para la plantilla de WordPress y sus archivos de configuración, puede utilizar los valores predeterminados. En caso contrario, especifique los nombres de archivo que utilizó.

    PipelineName

    Nombre de la canalización, por ejemplo WordPress-test-pipeline.

    S3 Bucket

    Nombre del bucket de S3 donde guardó el artefacto (archivo .zip).

    SourceS3Key

    El nombre de archivo de su artefacto. Si ha guardado el artefacto en una carpeta, inclúyala como parte del nombre de archivo, como folder/subfolder/wordpress-single-instance.zip.

    Correo electrónico

    Dirección de correo electrónico a la que CodePipeline envía la notificación de la canalización, por ejemplo, myemail@example.com.

  9. Para este tutorial, no tiene que añadir etiquetas ni especificar una configuración avanzada, así que elija Next (Siguiente).

  10. Asegúrese de que el nombre de la pila y la URL de la plantilla sean correctos y elija Create stack (Crear pila).

  11. Para confirmar que es consciente de que AWS CloudFormation podría crear recursos de IAM, seleccione la casilla de verificación.

Podría llevarle varios minutos a AWS CloudFormation crear la pila. Para monitorizar el progreso, vea los eventos de la pila. Para obtener más información, consulte Visualización de recursos y datos de la pila de AWS CloudFormation en la AWS Management Console.

Una vez creada la pila, CodePipeline inicia la nueva canalización. Para ver el estado, consulte la consola de CodePipeline. En la lista de canalizaciones, elija WordPress-test-pipeline.

Operaciones que realiza la canalización

En esta sección se explican las tres fases de la canalización a través de fragmentos de código de la plantilla de la canalización de WordPress de ejemplo.

Fase 1: Origen

La primera fase de la canalización es una fase de origen en la que usted especifica la ubicación de su código fuente. Cada vez que envíe una revisión a esta ubicación, CodePipeline volverá a ejecutar la canalización.

El código fuente se encuentra en un bucket de S3 y se identifica mediante su nombre de archivo. Especificó estos valores para los parámetros de entrada al crear la pila de la canalización. Para permitir usar el artefacto de origen en las fases posteriores, el fragmento especifica la propiedad OutputArtifacts, con el nombre TemplateSource. Para utilizar este artefacto en fases posteriores, especifique TemplateSource como artefacto de entrada.

- Name: S3Source Actions: - Name: TemplateSource ActionTypeId: Category: Source Owner: AWS Provider: S3 Version: '1' Configuration: S3Bucket: !Ref 'S3Bucket' S3ObjectKey: !Ref 'SourceS3Key' OutputArtifacts: - Name: TemplateSource

Fase 2: TestStage

En la fase TestStage, la canalización crea la pila de prueba, espera a su aprobación y, a continuación, elimina la pila de prueba.

Para la acción CreateStack, la canalización utiliza el archivo de configuración de prueba y la plantilla de WordPress para crear la pila de prueba. Ambos archivos se encuentran en el artefacto de entrada TemplateSource, que se trae de la fase de origen. El fragmento de código utiliza el modo de acción REPLACE_ON_FAILURE. Si se produce algún error durante la creación de la pila, la canalización la sustituye para que no sea necesario limpiar o resolver problemas de la pila antes de poder volver a ejecutar la canalización. Este modo de acción es útil para una iteración rápida en pilas de prueba. Para la propiedad RoleArn, el valor es un rol del servicio AWS CloudFormation declarado en otro lugar de la plantilla.

La acción ApproveTestStack detiene la canalización y envía una notificación a la dirección de correo electrónico que especificó al crear la pila de la canalización. Mientras la canalización está en pausa, puede comprobar la pila de prueba de WordPress y sus recursos. Uso de CodePipeline para aprobar o rechazar esta acción. La propiedad CustomData incluye una descripción de la acción que va a aprobar, que la canalización añade al correo electrónico de notificación.

Después de aprobar esta acción, CodePipeline pasa a la acción DeleteTestStack y elimina la pila de prueba de WordPress y sus recursos.

- Name: TestStage Actions: - Name: CreateStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: REPLACE_ON_FAILURE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName TemplateConfiguration: !Sub "TemplateSource::${TestStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveTestStack ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'Do you want to create a change set against the production stack and delete the ${TestStackName} stack?' RunOrder: '2' - Name: DeleteTestStack ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: DELETE_ONLY RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref TestStackName RunOrder: '3'

Fase 3: ProdStage

La fase ProdStage de la canalización crea un conjunto de cambios en la pila de producción existente, espera a su aprobación y, a continuación, ejecuta el conjunto de cambios.

Un conjunto de cambios proporciona una vista previa de todas las modificaciones que AWS CloudFormation hará a su pila de producción antes de su aplicación. En la primera ejecución de la canalización, no habrá una pila de producción en ejecución. El conjunto de cambios muestra las acciones que AWS CloudFormation realizó al crear la pila de prueba. Para crear el conjunto de cambios, la acción CreateChangeSet utiliza el ejemplo de plantilla de WordPress y la configuración de plantilla para producción del artefacto de entrada TemplateSource.

De forma similar a la fase anterior, la acción ApproveChangeSet detiene la canalización y envía una notificación por correo electrónico. Mientras la canalización está en pausa, puede ver el conjunto de cambios para comprobar todas las modificaciones propuestas a la pila de producción de WordPress. Use CodePipeline para aprobar o rechazar esta acción y así continuar o detener la canalización, respectivamente.

Después de aprobar esta acción, ExecuteChangeSet ejecuta el conjunto de cambios, de forma que AWS CloudFormation realice todas las acciones descritas en él. Para la ejecución inicial, AWS CloudFormation crea la pila de producción de WordPress. En las ejecuciones posteriores, AWS CloudFormation actualiza la pila.

- Name: ProdStage Actions: - Name: CreateChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' InputArtifacts: - Name: TemplateSource Configuration: ActionMode: CHANGE_SET_REPLACE RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName ChangeSetName: !Ref ChangeSetName TemplateConfiguration: !Sub "TemplateSource::${ProdStackConfig}" TemplatePath: !Sub "TemplateSource::${TemplateFileName}" RunOrder: '1' - Name: ApproveChangeSet ActionTypeId: Category: Approval Owner: AWS Provider: Manual Version: '1' Configuration: NotificationArn: !Ref CodePipelineSNSTopic CustomData: !Sub 'A new change set was created for the ${ProdStackName} stack. Do you want to implement the changes?' RunOrder: '2' - Name: ExecuteChangeSet ActionTypeId: Category: Deploy Owner: AWS Provider: CloudFormation Version: '1' Configuration: ActionMode: CHANGE_SET_EXECUTE ChangeSetName: !Ref ChangeSetName RoleArn: !GetAtt [CFNRole, Arn] StackName: !Ref ProdStackName RunOrder: '3'

Paso 3: Visualizar la pila de WordPress

Como CodePipeline se ejecuta en la canalización, utiliza AWS CloudFormation para crear pilas de prueba y de producción. Para ver el estado de estas pilas y su salida, utilice la consola de AWS CloudFormation.

Para ver una pila
  1. Abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation/.

  2. Dependiendo de si la canalización se encuentra en la fase de prueba o de producción, elija la pila Test-MyWordPressSite o la pila Prod-MyWordPressSite.

  3. Para comprobar el estado de la pila, vea los eventos de la pila.

Si la pila se encuentra en estado de error, observe el motivo del estado para encontrar el error de la pila. Corrija el error y, a continuación, vuelva a ejecutar la canalización. Si la pila se encuentra en el estado CREATE_COMPLETE, observe sus salidas para determinar la URL del sitio de WordPress.

Ha utilizado CodePipeline con éxito para crear un flujo de trabajo de entrega continua para un sitio de WordPress de ejemplo. Si envía cambios al bucket de S3, CodePipeline detectará automáticamente la nueva versión y volverá a ejecutar la canalización. Este flujo de trabajo facilita el envío y la comprobación de los cambios antes de aplicarlos al sitio de producción.

Paso 4: limpie los recursos

Para asegurarse de que no se le cobra por servicios no deseados, elimine los recursos.

importante

Elimine las pilas de prueba y producción de WordPress antes de eliminar la pila de la canalización. La pila de la canalización contiene un rol de servicio necesario para eliminar las pilas de WordPress. Si ha eliminado primero la pila de la canalización, puede asociar el nombre de recurso de Amazon (ARN) de otro rol de servicio a las pilas de WordPress y, a continuación, eliminarlas.

Para eliminar objetos del almacén de artefactos
  1. Abra la consola de Amazon S3 en https://console.aws.amazon.com/s3/.

  2. Elija el bucket de S3 que CodePipeline ha utilizado como almacén de artefactos de la canalización.

    El nombre del bucket tiene este formato: stackname-artifactstorebucket-id. Si ha seguido este tutorial, el nombre del bucket puede ser similar al ejemplo siguiente: sample-WordPress-pipeline-artifactstorebucket-12345abcd12345.

  3. Elimine todos los objetos del bucket de S3 del almacén de artefactos.

    Al eliminar la pila de la canalización en el paso siguiente, el bucket debe estar vacío. De lo contrario, AWS CloudFormation no podrá eliminar el bucket.

Para eliminar pilas
  1. Desde la consola de AWS CloudFormation, elija la pila que desea eliminar.

    Si las pilas de WordPress creadas por la canalización siguen en ejecución, elíjalas en primer lugar. De forma predeterminada, los nombres de las pilas son Test-MyWordPressSite y Prod-MyWordPressSite.

    Si ya ha eliminado las pilas de WordPress, elija la pila sample-WordPress-pipeline.

  2. Elija Actions (Acciones) y, a continuación, elija Delete Stack (Eliminar pila).

  3. En el mensaje de confirmación, elija Yes, Delete (Sí, eliminar).

AWS CloudFormation elimina la pila y todos sus recursos, como la instancia de EC2, el tema de notificación, el rol de servicio y la canalización.

Ahora que sabe cómo crear un flujo de trabajo de AWS CloudFormation básico con CodePipeline, puede utilizar la plantilla y los artefactos de ejemplo como punto de partida para crear los suyos.

Véase también

Los recursos relacionados siguientes pueden serle de ayuda cuando trabaje con estos parámetros.

  • Para obtener más información sobre los parámetros de acción de AWS CloudFormation en CodePipeline, consulte la referencia de configuración de acciones de AWS CloudFormation en la Guía del usuario de AWS CodePipeline.

  • Para ver valores de plantilla de ejemplo según el proveedor de acción, como para el campo Owner o los campos configuration, consulte la Action structure reference (Referencia de estructura de acciones) en la Guía del usuario de AWS CodePipeline.

  • Para descargar las plantillas de la pila de canalización de ejemplo en formato YAML o JSON, consulte los tutoriales que se encuentran en Creación de una canalización con AWS CloudFormation en la Guía del usuario de AWS CodePipeline.

  • Para ver un archivo de configuración de la plantilla de ejemplo, consulte Artefactos de AWS CloudFormation.