Aktualisieren Sie ein Golden AMI mithilfe von Automation, AWS Lambda, und Parameter Store - AWS Systems Manager

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Aktualisieren Sie ein Golden AMI mithilfe von Automation, AWS Lambda, und Parameter Store

Im folgenden Beispiel wird das Modell verwendet, bei dem eine Organisation ihre eigenen, proprietären Systeme verwaltet und regelmäßig patcht, AMIs anstatt auf Amazon Elastic Compute Cloud (AmazonEC2) aufzubauenAMIs.

Das folgende Verfahren zeigt, wie Betriebssystem-Patches (OS) automatisch auf ein System angewendet werdenAMI, das bereits als die aktuellsten up-to-date oder aktuellsten giltAMI. In diesem Beispiel SourceAmiId wird der Standardwert des Parameters durch einen AWS Systems Manager Parameter Store Parameter definiert, der aufgerufen wirdlatestAmi. Der Wert von latestAmi wird durch eine AWS Lambda Funktion aktualisiert, die am Ende der Automatisierung aufgerufen wird. Durch diesen Automatisierungsprozess werden der Zeit- und Arbeitsaufwand für das Patchen minimiert, da AMIs das Patchen immer auf die meisten angewendet wird. up-to-date AMI Parameter Storeund Automatisierung sind Fähigkeiten von. AWS Systems Manager

Bevor Sie beginnen

Konfigurieren Sie Automatisierungsrollen und optional Amazon EventBridge for Automation. Weitere Informationen finden Sie unter Einrichten der Automatisierung.

Aufgabe 1: Erstellen eines Parameters im Systems Manager-Parameter Store

Erstellen Sie einen Zeichenfolgen-Parameter in Parameter Store, der die folgenden Informationen verwendet:

  • Name: latestAmi.

  • Value (Wert): Eine AMI-ID. Zum Beispiel: ami-188d6e0e.

Informationen zur Erstellung eines Parameter Store-Zeichenfolgenparameters finden Sie unter Erstellen von Systems Manager-Parametern.

Aufgabe 2: Erstellen Sie eine IAM Rolle für AWS Lambda

Gehen Sie wie folgt vor, um eine IAM Servicerolle für zu erstellen AWS Lambda. Diese Richtlinien erteilen Lambda die Berechtigung zum Aktualisieren des Werts des latestAmi-Parameters mithilfe einer Lambda-Funktion und von Systems Manager.

