Implementación de aplicaciones en Amazon EC2
Puede usar CloudFormation para instalar, configurar e iniciar automáticamente aplicaciones en instancias de Amazon EC2. Esto le permite duplicar fácilmente implementaciones y actualizar instalaciones existentes sin conectarse directamente a la instancia, lo que permite ahorrar mucho tiempo y esfuerzo.
CloudFormation incluye un conjunto de scripts auxiliares (cfn-init
, cfn-signal
, cfn-get-metadata
y cfn-hup
) que se basan en cloud-init
. Se llama a estos scripts auxiliares desde las plantillas de CloudFormation para instalar, configurar y actualizar aplicaciones en instancias Amazon EC2 que se encuentran en la misma plantilla. Para obtener más información, consulte Referencia de scripts auxiliares de CloudFormation en la Guía de referencia de plantillas de AWS CloudFormation.
En el tutorial de introducción, creó un servidor web sencillo utilizando UserData
con un script de bash básico. Si bien esto funcionó para una página sencilla de “Hello World”, las aplicaciones reales suelen necesitar una configuración más sofisticada, que incluya:
-
Varios paquetes de software instalados en el orden correcto.
-
Archivos de configuración complejos creados con contenido específico.
-
Servicios iniciados y configurados para iniciarse automáticamente.
-
Gestión de errores y validación del proceso de configuración.
Los scripts auxiliares de CloudFormation proporcionan una forma más sólida y sostenible de configurar las instancias de EC2 en comparación con los scripts de bash básicos en UserData
. El script auxiliar cfn-init
lee los datos de configuración de los metadatos de la plantilla y los aplica sistemáticamente a la instancia.
En este tutorial, aprenderá a utilizar el script auxiliar cfn-init
y a supervisar el proceso de arranque.
nota
CloudFormation es gratuito, pero se le cobrarán los recursos de Amazon EC2 que cree. Sin embargo, si es la primera vez que utiliza AWS, puede aprovechar el nivel gratuito
Temas
Requisitos previos
-
Debe haber completado el tutorial Creación de su primera pila o una experiencia equivalente con los conceptos básicos de CloudFormation.
-
Debe tener acceso a una Cuenta de AWS con un usuario o rol de IAM que tenga permisos para usar Amazon EC2 y CloudFormation, o acceso de usuario administrativo.
-
Debe tener una nube privada virtual (VPC) que tenga acceso a Internet. Esta plantilla de tutorial requiere una VPC predeterminada, que se incluye automáticamente con las Cuentas de AWS más recientes. Si no tiene una VPC predeterminada o si se ha eliminado, consulte la sección de solución de problemas en el tutorial Creación de su primera pila para ver soluciones alternativas.
Descripción de los conceptos de arranque
Vamos a describir los conceptos clave que hacen que el arranque funcione antes de crear la plantilla.
El script auxiliar cfn-init
CloudFormation proporciona scripts auxiliares de Python que puede utilizar para instalar software e iniciar servicios en una instancia de Amazon EC2. El script cfn-init
lee los metadatos de los recursos de su plantilla y aplica la configuración a su instancia.
El proceso funciona de la siguiente manera:
-
Define la configuración en la sección
Metadata
de su recurso de EC2. -
Llama a
cfn-init
desde el scriptUserData
. -
cfn-init
lee los metadatos y aplica la configuración. -
La instancia se configura de acuerdo con sus especificaciones.
Estructura de los metadatos
La configuración se define en una estructura específica dentro de su instancia de EC2.
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: # Metadata section for the resource AWS::CloudFormation::Init: # Required key that cfn-init looks for config: # Configuration name (you can have multiple) packages: # Install packages files: # Create files commands: # Run commands services: # Start/stop services
El script cfn-init
procesa estas secciones en un orden específico: paquetes, grupos, usuarios, orígenes, archivos, comandos y, a continuación, servicios.
Inicio con un ejemplo sencillo de arranque
Comencemos con un ejemplo mínimo de arranque que simplemente instale e inicie Apache.
Resources: EC2Instance: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: # Install Apache web server yum: httpd: [] services: # Start Apache and enable it to start on boot sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType UserData: !Base64 # Script that runs when instance starts Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource EC2Instance --region ${AWS::Region}
En este ejemplo sencillo se ilustran los conceptos básicos:
-
La sección
packages
instala el paquetehttpd
usando yum. Esto funciona en Amazon Linux y en otras distribuciones de Linux que utilizan yum. -
La sección
services
garantiza quehttpd
se inicie y ejecute automáticamente. -
UserData
instala las herramientas de arranque más recientes y llama acfn-init
.
Cómo agregar archivos y comandos
Ahora, para mejorar nuestro ejemplo, vamos a agregar una página web personalizada y un archivo de registro en el directorio /var/log
de la instancia de EC2.
Creación de archivos
La sección files
le permite crear archivos en la instancia con contenido específico. La barra vertical (|
) le permite pasar un bloque literal de texto (código HTML) como contenido del archivo (/var/www/html/index.html
).
files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body>
Ejecución de comandos
La sección commands
le permite ejecutar comandos del intérprete de comandos durante el proceso de arranque. Este comando crea un archivo de registro en /var/log/welcome.txt
en la instancia de EC2. Para verlo, necesita un par de claves de Amazon EC2 que utilizará para el acceso mediante SSH y un rango de direcciones IP que se pueda utilizar para acceder mediante SSH a la instancia (no se trata aquí).
commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt"
Cómo agregar la seguridad a la red
Como vamos a configurar un servidor web, debemos permitir que el tráfico web (HTTP) llegue a nuestra instancia de EC2. Para ello, crearemos un grupo de seguridad que permita el tráfico entrante en el puerto 80 desde su dirección IP. Las instancias de EC2 también tienen que enviar tráfico a Internet, por ejemplo, para instalar actualizaciones de paquetes. De forma predeterminada, los grupos de seguridad permiten el tráfico saliente. A continuación, asociaremos este grupo de seguridad a nuestra instancia de EC2 mediante la propiedad SecurityGroupIds
.
WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP
La plantilla de arranque completa
Ahora vamos a juntar todas las partes. Esta es la plantilla completa en la que se combinan todos los conceptos que hemos tratado.
AWSTemplateFormatVersion: 2010-09-09 Description: Bootstrap an EC2 instance with Apache web server using cfn-init Parameters: LatestAmiId: Description: The latest Amazon Linux 2 AMI from the Parameter Store Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>' Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2' InstanceType: Description: EC2 instance type Type: String Default: t2.micro AllowedValues: - t3.micro - t2.micro ConstraintDescription: must be a valid EC2 instance type. MyIP: Description: Your IP address in CIDR format (e.g. 203.0.113.1/32) Type: String MinLength: 9 MaxLength: 18 Default: 0.0.0.0/0 AllowedPattern: '^(\d{1,3}\.){3}\d{1,3}\/\d{1,2}$' ConstraintDescription: must be a valid IP CIDR range of the form x.x.x.x/x. Resources: WebServerSecurityGroup: Type: AWS::EC2::SecurityGroup Properties: GroupDescription: Allow HTTP access from my IP address SecurityGroupIngress: - IpProtocol: tcp Description: HTTP FromPort: 80 ToPort: 80 CidrIp: !Ref MyIP WebServer: Type: AWS::EC2::Instance Metadata: AWS::CloudFormation::Init: config: packages: yum: httpd: [] files: /var/www/html/index.html: content: | <body> <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> </body> commands: createWelcomeLog: command: "echo 'cfn-init ran successfully!' > /var/log/welcome.txt" services: sysvinit: httpd: enabled: true ensureRunning: true Properties: ImageId: !Ref LatestAmiId InstanceType: !Ref InstanceType SecurityGroupIds: - !Ref WebServerSecurityGroup UserData: !Base64 Fn::Sub: | #!/bin/bash yum install -y aws-cfn-bootstrap /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource WebServer --region ${AWS::Region} Tags: - Key: Name Value: Bootstrap Tutorial Web Server Outputs: WebsiteURL: Value: !Sub 'http://${WebServer.PublicDnsName}' Description: EC2 instance public DNS name
Creación de la pila con la consola
El siguiente procedimiento implica cargar la plantilla de pila de ejemplo desde un archivo. Abra un editor de texto en su equipo local y agregue la plantilla. Guarde el archivo con el nombre samplelinux2stack.template
.
Para lanzar la plantilla de pila
-
Inicie sesión en la AWS Management Console y abra la consola de AWS CloudFormation en https://console.aws.amazon.com/cloudformation
. -
Elija Create stack (Crear pila), With new resources (standard) (Con nuevos recursos [estándar]).
-
En (Especificar plantilla, seleccione Actualizar un archivo de plantilla y, a continuación, elija Elegir archivo para cargar el archivo
samplelinux2stack.template
. -
Elija Siguiente.
-
En la página Especificar los detalles de la pila, ingrese
BootstrapTutorialStack
como nombre de la pila. -
En Parámetros, haga lo siguiente.
-
LatestAmiId: deje el valor predeterminado.
-
InstanceType: elija t2.micro o t3.micro para el tipo de instancia de EC2.
-
MyIP: ingrese su dirección IP pública real con el sufijo
/32
.
-
-
Elija Siguiente dos veces y, luego, Enviar para crear la pila.
Supervisión del proceso de arranque
Los procesos de arranque tardan más que los lanzamientos sencillos de EC2 porque se instala y configura software adicional.
Supervisión del progreso del arranque
-
En la consola de CloudFormation, seleccione su pila y abra la pestaña Eventos.
-
Preste atención al evento
WebServer CREATE_IN_PROGRESS
. El proceso de arranque comienza después del lanzamiento de la instancia. -
El proceso de arranque normalmente dura unos minutos. Verá
WebServer CREATE_COMPLETE
cuando haya terminado.
Si quiere ver lo que ocurre durante el proceso de arranque, puede consultar los registros de la instancia.
Visualización de los registros de arranque (opcional)
-
Abra la consola de EC2
y busque su instancia. -
Seleccione la instancia y, luego, elija Acciones, Monitoreo y solución de problemas, Obtener registro del sistema para ver el progreso del arranque.
-
Si no ve los registros inmediatamente, espere y actualice la página.
Prueba del servidor web arrancado
Cuando la pila muestre CREATE_COMPLETE
, pruebe su servidor web.
Prueba del servidor web
-
En la consola de CloudFormation, vaya a la pestaña Salidas de su pila.
-
Haga clic en el valor de WebsiteURL para abrir su servidor web en una pestaña nueva.
-
Debería ver la página web personalizada con el mensaje
Congratulations, you have successfully launched the AWS CloudFormation sample
.
nota
Si la página no se carga inmediatamente, espere un minuto e inténtelo de nuevo. Es posible que el proceso de arranque aún se esté completando incluso después de que la pila muestre CREATE_COMPLETE
.
Solución de problemas de arranque
Si el proceso de arranque falla o el servidor web no funciona, aquí tiene algunos problemas y soluciones comunes.
Problemas comunes
-
No se puede crear la pila: consulte la pestaña Eventos para ver mensajes de error específicos.
-
No se puede acceder al servidor web: compruebe que la dirección IP sea correcta en el parámetro
MyIP
. Recuerde incluir/32
al final. -
No se puede completar el proceso de arranque: es posible que la instancia se lance, pero
cfn-init
falla. Compruebe los registros del sistema tal como se describe en la sección de supervisión.
Eliminar recursos
Para evitar cargos continuos, puede llevar a cabo una limpieza eliminando la pila y sus recursos.
Eliminación de la pila y sus recursos
-
Abra la Consola de CloudFormation
. -
En la página Pilas, seleccione la opción situada junto al nombre de la pila que ha creado (
BootstrapTutorialStack
) y, a continuación, seleccione Eliminar. -
Cuando se le pida confirmación, seleccione Eliminar.
-
Supervise el progreso del proceso de eliminación de la pila en la pestaña Evento. El estado de
BootstrapTutorialStack
cambia aDELETE_IN_PROGRESS
. Cuando CloudFormation completa la eliminación de la pila, quita la pila de la lista.
Pasos a seguir a continuación
¡Enhorabuena! Ha aprendido correctamente a arrancar instancias de EC2 con CloudFormation. Ahora sabe:
-
Cómo usar los scripts auxiliares de
cfn-init
. -
Cómo estructurar los metadatos para el arranque.
-
Cómo instalar paquetes, crear archivos, ejecutar comandos y administrar servicios.
-
Cómo supervisar si se producen problemas de arranque.
Para seguir aprendiendo:
-
Aprenda a arrancar una pila de Windows. Para obtener más información, consulte Arranque de pilas de CloudFormation basadas en Windows.
-
Explore escenarios de arranque más complejos con varios conjuntos de configuración. Para obtener más información, consulte cfn-init y AWS::CloudFormation::Init en la Guía de referencia de plantillas de AWS CloudFormation.
-
Obtenga información sobre cómo usar
cfn-signal
para informar sobre el estado de finalización del arranque. Para obtener más información, consulte cfn-signal en la Guía de referencia de plantillas de AWS CloudFormation.