Aggiorna un golden AMI usando Automation AWS Lambda, e Parameter Store - 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à.

Aggiorna un golden AMI usando Automation AWS Lambda, e Parameter Store

L'esempio seguente utilizza il modello in cui un'organizzazione mantiene e aggiorna periodicamente le proprie patch proprietarie AMIs anziché basate su Amazon Elastic Compute Cloud (Amazon). EC2 AMIs

La procedura seguente mostra come applicare automaticamente le patch del sistema operativo (OS) a un sistema AMI che è già considerato la più recente o la più recente. up-to-date AMI Nell'esempio, il valore predefinito del parametro SourceAmiId è definito da un AWS Systems Manager Parameter Store parametro chiamatolatestAmi. Il valore di latestAmi viene aggiornato da una AWS Lambda funzione richiamata alla fine dell'automazione. Come risultato di questo processo di automazione, il tempo e l'impegno dedicati all'applicazione delle patch AMIs sono ridotti al minimo perché l'applicazione delle patch viene sempre applicata alla maggior parte. up-to-date AMI Parameter Storee l'automazione sono funzionalità di. AWS Systems Manager

Prima di iniziare

Configura i ruoli di automazione e, facoltativamente, Amazon EventBridge for Automation. Per ulteriori informazioni, consulta Configurazione del servizio di automazione.

Processo 1: creazione di un parametro nel Parameter Store di Systems Manager

In Parameter Store creare un parametro di stringa che utilizza le seguente informazioni:

  • Nome (Nome): latestAmi.

  • Valore: Un ID AMI. Ad esempio: ami-188d6e0e.

Per informazioni su come creare un parametro di stringa di Parameter Store, consulta Creazione Parameter Store parametri in Systems Manager.

Attività 2: creare un IAM ruolo per AWS Lambda

Utilizzare la procedura seguente per creare un ruolo IAM di servizio per AWS Lambda. Queste policy forniscono l'autorizzazione a Lambda per aggiornare il valore del parametro latestAmi utilizzando una funzione Lambda e Systems Manager.

Per creare un ruolo IAM di servizio per Lambda
  1. Accedi a AWS Management Console e apri la IAM console all'indirizzo https://console.aws.amazon.com/iam/.

  2. Nel riquadro di navigazione, seleziona Policy e quindi Crea policy.

  3. Scegli la JSONscheda.

  4. Sostituisci il contenuto predefinito con la seguente policy. Sostituisci ciascuno example resource placeholder con le tue informazioni.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:region:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:123456789012:log-group:/aws/lambda/function name:*" ] } ] }
  5. Scegli Successivo: Tag.

  6. (Facoltativo) Aggiungere una o più coppie tag chiave-valore per organizzare, monitorare o controllare l'accesso per questa policy.

  7. Scegli Prossimo: Rivedi.

  8. Nella pagina Review policy (Rivedi policy), per l'opzione Name (Nome) specificare un nome per la policy inline, ad esempio amiLambda.

  9. Scegli Create Policy (Crea policy).

  10. Ripetere le fasi 2 e 3.

  11. Quindi incollare la policy seguente. Sostituisci ciascuno example resource placeholder con le tue informazioni.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:region:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  12. Scegli Successivo: Tag.

  13. (Facoltativo) Aggiungere una o più coppie tag chiave-valore per organizzare, monitorare o controllare l'accesso per questa policy.

  14. Scegli Prossimo: Rivedi.

  15. Nella pagina Review policy (Rivedi policy), per l'opzione Name (Nome) specificare un nome per la policy inline, ad esempio amiParameter.

  16. Scegli Create Policy (Crea policy).

  17. Nel pannello di navigazione, scegliere Roles (Ruoli) e quindi Create role (Crea ruolo).

  18. In Caso d'uso, scegli Lambda, quindi scegli Successivo.

  19. Nella pagina Collega autorizzazioni, utilizza il campo Cerca per individuare le due policy create in precedenza.

  20. Seleziona la casella di controllo accanto alle policy, quindi scegli Successivo: Tag.

  21. Per Role name (Nome ruolo), inserire un nome per il nuovo ruolo, ad esempio lambda-ssm-role o un altro nome che preferisci.

    Nota

    Poiché varie entità possono fare riferimento al ruolo, non è possibile modificare il nome del ruolo dopo averlo creato.

  22. (Facoltativo) Aggiungi una o più coppie di tag chiave-valore per organizzare, monitorare o controllare l'accesso per questo ruolo, quindi scegli Crea ruolo.

Processo 3: creazione di una funzione AWS Lambda

Utilizzare la procedura seguente per creare una funzione Lambda che aggiorna automaticamente il valore del parametro latestAmi.