So erstellen Sie eine IAM Servicerolle für Lambda
  1. Melden Sie sich bei der an AWS Management Console und öffnen Sie die IAM Konsole unter https://console.aws.amazon.com/iam/.

  2. Wählen Sie im Navigationsbereich Policies (Richtlinien) und dann Create policy (Richtlinie erstellen).

  3. Wählen Sie die JSONRegisterkarte.

  4. Ersetzen Sie den Standardinhalt durch die folgende Richtlinie. Ersetze jeden example resource placeholder mit Ihren eigenen Informationen.

    { "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. Wählen Sie Weiter: Markierungen.

  6. (Optional) Fügen Sie ein oder mehrere Tag-Schlüssel-Wert-Paare hinzu, um den Zugriff für diese Richtlinie zu organisieren, zu verfolgen oder zu steuern.

  7. Wählen Sie Weiter: Prüfen aus.

  8. Geben Sie auf der Seite Review Policy (Richtlinie prüfen) im Feld Name (Name) einen Namen für die Inline-Richtlinie ein, z. B. amiLambda.

  9. Wählen Sie Create Policy (Richtlinie erstellen) aus.

  10. Wiederholen Sie die Schritte 2 und 3.

  11. Fügen Sie die folgende Richtlinie ein. Ersetze jedes example resource placeholder mit Ihren eigenen Informationen.

    { "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. Wählen Sie Weiter: Markierungen.

  13. (Optional) Fügen Sie ein oder mehrere Tag-Schlüssel-Wert-Paare hinzu, um den Zugriff für diese Richtlinie zu organisieren, zu verfolgen oder zu steuern.

  14. Wählen Sie Weiter: Prüfen aus.

  15. Geben Sie auf der Seite Review Policy (Richtlinie prüfen) im Feld Name (Name) einen Namen für die Inline-Richtlinie ein, z. B. amiParameter.

  16. Wählen Sie Create Policy (Richtlinie erstellen) aus.

  17. Wählen Sie im Navigationsbereich Roles (Rollen) und dann Create role (Rolle erstellen).

  18. Wählen Sie direkt unter Anwendungsfall die Option Lambda und dann Weiter aus.

  19. Suchen Sie auf der Seite Berechtigungsrichtlinien anfügen im Feld Suche die beiden Richtlinien, die Sie zuvor erstellt haben.

  20. Aktivieren Sie das Kontrollkästchen neben den Richtlinien und wählen Sie anschließend Weiter aus.

  21. Geben Sie unter Role name (Rollenname) einen Namen für Ihre neue Rolle, wie z. B. lambda-ssm-role, oder einen anderen von Ihnen bevorzugten Namen ein.

    Anmerkung

    Da möglicherweise verschiedene Entitäten auf die Rolle verweisen, kann der Rollenname nach der Erstellung nicht geändert werden.

  22. (Optional) Fügen Sie ein oder mehrere Tag-Schlüssel-Wert-Paare hinzu, um den Zugriff für diese Rolle zu organisieren, nachzuverfolgen oder zu steuern, und wählen Sie dann Rolle erstellen aus.

Aufgabe 3: Erstellen einer AWS Lambda -Funktion

Führen Sie die folgenden Schritte zum Erstellen einer Lambda-Funktion aus, die den Wert des latestAmi-Parameters automatisch aktualisiert.

Eine Lambda-Funktion erstellen
  1. Melden Sie sich bei an AWS Management Console und öffnen Sie die AWS Lambda Konsole unter https://console.aws.amazon.com/lambda/.

  2. Wählen Sie Funktion erstellen aus.

  3. Wählen Sie auf der Seite Create function die Option Author from scratch.

  4. Geben Sie für Function name (Funktionsname) Automation-UpdateSsmParam ein.

  5. Wählen Sie für Runtime (Laufzeit) die Option Python 3.8 aus.

  6. Wählen Sie unter Architektur den Computerprozessortyp aus, den Lambda zum Ausführen der Funktion verwenden soll, x86_64 oder arm64,

  7. Erweitern Sie im Abschnitt Berechtigungen die Option Standardausführungsrolle ändern.

  8. Wählen Sie Use an existing role (Vorhandene Rolle verwenden) aus und wählen Sie dann die Servicerolle für Lambda aus, die Sie in Aufgabe 2 erstellt haben.

  9. Wählen Sie Funktion erstellen aus.

  10. Löschen Sie im Bereich Code-Quelle in der Registerkarte lambda_function den vorab ausgefüllten Code im Feld und fügen Sie das folgende Codebeispiel ein.

    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. Klicken Sie auf Datei, Speichern.

  12. Um die Lambda-Funktion zu testen, wählen Sie im Menü Test die Option Testereignis konfigurieren aus.

  13. Geben Sie für Event name (Ereignisname) einen Namen für das Testereignis ein, z. B. MyTestEvent.

  14. Ersetzen Sie den vorhandenen Text durch den folgenden TextJSON. Ersetzen AMI ID mit Ihren eigenen Informationen, um Ihren latestAmi Parameterwert festzulegen.

    { "parameterName":"latestAmi", "parameterValue":"AMI ID" }
  15. Wählen Sie Save (Speichern) aus.

  16. Wählen Sie Test aus, um die Funktion zu testen. Auf der Registerkarte Ausführungsergebnis sollte der Status als Erfolgreich gemeldet werden, zusammen mit anderen Details zur Aktualisierung.

Aufgabe 4: Erstellen Sie ein Runbook und patchen Sie das AMI

Gehen Sie wie folgt vor, um ein Runbook zu erstellen und auszuführen, das den von AMI Ihnen für den latestAmiParameter angegebenen Fehler patcht. Nach Abschluss der Automatisierung latestAmiwird der Wert von mit der ID des neu AMI gepatchten Produkts aktualisiert. Bei nachfolgenden Automatisierungen verwenden Sie das AMI, das in der vorherigen Ausführung erstellt wurde.

Erstellen und Ausführen des Runbooks
  1. Öffnen Sie die Konsole unter AWS Systems Manager . https://console.aws.amazon.com/systems-manager/

  2. Wählen Sie im Navigationsbereich die Option Documents (Dokumente) aus.

  3. Wählen Sie für Dokument erstellen die Option Automatisierung aus.

  4. Geben Sie unter Name UpdateMyLatestWindowsAmi ein.

  5. Wählen Sie die Registerkarte Editor und wählen Sie Edit (Bearbeiten) aus.

  6. Wählen Sie bei Aufforderung OK aus.

  7. Ersetzen Sie im Feld Dokumenteditor den Standardinhalt durch den folgenden YAML Runbook-Beispielinhalt.

    --- 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. Wählen Sie Create automation (Automation erstellen).

  9. Wählen Sie im Navigationsbereich Automation (Automatisierung) und Execute automation (Automatisierung ausführen) aus.

  10. Wählen Sie auf der Seite Choose document (Dokument wählen), die Registerkarte Owned by me (In meinem Besitz).

  11. Suchen Sie nach dem UpdateMyLatestWindowsAmiRunbook und wählen Sie die Schaltfläche auf der UpdateMyLatestWindowsAmiKarte aus.

  12. Wählen Sie Weiter.

  13. Wählen Sie Simple execution (Einfache Ausführung) aus.

  14. Geben Sie Werte für die Eingabeparameter an.

  15. Wählen Sie Execute (Ausführen).

  16. Wählen Sie nach dem Abschluss der Automatisierung Parameter Store im Navigationsbereich und bestätigen Sie, dass der neue Wert für latestAmi-Treffer, die von der Automatisierung zurückgegeben werden. Sie können auch überprüfen, ob die neue AMI ID mit der Automation-Ausgabe im AMIsBereich der EC2 Amazon-Konsole übereinstimmt.