Tutorial: Utilice AWS CloudFormation Designer para modificar una plantilla de la pila - AWS CloudFormation

Tutorial: Utilice AWS CloudFormation Designer para modificar una plantilla de la pila

Puede utilizar AWS CloudFormation Designer para modificar fácilmente la plantilla de una pila y luego enviarla a AWS CloudFormation para actualizar la pila. Normalmente, cuando modifica una pila, debe obtener una copia de la plantilla, modificar la plantilla en un editor de texto y, a continuación, usar CloudFormation para actualizar la pila. Con AWS CloudFormation Designer puede obtener rápidamente una copia de la plantilla de cualquier pila en ejecución, modificarla y, a continuación, actualizar la pila sin salir de la consola.

En esta guía, vamos a empezar con una pila del servidor web básico que modificaremos después para que el servidor web sea escalable y duradero.

En este tutorial, realizaremos los siguientes pasos:

  1. Obtenga la plantilla de una pila.

    Nos pondremos una copia de una plantilla de pila, la misma pila del servidor web básico en la siguiente guía: Tutorial: procedimiento de creación de un servidor web básico con AWS CloudFormation Designer.

  2. Modifique la plantilla.

    Utilizaremos AWS CloudFormation Designer para modificar la plantilla de pila para que su sitio web sea escalable y duradero mediante la sustitución de la instancia de EC2 con un grupo de escalado automático y un equilibrador de carga de Elastic Load Balancing.

  3. Actualice la pila.

    Después de guardar las modificaciones, actualizaremos la pila del servidor web básico con la plantilla modificada.

    nota

    CloudFormation es un servicio gratuito; no obstante, se le cobrará por los recursos de AWS que incluya en sus pilas a la tarifa actual para cada uno. 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.

  4. Elimina la pila.

    Vamos a eliminar la pila para limpiar todos los recursos.

Requisitos previos

Esta explicación presupone que está familiarizado con Amazon Virtual Private Cloud (Amazon VPC), Auto Scaling, Elastic Load Balancing y CloudFormation. Cada procedimiento proporciona algo de información básica de contexto sobre cada recurso.

Además, la guía presupone que ha realizado el siguiente tutorial: Tutorial: procedimiento de creación de un servidor web básico con AWS CloudFormation Designer. Debería haber obtenido de aquel tutorial una pila en ejecución denominado BasicWebServerStack.

Paso 1: Obtenga una plantilla de pila

En este paso, usaremos AWS CloudFormation Designer para obtener y abrir una copia de una plantilla de pila.

Para obtener una copia de la plantilla de una pila en ejecución
  1. Abra la consola de CloudFormation en https://console.aws.amazon.com/cloudformation/.

  2. Desde la lista de pilas, seleccione BasicWebServerStack.

  3. Elija Actions (Acciones) y, a continuación, View/Edit template in Designer (Ver/Editar plantilla en Designer).

CloudFormation obtiene una copia de la plantilla de la pila de BasicWebServerStack y la muestra en AWS CloudFormation Designer, donde puede ver los recursos de plantilla y sus relaciones. En el siguiente paso, usaremos AWS CloudFormation Designer para modificar la plantilla.

Paso 2: Modifique una plantilla

Vamos a modificar la plantilla del servidor web básico usando la interfaz de arrastrar y colocar de AWS CloudFormation Designer y el editor de JSON y YAML integrado para sustituir la única instancia de Amazon EC2 con un grupo de escalado automático y un equilibrador de carga para hacer el sitio web escalable. Si el tráfico al sitio web aumenta de repente, utilice Auto Scaling para aumentar rápidamente los servidores web. El balanceador de carga distribuye equitativamente el tráfico entre las instancias.

