Aggiornamento delle AMIs per i gruppi con scalabilità automatica - AWS Systems Manager

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Aggiornamento delle AMIs per i gruppi con scalabilità automatica

Nell'esempio seguente aggiorna un gruppo con scalabilità automatica con una nuova AMI con patch applicate. Questo approccio garantisce che le nuove immagini vengano automaticamente rese disponibili nei vari ambienti di calcolo che usano gruppi con scalabilità automatica.

La fase finale dell'automazione in questo esempio utilizza una funzione Python per creare un nuovo modello di avvio che utilizza la nuova AMI con patch applicate. Quindi il gruppo con scalabilità automatica è aggiornato per utilizzare il nuovo modello di avvio. In questo tipo di scenario con scalabilità automatica, gli utenti possono terminare le istanze esistenti nel gruppo con scalabilità automatica per forzare l'avvio di una nuova istanza che utilizza la nuova immagine. In alternativa, gli utenti possono attendere che siano gli eventi di scalabilità verticale o orizzontale ad avviare le istanze più recenti.

Prima di iniziare

Prima di iniziare a utilizzare questo esempio, completare le attività descritte di seguito.

  • Configurare i ruoli IAM per il servizio di automazione, una funzionalità di AWS Systems Manager. Systems Manager richiede un ruolo del profilo dell'istanza e un ARN del ruolo di servizio per elaborare le automazioni. Per ulteriori informazioni, consulta Configurazione del servizio di automazione.

Creazione del runbook PatchAMIAndUpdateASG

Utilizza la procedura seguente per creare il runbook PatchAMIAndUpdateASG che applica le patch all’AMI che specifichi per il parametro SourceAMI. Il runbook aggiorna anche un gruppo con scalabilità automatica utilizzando l'AMI con patch applicate più recente.

Per creare ed eseguire il runbook
  1. Aprire la console di AWS Systems Manager all'indirizzo https://console.aws.amazon.com/systems-manager/.

  2. Nel pannello di navigazione, scegliere Documents (Documenti).

    oppure

    Se la homepage di AWS Systems Manager si apre per prima, scegliere l'icona del menu ( 
    The menu icon
  ) per aprire il pannello di navigazione, quindi scegliere Documents (Documenti) nel pannello di navigazione.

  3. Nel menu a disces Create document (Crea un documento), scegliere Automation (Automazione).

  4. Nel campo Name (Nome), inserire PatchAMIAndUpdateASG.

  5. Scegliere la scheda Editor, quindi Edit (Modifica).

  6. Scegliere OK quando richiesto ed eliminare il contenuto nel campo Document editor (Editor di documenti).

  7. Nel campo Document editor (Editor di documenti) incollare il seguente contenuto del runbook di esempio YAML.

    --- 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. Scegliere Create automation (Crea automazione).

  9. Nel pannello di navigazione, scegliere Automation (Automazione), quindi Execute automation (Esegui automazione).

  10. Nella pagina Choose document (Scegli il documento), scegli la scheda Owned by me (Di mia proprietà).

  11. Cerca il runbook PatchAMIAndUpdateASG e seleziona il pulsante nella scheda PatchAMIAndUpdateASG.

  12. Seleziona Successivo.

  13. Scegliere Simple execution (Esecuzione semplice).

  14. Specifica i valori per il parametro di input. Assicurarsi che SubnetId e SecurityGroupIds da te specificati consentano l'accesso agli endpoint pubblici di Systems Manager o agli endpoint dell'interfaccia per Systems Manager.

  15. Scegliere Execute (Esegui).

  16. Una volta completata l'automazione, nella console di Amazon EC2 scegliere Auto Scaling, quindi scegliere Launch Templates (Modelli di avvio). Controllare che il nuovo modello di avvio sia visualizzato e utilizzato dalla nuova AMI.

  17. Scegliere Auto Scaling, quindi scegliere Auto Scaling Groups (Gruppi con scalabilità automatica). Verificare che il gruppo con scalabilità automatica utilizzi il nuovo modello di avvio.

  18. Terminare una o più istanze nel gruppo con scalabilità automatica. Le istanze di sostituzione verranno avviate utilizzando la nuova AMI.