Actualización de AMIs para grupos de escalado automático - AWS Systems Manager

Actualización de AMIs para grupos de escalado automático

En el ejemplo siguiente se actualiza un grupo de escalado automático con una AMI a la que recién se ha aplicado revisiones. Este enfoque garantiza que las nuevas imágenes se pongan automáticamente a disposición de los entornos informáticos que utilizan grupos de escalado automático

El paso final de la automatización en este ejemplo utiliza una función de Python para crear una nueva plantilla de lanzamiento que utiliza la AMI a la que recién se ha aplicado revisiones. A continuación, el grupo de escalado automático se actualiza para utilizar la nueva plantilla de lanzamiento. En este tipo de escenario de escalado automático, los usuarios podrían terminar las instancias existentes en el grupo de escalado automático para forzar el lanzamiento de una instancia nueva que utilice la nueva imagen. O los usuarios podrían esperar y permitir que los eventos de escala vertical y horizontal lancen instancias más recientes de forma natural.

Antes de empezar

Complete las tareas siguientes antes de comenzar este ejemplo.

  • Configure los roles de IAM para Automation, una capacidad de AWS Systems Manager. Systems Manager requiere un rol de perfil de instancia y un ARN de rol de servicio para procesar automatizaciones. Para obtener más información, consulte Configuración de Automation.

Crear el manual de procedimientos PatchAMIAndUpdateASG

Utilice el siguiente procedimiento para crear el manual de procedimientos PatchAMIAndUpdateASG que aplica revisiones a la AMI que especifica para el parámetro SourceAMI. El manual de procedimientos también actualiza un grupo de escalado automático para utilizar la última AMI a la que se ha aplicado revisiones.

