Uso del Diseñador de AWS CloudFormation para modificar una plantilla de la pila
nota
Infrastructure Composer en modo consola de CloudFormation es una mejora respecto al Diseñador de AWS CloudFormation. Recomendamos utilizar Infrastructure Composer en lugar de Designer siempre que sea posible. Para obtener más información, consulte Creación de plantillas visualmente con Infrastructure Composer.
Puede utilizar el Diseñador de AWS CloudFormation para modificar la plantilla de una pila de manera sencilla 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:
-
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: Uso del Diseñador de AWS CloudFormation para crear un servidor web básico.
-
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.
-
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
. -
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: Uso del Diseñador de AWS CloudFormation para crear un servidor web básico. 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.
Obtención de una copia de la plantilla de una pila en ejecución
-
Abra la consola de CloudFormation en https://console.aws.amazon.com/cloudformation/
. -
Desde la lista de pilas, seleccione
BasicWebServerStack
. -
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
-
Extraiga el recurso
WebServerInstance
.-
Haga clic con el botón derecho en el recurso
WebServerInstance
. -
En el menú de recursos, elija Eliminar (icono de basura).
-
Elija Aceptar para confirmar.
-
-
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.
-
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.
-
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
-
-
Cree asociaciones para los recursos añadidos.
-
Asocie el balanceador de carga y los recursos del grupo Auto Scaling con la subred pública:
-
Desde el recurso
PublicElasticLoadBalancer
, arrastre la conexiónAWS::EC2::Subnet (Property: Subnets)
al recursoPublicSubnet
. -
Desde el recurso
WebServerFleet
, arrastre la conexiónAWS::EC2::Subnet (Property: VPCZoneIdentifier)
al recursoPublicSubnet
.
-
-
Asocie el balanceador de carga a su grupo de seguridad:
-
Desde el recurso
PublicElasticLoadBalancer
, arrastre la conexiónAWS::EC2::SecurityGroup (Property: SecurityGroups)
al recursoPublicLoadBalancerSecurityGroup
.
-
-
Asociar el grupo de Auto Scaling con el balanceador de carga y la configuración de lanzamiento:
-
Desde el recurso
WebServerFleet
, arrastre la conexiónAWS::ElasticLoadBalancing::LoadBalancer (Property: LoadBalancerNames)
al recursoPublicElasticLoadBalancer
. -
Desde el recurso
WebServerFleet
, arrastre la conexiónAWS::ElasticLoadBalancing::LaunchConfiguration (Property: LaunchConfigurationName)
al recursoWebServerLaunchConfig
.
-
-
Asocie la configuración de lanzamiento al grupo de seguridad:
-
Desde el recurso
WebServerLaunchConfig
, arrastre la conexiónAWS::EC2::SecurityGroup (Property: SecurityGroups)
al recursoWebServerSecurityGroup
.
-
-
Defina una dependencia para el grupo de Auto Scaling a la ruta pública:
-
Desde el recurso
WebServerFleet
, arrastre la conexiónDependsOn
al recursoPublicRoute
.
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. -
-
-
Especifique las propiedades de los recursos que añada.
-
En el lienzo de AWS CloudFormation Designer, elija el recurso de la
PublicElasticLoadBalancer
. -
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
yHealthCheck
. La propiedadListeners
especifica dónde y qué tipo de tráfico escuchar y la propiedadHealthCheck
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
-
Repita este proceso para los siguientes recursos:
WebServerFleet
-
Añada las propiedades
MaxSize
,MinSize
yDesiredCapacity
. 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
yImageId
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 valorImageId
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
-
-
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.-
Elija el recurso
WebServerLaunchConfig
y, a continuación, elija la pestaña Metadata (Metadatos) en el editor integrado. -
Si está creando la plantilla en JSON: en las llaves (
{}
) deMetadata
, después de la llave de cierreAWS::CloudFormation::Designer
, añada una coma (,
). -
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'
-
-
Añada el parámetro
WebServerCount
. Este parámetro especifica cuántas instancias crear cuando CloudFormation crea el grupo de Auto Scaling.-
Seleccione una zona abierta en el lienzo de AWS CloudFormation Designer.
-
En el panel del editor integrado, elija la pestaña Parameters (Parámetros).
-
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'
-
-
Modifique la salida de la plantilla para mostrar el nombre de DNS del balanceador de carga.
-
En el panel del editor integrado, elija la pestaña Outputs (Salidas).
-
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
-
-
En la barra de herramientas de AWS CloudFormation Designer, seleccione Validar plantilla (icono de casilla de verificación) para verificar los 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.
-
En la barra de herramientas de AWS CloudFormation Designer, guarde la plantilla localmente. Para ello, seleccione el menú Archivo (icono de una carpeta) y, a continuación, 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
-
En la barra de herramientas de AWS CloudFormation Designer, seleccione Crear pila (icono de una flecha hacia arriba).
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. -
CloudFormation rellena automáticamente la URL de la plantilla; elija Next (Siguiente).
-
En la sección Stack (Pila), en el campo Name (Nombre), compruebe que el nombre de la pila sea
BasicWebServerStack
. -
En la sección Parameters (Parámetros), utilice los valores existentes; elija Next (Siguiente).
-
Para este tutorial, no tiene que añadir etiquetas ni especificar una configuración avanzada, así que elija Next (Siguiente).
-
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 la información de la pila desde la consola de CloudFormation. 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 la información de la pila desde la consola de CloudFormation. 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
-
En la consola de CloudFormation, elija la pila BasicWebServerStack.
-
Elija Delete Stack.
-
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.