Para modificar una plantilla de pila
  1. Extraiga el recurso WebServerInstance.

    1. Haga clic con el botón derecho en el recurso WebServerInstance.

    2. En el menú de recursos, elija Delete (Eliminar) ( ).

    3. Elija Aceptar para confirmar.

  2. En el panel Resource types (Tipos de recursos), añada los siguientes recursos al recurso PublicSubnet: AutoScalingGroup, LaunchConfiguration y LoadBalancer. Antes de incorporar recursos, es posible que necesite ampliar la subred para incluir todos los recursos.

    Los recursos están organizados por categorías de recursos. El grupo de Auto Scaling y la configuración de lanzamiento se encuentran en la categoría AutoScaling y el balanceador de carga en la categoría ElasticLoadBalancing.

    nota

    Estos recursos no siguen el modelo del contenedor, por lo que AWS CloudFormation Designer no los asocia automáticamente a la subred. Crearemos conexiones más adelante en este paso.

  3. En el panel Resource types (Tipos de recursos) en la categoría EC2, añada el recurso SecurityGroup en cualquier lugar de la VPC, salvo en la subred.

    Este grupo de seguridad controlará el tráfico entrante y saliente del balanceador de carga.

  4. Renombre los recursos para identificarlos más fácilmente:

    • Cambie el nombre AutoScalingGroup por WebServerFleet

    • Cambie el nombre LaunchConfiguration por WebServerLaunchConfig

    • Cambie el nombre LoadBalancer por PublicElasticLoadBalancer

    • Cambie el nombre SecurityGroup por PublicLoadBalancerSecurityGroup

  5. Cree asociaciones para los recursos añadidos.

    1. Asocie el balanceador de carga y los recursos del grupo Auto Scaling con la subred pública:

      • Desde el recurso PublicElasticLoadBalancer, arrastre la conexión AWS::EC2::Subnet (Property: Subnets) al recurso PublicSubnet.

      • Desde el recurso WebServerFleet, arrastre la conexión AWS::EC2::Subnet (Property: VPCZoneIdentifier) al recurso PublicSubnet.

    2. Asocie el balanceador de carga a su grupo de seguridad:

      • Desde el recurso PublicElasticLoadBalancer, arrastre la conexión AWS::EC2::SecurityGroup (Property: SecurityGroups) al recurso PublicLoadBalancerSecurityGroup.

    3. Asociar el grupo de Auto Scaling con el balanceador de carga y la configuración de lanzamiento:

      • Desde el recurso WebServerFleet, arrastre la conexión AWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames) al recurso PublicElasticLoadBalancer.

      • Desde el recurso WebServerFleet, arrastre la conexión AWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName) al recurso WebServerLaunchConfig.

    4. Asocie la configuración de lanzamiento al grupo de seguridad:

      • Desde el recurso WebServerLaunchConfig, arrastre la conexión AWS::EC2::SecurityGroup (Property: SecurityGroups) al recurso WebServerSecurityGroup.

    5. Defina una dependencia para el grupo de Auto Scaling a la ruta pública:

      • Desde el recurso WebServerFleet, arrastre la conexión DependsOn al recurso PublicRoute.

      Esta dependencia significa que CloudFormation no creará el recurso WebServerFleet hasta que se complete la ruta pública. De lo contrario, si la ruta pública no está disponible cuando inicien las instancias del servidor web, no podrán enviar señales (usando el script auxiliar cfn-signal) para informar a CloudFormation cuando sus configuraciones y las implementaciones de la aplicación se completen.

  6. Especifique las propiedades de los recursos que añada.

    1. En el lienzo de AWS CloudFormation Designer, elija el recurso de la PublicElasticLoadBalancer.

    2. En el panel del editor integrado, elija la pestaña Properties (Propiedades) y, a continuación, copie y pegue el siguiente fragmento de código entre las llaves ({}) de Properties (Propiedades).

      AWS CloudFormation Designer agregó automáticamente el grupo de seguridad y la asociación de subred, por lo que solo tiene que agregar las propiedades Listeners y HealthCheck. La propiedad Listeners especifica dónde y qué tipo de tráfico escuchar y la propiedad HealthCheck describe la configuración para determinar el estado de salud del balanceador de carga.

      JSON

      "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": "80", "Protocol": "HTTP" } ], "HealthCheck": { "Target": "HTTP:80/", "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "90", "Timeout": "60" }, "SecurityGroups": [ { "Ref": "PublicLoadBalancerSecurityGroup" } ], "Subnets": [ { "Ref": "PublicSubnet" } ]

      YAML

      Listeners: - LoadBalancerPort: '80' InstancePort: '80' Protocol: HTTP HealthCheck: Target: 'HTTP:80/' HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '90' Timeout: '60' SecurityGroups: - !Ref PublicLoadBalancerSecurityGroup Subnets: - !Ref PublicSubnet
    3. Repita este proceso para los siguientes recursos:

      WebServerFleet

      Añada las propiedades MaxSize, MinSize y DesiredCapacity. Estas propiedades especifican el número máximo y mínimo de instancias que puede lanzar en el grupo de Auto Scaling y el número inicial de instancias para empezar. El valor de la capacidad deseada se refiere a un nuevo parámetro, que vamos a añadir más adelante en este procedimiento.

      JSON

      "MinSize": "1", "MaxSize": "10", "DesiredCapacity": { "Ref": "WebServerCount" }, "VPCZoneIdentifier": [ { "Ref": "PublicSubnet" } ], "LaunchConfigurationName": { "Ref": "WebServerLaunchConfig" }, "LoadBalancerNames": [ { "Ref": "PublicElasticLoadBalancer" } ]

      YAML

      MinSize: '1' MaxSize: '10' DesiredCapacity: !Ref WebServerCount VPCZoneIdentifier: - !Ref PublicSubnet LaunchConfigurationName: !Ref WebServerLaunchConfig LoadBalancerNames: - !Ref PublicElasticLoadBalancer
      PublicLoadBalancerSecurityGroup

      Añada las siguientes reglas entrantes y salientes que determinan el tráfico que puede alcanzar y deje el balanceador de carga. Las reglas permiten que todo el tráfico HTTP alcance y deje el balanceador de carga.

      JSON

      "GroupDescription": "Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "SecurityGroupEgress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIp": "0.0.0.0/0" } ], "VpcId": { "Ref": "VPC" }

      YAML

      GroupDescription: >- Public Elastic Load Balancing security group with HTTP access on port 80 from the Internet SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 SecurityGroupEgress: - IpProtocol: tcp FromPort: 80 ToPort: 80 CidrIp: 0.0.0.0/0 VpcId: !Ref VPC
      WebServerSecurityGroup

      Modifique la regla entrante HTTP para permitir solo el tráfico entrante desde el balanceador de carga.

      JSON

      "GroupDescription": "Allow access from load balancer and SSH traffic", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "SourceSecurityGroupId": { "Ref": "PublicLoadBalancerSecurityGroup" } }, { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": { "Ref": "SSHLocation" } } ], "VpcId": { "Ref": "VPC" }

      YAML

      VpcId: !Ref VPC GroupDescription: Allow access from load balancer and SSH traffic SecurityGroupIngress: - IpProtocol: tcp FromPort: 80 ToPort: 80 SourceSecurityGroupId: !Ref PublicLoadBalancerSecurityGroup - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: !Ref SSHLocation
      WebServerLaunchConfig

      La configuración de lanzamiento tiene un número de diferentes propiedades que necesita especificar, por lo que solo vamos a destacar algunas. Las propiedades InstanceType y ImageId utilizan los valores de parámetro y mapeo que ya se hayan especificado en la plantilla. Especifique el tipo de instancia como valor de parámetro al crear una pila. El valor ImageId es una asignación que se basa en la región de su pila y el tipo de instancia que especificó.

      En la propiedad UserData, especifique los scripts de configuraciones que se ejecutan después de que la instancia se ponga en marcha. La información de configuración se define en los metadatos de la instancia, que añadiremos en el siguiente paso.

      JSON

      "InstanceType": { "Ref": "InstanceType" }, "ImageId": { "Fn::FindInMap": [ "AWSRegionArch2AMI", { "Ref": "AWS::Region" }, { "Fn::FindInMap": [ "AWSInstanceType2Arch", { "Ref": "InstanceType" }, "Arch" ] } ] }, "KeyName": { "Ref": "KeyName" }, "AssociatePublicIpAddress": "true", "UserData": { "Fn::Base64": { "Fn::Join": [ "", [ "#!/bin/bash -xe\n", "yum install -y aws-cfn-bootstrap\n", "# Install the files and packages from the metadata\n", "/opt/aws/bin/cfn-init -v ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerLaunchConfig ", " --configsets All ", " --region ", { "Ref": "AWS::Region" }, "\n", "# Signal the status from cfn-init\n", "/opt/aws/bin/cfn-signal -e $? ", " --stack ", { "Ref": "AWS::StackName" }, " --resource WebServerFleet ", " --region ", { "Ref": "AWS::Region" }, "\n" ] ] } }, "SecurityGroups": [ { "Ref": "WebServerSecurityGroup" } ]

      YAML

      InstanceType: !Ref InstanceType ImageId: !FindInMap - AWSRegionArch2AMI - !Ref 'AWS::Region' - !FindInMap - AWSInstanceType2Arch - !Ref InstanceType - Arch KeyName: !Ref KeyName AssociatePublicIpAddress: 'true' UserData: !Base64 'Fn::Join': - '' - - | #!/bin/bash -xe - | yum install -y aws-cfn-bootstrap - | # Install the files and packages from the metadata - '/opt/aws/bin/cfn-init -v ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerLaunchConfig ' - ' --configsets All ' - ' --region ' - !Ref 'AWS::Region' - |+ - | # Signal the status from cfn-init - '/opt/aws/bin/cfn-signal -e $? ' - ' --stack ' - !Ref 'AWS::StackName' - ' --resource WebServerFleet ' - ' --region ' - !Ref 'AWS::Region' - |+ SecurityGroups: - !Ref WebServerSecurityGroup
  7. Añada los metadatos de configuración de lanzamiento al recurso WebServerLaunchConfig, que indica al script auxiliar cfn-init que active el servidor web y cree una página web básica.

    1. Elija el recurso WebServerLaunchConfig y, a continuación, elija la pestaña Metadata (Metadatos) en el editor integrado.

    2. Si está creando la plantilla en JSON: en las llaves ({}) de Metadata, después de la llave de cierre AWS::CloudFormation::Designer, añada una coma (,).

    3. Agregue el siguiente fragmento, que indica al script auxiliar cfn-init para activar el servidor web y crear una página web básica, después de la propiedad AWS::CloudFormation::Designer.

      JSON

      "AWS::CloudFormation::Init" : { "configSets" : { "All" : [ "ConfigureSampleApp" ] }, "ConfigureSampleApp" : { "packages" : { "yum" : { "httpd" : [] } }, "files" : { "/var/www/html/index.html" : { "content" : { "Fn::Join" : ["\n", [ "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>" ]]}, "mode" : "000644", "owner" : "root", "group" : "root" } }, "services" : { "sysvinit" : { "httpd" : { "enabled" : "true", "ensureRunning" : "true" } } } } }

      YAML

      'AWS::CloudFormation::Init': configSets: All: - ConfigureSampleApp ConfigureSampleApp: packages: yum: httpd: [] files: /var/www/html/index.html: content: !Join - |+ - - >- <h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1> mode: '000644' owner: root group: root services: sysvinit: httpd: enabled: 'true' ensureRunning: 'true'
  8. Añada el parámetro WebServerCount. Este parámetro especifica cuántas instancias crear cuando CloudFormation crea el grupo de Auto Scaling.

    1. Seleccione una zona abierta en el lienzo de AWS CloudFormation Designer.

    2. En el panel del editor integrado, elija la pestaña Parameters (Parámetros).

    3. Añada el siguiente parámetro en editor integrado. Si la creación de la plantilla en JSON, añada una coma según sea necesario.

      JSON

      "WebServerCount": { "Description": "Number of Amazon EC2 instances to launch for the WebServer server", "Type": "Number", "Default": "1" }

      YAML

      WebServerCount: Description: Number of Amazon EC2 instances to launch for the WebServer server Type: Number Default: '1'
  9. Modifique la salida de la plantilla para mostrar el nombre de DNS del balanceador de carga.

    1. En el panel del editor integrado, elija la pestaña Outputs (Salidas).

    2. Modifique el JSON para utilizar el nombre de DNS del balanceador de carga, tal y como se muestra en el siguiente fragmento.

      JSON

      { "Outputs": { "URL": { "Value": { "Fn::GetAtt": [ "PublicElasticLoadBalancer", "DNSName" ] }, "Description": "Newly created application URL" } } }

      Si está creando la plantilla en YAML, utilice el siguiente fragmento.

      Outputs: URL: Value: !GetAtt - PublicElasticLoadBalancer - DNSName Description: Newly created application URL
  10. En la barra de herramientas de AWS CloudFormation Designer elija Validate template (Validar plantilla) ( ) para verificar errores de sintaxis en su plantilla.

    Vea y arregle errores en el panel Messages (Mensajes) y, a continuación, valide de nuevo la plantilla. Si no ve errores, su plantilla es válida desde el punto de vista sintáctico.

  11. En la barra de herramientas de AWS CloudFormation Designer, guarde la plantilla localmente. Para ello, elija File (Archivo) ( ) y, a continuación, Save (Guardar).

Ahora tiene una plantilla de CloudFormation modificada que puede utilizar para actualizar la pila del servidor web básico. En el siguiente paso, utilizaremos esta plantilla para actualizar la pila del servidor web básico.

Paso 3: Actualice la pila

Para implementar los cambios de la plantilla, necesitará actualizar la pila del servidor web básico. Puede lanzar el asistente de actualización de pilas de CloudFormation directamente desde AWS CloudFormation Designer.

Para actualizar la pila
  1. En la barra de herramientas de AWS CloudFormation Designer elija Create Stack (Crear pila) ( ).

    AWS CloudFormation Designer guarda la plantilla abierta en un bucket de S3 y, a continuación, lanza el asistente de actualización de pilas de CloudFormation. Como hemos modificado la plantilla de la pila de BasicWebServerStack, CloudFormation lanza el Update Stack Wizard para dicha pila.

  2. CloudFormation rellena automáticamente la URL de la plantilla; elija Next (Siguiente).

  3. En la sección Stack (Pila), en el campo Name (Nombre), compruebe que el nombre de la pila sea BasicWebServerStack.

  4. En la sección Parameters (Parámetros), utilice los valores existentes; elija Next (Siguiente).

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

  6. Asegúrese de que el nombre de la pila es correcto y, a continuación, elija Update (Actualizar).

CloudFormation puede tardar varios minutos en actualizar 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. Después de actualizar la pila, vea las salidas de pila y visite la URL del sitio web para comprobar que el sitio web está activo. Para obtener más información, consulte Visualización de recursos y datos de la pila de AWS CloudFormation en la AWS Management Console. Ha actualizado correctamente una plantilla y una pila con AWS CloudFormation Designer.

Para asegurarse de que no se le cobra por servicios no deseados, puede eliminar esta pila.

Paso 4: limpie los recursos

Para asegurarse de que no se le cobra por servicios no deseados, elimine la pila y sus recursos.

Para eliminar la pila
  1. En la consola de CloudFormation, elija la pila BasicWebServerStack.

  2. Elija Delete Stack.

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

CloudFormation puede tardar varios minutos en eliminar la pila. Para monitorizar el progreso, vea los eventos de la pila. Una vez que se elimine la pila, se eliminan todos los recursos que haya creado. Ahora que entiende cómo se usa AWS CloudFormation Designer, puede utilizarlo para crear y modificar sus propias plantillas.