Para crear y ejecutar el manual de procedimientos
  1. Abra la consola de AWS Systems Manager en https://console.aws.amazon.com/systems-manager/.

  2. En el panel de navegación, elija Documentos.

  3. En el menú desplegable Create document (Crear documento), seleccione Automation.

  4. En el campo Nombre, escriba PatchAMIAndUpdateASG.

  5. Seleccione la pestaña Editor (Editor) y elija Edit (Editar).

  6. Elija OK (Aceptar) cuando se le solicite y elimine el contenido en el campo Document editor (Editor de documentos).

  7. En el campo Document editor (Editor de documentos), pegue el siguiente contenido del manual de procedimientos YAML de muestra.

    --- description: Systems Manager Automation Demo - Patch AMI and Update ASG schemaVersion: '0.3' assumeRole: '{{ AutomationAssumeRole }}' parameters: AutomationAssumeRole: type: String description: '(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to execute this document.' default: '' SourceAMI: type: String description: '(Required) The ID of the AMI you want to patch.' SubnetId: type: String description: '(Required) The ID of the subnet where the instance from the SourceAMI parameter is launched.' SecurityGroupIds: type: StringList description: '(Required) The IDs of the security groups to associate with the instance launched from the SourceAMI parameter.' NewAMI: type: String description: '(Optional) The name of of newly patched AMI.' default: 'patchedAMI-{{global:DATE_TIME}}' TargetASG: type: String description: '(Required) The name of the Auto Scaling group you want to update.' InstanceProfile: type: String description: '(Required) The name of the IAM instance profile you want the source instance to use.' SnapshotId: type: String description: (Optional) The snapshot ID to use to retrieve a patch baseline snapshot. default: '' RebootOption: type: String description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.' allowedValues: - NoReboot - RebootIfNeeded default: RebootIfNeeded Operation: type: String description: (Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline. allowedValues: - Install - Scan default: Install mainSteps: - name: startInstances action: 'aws:runInstances' timeoutSeconds: 1200 maxAttempts: 1 onFailure: Abort inputs: ImageId: '{{ SourceAMI }}' InstanceType: m5.large MinInstanceCount: 1 MaxInstanceCount: 1 IamInstanceProfileName: '{{ InstanceProfile }}' SubnetId: '{{ SubnetId }}' SecurityGroupIds: '{{ SecurityGroupIds }}' - name: verifyInstanceManaged action: 'aws:waitForAwsResourceProperty' timeoutSeconds: 600 inputs: Service: ssm Api: DescribeInstanceInformation InstanceInformationFilterList: - key: InstanceIds valueSet: - '{{ startInstances.InstanceIds }}' PropertySelector: '$.InstanceInformationList[0].PingStatus' DesiredValues: - Online onFailure: 'step:terminateInstance' - name: installPatches action: 'aws:runCommand' timeoutSeconds: 7200 onFailure: Abort inputs: DocumentName: AWS-RunPatchBaseline Parameters: SnapshotId: '{{SnapshotId}}' RebootOption: '{{RebootOption}}' Operation: '{{Operation}}' InstanceIds: - '{{ startInstances.InstanceIds }}' - name: stopInstance action: 'aws:changeInstanceState' maxAttempts: 1 onFailure: Continue inputs: InstanceIds: - '{{ startInstances.InstanceIds }}' DesiredState: stopped - name: createImage action: 'aws:createImage' maxAttempts: 1 onFailure: Continue inputs: InstanceId: '{{ startInstances.InstanceIds }}' ImageName: '{{ NewAMI }}' NoReboot: false ImageDescription: Patched AMI created by Automation - name: terminateInstance action: 'aws:changeInstanceState' maxAttempts: 1 onFailure: Continue inputs: InstanceIds: - '{{ startInstances.InstanceIds }}' DesiredState: terminated - name: updateASG action: 'aws:executeScript' timeoutSeconds: 300 maxAttempts: 1 onFailure: Abort inputs: Runtime: python3.8 Handler: update_asg InputPayload: TargetASG: '{{TargetASG}}' NewAMI: '{{createImage.ImageId}}' Script: |- from __future__ import print_function import datetime import json import time import boto3 # create auto scaling and ec2 client asg = boto3.client('autoscaling') ec2 = boto3.client('ec2') def update_asg(event, context): print("Received event: " + json.dumps(event, indent=2)) target_asg = event['TargetASG'] new_ami = event['NewAMI'] # get object for the ASG we're going to update, filter by name of target ASG asg_query = asg.describe_auto_scaling_groups(AutoScalingGroupNames=[target_asg]) if 'AutoScalingGroups' not in asg_query or not asg_query['AutoScalingGroups']: return 'No ASG found matching the value you specified.' # gets details of an instance from the ASG that we'll use to model the new launch template after source_instance_id = asg_query.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId'] instance_properties = ec2.describe_instances( InstanceIds=[source_instance_id] ) source_instance = instance_properties['Reservations'][0]['Instances'][0] # create list of security group IDs security_groups = [] for group in source_instance['SecurityGroups']: security_groups.append(group['GroupId']) # create a list of dictionary objects for block device mappings mappings = [] for block in source_instance['BlockDeviceMappings']: volume_query = ec2.describe_volumes( VolumeIds=[block['Ebs']['VolumeId']] ) volume_details = volume_query['Volumes'] device_name = block['DeviceName'] volume_size = volume_details[0]['Size'] volume_type = volume_details[0]['VolumeType'] device = {'DeviceName': device_name, 'Ebs': {'VolumeSize': volume_size, 'VolumeType': volume_type}} mappings.append(device) # create new launch template using details returned from instance in the ASG and specify the newly patched AMI time_stamp = time.time() time_stamp_string = datetime.datetime.fromtimestamp(time_stamp).strftime('%m-%d-%Y_%H-%M-%S') new_template_name = f'{new_ami}_{time_stamp_string}' try: ec2.create_launch_template( LaunchTemplateName=new_template_name, LaunchTemplateData={ 'BlockDeviceMappings': mappings, 'ImageId': new_ami, 'InstanceType': source_instance['InstanceType'], 'IamInstanceProfile': { 'Arn': source_instance['IamInstanceProfile']['Arn'] }, 'KeyName': source_instance['KeyName'], 'SecurityGroupIds': security_groups } ) except Exception as e: return f'Exception caught: {str(e)}' else: # update ASG to use new launch template asg.update_auto_scaling_group( AutoScalingGroupName=target_asg, LaunchTemplate={ 'LaunchTemplateName': new_template_name } ) return f'Updated ASG {target_asg} with new launch template {new_template_name} which uses AMI {new_ami}.' outputs: - createImage.ImageId
  8. Elija Create automation (Crear automatización).

  9. En el panel de navegación, elija Automatización y, después, seleccione Ejecutar automatización.

  10. En la página Choose document (Elegir documento), seleccione la pestaña Owned by me (De mi propiedad).

  11. Busque el manual de procedimientos PatchAMIAndUpdateASG y seleccione el botón de la tarjeta PatchAMIAndUpdateASG.

  12. Elija Siguiente.

  13. Elija Simple execution (Ejecución sencilla).

  14. Especifique los valores de los parámetros de entrada. Asegúrese de que el SubnetId y SecurityGroupIds que especifica permitan el acceso a los puntos de conexión públicos de Systems Manager o a los puntos de conexión de la interfaz para Systems Manager.

  15. Elija Ejecutar.

  16. Una vez finalizada la automatización, en la consola de Amazon EC2, elija Auto Scaling y, a continuación, Launch Templates (Plantillas de lanzamiento). Verifique que ve la nueva plantilla de lanzamiento y que utiliza la nueva AMI.

  17. Seleccione Auto Scaling y, a continuación, Auto Scaling Groups (grupo de escalado automático). Verifique que el grupo de escalado automático utiliza la nueva plantilla de lanzamiento.

  18. Termine una o más instancias de su grupo de escalado automático. Las instancias de reemplazo se lanzarán con la nueva AMI.