Per creare una funzione Lambda
  1. Accedi a AWS Management Console e apri la AWS Lambda console all'indirizzo https://console.aws.amazon.com/lambda/.

  2. Scegli Crea funzione.

  3. Nella pagina Create function (Crea funzione), scegliere Author from scratch (Crea da zero).

  4. Nel campo Function name (Nome funzione), immettere Automation-UpdateSsmParam.

  5. In Runtime, scegliere Python 3.8.

  6. Per Architettura, seleziona il tipo di processore del computer che Lambda deve utilizzare per eseguire la funzione, x86_64 o arm64.

  7. Nella sezione Autorizzazioni, espandi Modifica ruolo di esecuzione predefinito.

  8. Scegliere Use an existing role (Usa un ruolo esistente), quindi scegliere il ruolo di servizio creato per Lambda nel processo 2.

  9. Scegli Crea funzione.

  10. Nella sezione Origine codice, nella scheda lambda_function, elimina il codice precompilato nel campo, quindi incolla il seguente codice di esempio.

    from __future__ import print_function import json import boto3 print('Loading function') #Updates an SSM parameter #Expects parameterName, parameterValue def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get SSM client client = boto3.client('ssm') #confirm parameter exists before updating it response = client.describe_parameters( Filters=[ { 'Key': 'Name', 'Values': [ event['parameterName'] ] }, ] ) if not response['Parameters']: print('No such parameter') return 'SSM parameter not found.' #if parameter has a Description field, update it PLUS the Value if 'Description' in response['Parameters'][0]: description = response['Parameters'][0]['Description'] response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Description=description, Type='String', Overwrite=True ) #otherwise just update Value else: response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Type='String', Overwrite=True ) responseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue']) return responseString
  11. Scegli File, Salva.

  12. Per testare la funzione Lambda, dal menu Test scegli Configura evento di test.

  13. Nel campo Event name (Nome evento), inserire un nome per l'evento di test, ad esempio MyTestEvent.

  14. Sostituisci il testo esistente con quanto segueJSON. Replace (Sostituisci) AMI ID con le tue informazioni per impostare il valore latestAmi del parametro.

    { "parameterName":"latestAmi", "parameterValue":"AMI ID" }
  15. Seleziona Salva.

  16. Scegliere Test per testare la funzione. Nella scheda Risultato dell'esecuzione, lo stato deve essere riportato come Completato, insieme ad altri dettagli sull'aggiornamento.

Attività 4: Creare un runbook e applicare una patch al AMI

Utilizzare la procedura seguente per creare ed eseguire un runbook che applichi le patch AMI specificate per il parametro. latestAmi Al termine dell'automazione, il valore di latestAmiviene aggiornato con l'ID della nuova patch. AMI Le automazioni successive utilizzano l'AMI creata dall'esecuzione precedente.

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

  2. Nel riquadro di navigazione, scegli Documenti.

  3. Per Crea documento, scegli Automazione.

  4. Per Nome, immetti UpdateMyLatestWindowsAmi.

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

  6. Scegli OK quando richiesto.

  7. Nel campo Document Editor, sostituisci il contenuto predefinito con il seguente contenuto del runbook di YAML esempio.

    --- 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: The ID of the AMI you want to patch. default: '{{ ssm:latestAmi }}' SubnetId: type: String description: The ID of the subnet where the instance from the SourceAMI parameter is launched. SecurityGroupIds: type: StringList description: The IDs of the security groups to associate with the instance that's launched from the SourceAMI parameter. NewAMI: type: String description: The name of of newly patched AMI. default: 'patchedAMI-{{global:DATE_TIME}}' InstanceProfile: type: String description: 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: updateSsmParam action: aws:invokeLambdaFunction timeoutSeconds: 1200 maxAttempts: 1 onFailure: Abort inputs: FunctionName: Automation-UpdateSsmParam Payload: '{"parameterName":"latestAmi", "parameterValue":"{{createImage.ImageId}}"}' 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 UpdateMyLatestWindowsAmirunbook e seleziona il pulsante nella UpdateMyLatestWindowsAmischeda.

  12. Scegliere Next (Successivo).

  13. Scegliere Simple execution (Esecuzione semplice).

  14. Specifica i valori per il parametro di input.

  15. Scegliere Execute (Esegui).

  16. Una volta completata l'esecuzione, scegliere Parameter Store nel pannello di navigazione e confermare che il nuovo valore del parametro latestAmi corrisponde al valore restituito dall'automazione. Puoi anche verificare che il nuovo AMI ID corrisponda all'output di Automation nella AMIssezione della EC2 console Amazon.