Exemplarische Vorgehensweise: Suchen Sie nach AMI-IDs mit einer Lambda-gestützten benutzerdefinierten Ressource - AWS CloudFormation

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.

Exemplarische Vorgehensweise: Suchen Sie nach AMI-IDs mit einer Lambda-gestützten benutzerdefinierten Ressource

Diese exemplarische Vorgehensweise zeigt Ihnen, wie Sie Lambda und eine benutzerdefinierte Ressource verwenden, um Amazon Machine Image (AMI) -IDs in Ihrer CloudFormation Vorlage dynamisch nachzuschlagen. Auf diese Weise können Sie die Aktualisierung der AMI-IDs in Ihren CloudFormation Vorlagen optimieren.

Wenn Sie eine CloudFormation Vorlage zum Starten einer Amazon EC2 EC2-Instance erstellen, müssen Sie eine AMI-ID angeben, die einer Vorlage für das Betriebssystem und die Software entspricht, die auf der Instance installiert werden. Die richtige AMI-ID hängt vom Instance-Typ ab, in dem AWS-Region Sie Ihre Instance starten. Diese IDs können sich regelmäßig ändern, z. B. wenn ein AMI mit Softwareupdates aktualisiert wird.

In der Regel geben Sie die AMI-ID in einem Zuordnungsabschnitt an, der AMI-IDs bestimmten Instance-Typen und Regionen zuordnet. Das bedeutet, dass Sie die IDs in jeder Ihrer Vorlagen manuell ändern müssen, um sie zu aktualisieren. Mithilfe von benutzerdefinierten Ressourcen und Lambda können Sie jedoch eine Funktion erstellen, die die IDs der neuesten AMIs für den Instance-Typ und die Region, die Sie verwenden, abruft. Auf diese Weise müssen Sie die Zuordnungen zwischen AMI-IDs, Instance-Typen und Regionen in Ihren Stack-Vorlagen nicht manuell verwalten.

In dieser Anleitung erfahren Sie, wie Sie eine benutzerdefinierte Ressource erstellen und eine Lambda-Funktion damit verknüpfen, um AMI-IDs nachzuschlagen. Es wird davon ausgegangen, dass Sie mit benutzerdefinierten Ressourcen und Lambda-Funktionen vertraut sind. Eine Einführung in benutzerdefinierte Ressourcen und deren Funktionsweise finden Sie unterBenutzerdefinierte Ressourcen. Informationen zu Lambda finden Sie im AWS Lambda Developer Guide.

Anmerkung

CloudFormation ist ein kostenloser Service. Allerdings werden Ihnen die AWS Ressourcen, wie die Lambda-Funktion und die EC2-Instance, die Sie in Ihre Stacks aufnehmen, zum jeweils aktuellen Tarif in Rechnung gestellt. Weitere Informationen zu den AWS Preisen finden Sie auf der Detailseite der einzelnen Produkte unter http://aws.amazon.com.

Übersicht

Die folgenden Schritte bieten einen Überblick über diese Implementierung.

  1. Speichern Sie ein Beispielpaket, das den Lambda-Funktionscode enthält, in einem Amazon S3 S3-Bucket, in AWS-Region dem Sie Ihre EC2-Instance erstellen möchten.

  2. Verwenden Sie die Beispielvorlage, um Ihren Stack mit einer benutzerdefinierten Ressource, einer Lambda-Funktion, einer EC2-Instance und einer IAM-Rolle zu erstellen, mit der Lambda Amazon EC2 aufruft.

  3. Der Stack verknüpft die Lambda-Funktion mit der benutzerdefinierten Ressource. Wenn der Stack erstellt ist, CloudFormation ruft er die Funktion auf und sendet ihr Informationen wie den Anforderungstyp, Eingabedaten und eine vorsignierte Amazon S3 S3-URL.

  4. Die Lambda-Funktion verwendet die Eingabedaten, um nach der neuesten AMI-ID zu suchen, und sendet die AMI-ID als Antwort an die vorsignierte URL.

  5. CloudFormation ruft eine Antwort am Speicherort der vorsignierten URL ab und fährt mit der Erstellung des Stacks fort. Beim Erstellen CloudFormation der Instance verwendet sie die von der Lambda-Funktion bereitgestellte AMI-ID, um die EC2-Instance mit dem neuesten AMI zu erstellen.

Walkthrough zu Vorlagen

Sehen Sie sich folgendes an, um die gesamte Beispielvorlage anzuzeigen:

In den folgenden Codeausschnitten werden relevante Teile der Beispielvorlage erläutert, anhand der Sie sehen können, wie eine Lambda-Funktion mit einer benutzerdefinierten Ressource verknüpft und wie die Antwort der Funktion verwendet wird.

AWS::Lambda::FunctionRessource AMIInfoFunction

Die AWS::Lambda::Function Ressource gibt den Quellcode, den Handlernamen, die Laufzeitumgebung und die Ausführungsrolle Amazon Resource Name (ARN) der Funktion an.

  • Die Code-Eigenschaft gibt den Amazon S3-Speicherort (Bucket-Name und Dateiname) an, an den Sie das Beispielpaket hochgeladen haben. Die Beispielvorlage verwendet Eingabeparameter ("Ref": "S3Bucket" und "Ref": "S3Key"), um den Bucket- und Dateinamen anzugeben, damit Sie die Namen beim Erstellen des Stacks angeben können. In ähnlicher Weise verwendet der Name des Handlers, der dem Namen der Quelldatei (der JavaScript Datei) im .zip Paket entspricht, ebenfalls einen Eingabeparameter ("Ref": "ModuleName"). Da es sich bei der Quelldatei um JavaScript Code handelt, wird die Laufzeit als angegebennodejs18.x.

  • Für den Code, der in dieser exemplarischen Vorgehensweise verwendet wird, überschreitet die Ausführungszeit der Funktion den Standardwert von 3 Sekunden, sodass das Timeout auf 30 Sekunden festgelegt ist. Wenn Sie keine ausreichend lange Zeitüberschreitung angeben, verursacht Lambda möglicherweise eine Zeitüberschreitung, bevor die Funktion abgeschlossen werden kann, sodass die Stack-Erstellung fehlschlägt.

  • Die Role Eigenschaft verwendet die Fn::GetAtt Funktion, um den ARN der LambdaExecutionRole Ausführungsrolle abzurufen, der an anderer Stelle in der Vorlage deklariert ist.

JSON

"AMIInfoFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": { "Ref": "S3Bucket" }, "S3Key": { "Ref": "S3Key" } }, "Handler": { "Fn::Join" : [ "", [{ "Ref": "ModuleName" },".handler"] ] }, "Runtime": "nodejs18.x", "Timeout": "30", "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] } } }

YAML

AMIInfoFunction: Type: AWS::Lambda::Function Properties: Code: S3Bucket: !Ref S3Bucket S3Key: !Ref S3Key Handler: !Sub "${ModuleName}.handler" Runtime: nodejs18.x Timeout: 30 Role: !GetAtt LambdaExecutionRole.Arn

AWS::IAM::RoleRessource LambdaExecutionRole

Die Ausführungsrolle erteilt der Lambda-Funktion die Berechtigung, Protokolle an die AWS DescribeImages EC2-API zu senden und sie aufzurufen.

JSON

"LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": ["ec2:DescribeImages"], "Resource": "*" }] } }] } }

YAML

LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: "/" Policies: - PolicyName: root PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: arn:aws:logs:*:*:* - Effect: Allow Action: - ec2:DescribeImages Resource: "*"

Ressource Custom: :AmiInfo AMIInfo

Sowohl für die Linux- als auch für die Windows-Vorlage ruft die benutzerdefinierte Ressource die ihr zugeordnete Lambda-Funktion auf. Um eine Funktion mit einer benutzerdefinierten Ressource zu verknüpfen, geben Sie mithilfe der Fn::GetAtt systeminternen Funktion den ARN der Funktion für die ServiceToken Eigenschaft an. CloudFormation sendet die zusätzlichen Eigenschaften, die in der benutzerdefinierten Ressourcendeklaration enthalten sind, wie z. B. Region undArchitecture, als Eingaben an die Lambda-Funktion. Die Lambda-Funktion bestimmt die korrekten Namen und Werte für diese Eingabeeigenschaften.

JSON

"AMIInfo": { "Type": "Custom::AMIInfo", "Properties": { "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, "Region": { "Ref": "AWS::Region" }, "Architecture": { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } } }

YAML

AMIInfo: Type: Custom::AMIInfo Properties: ServiceToken: !GetAtt AMIInfoFunction.Arn Region: !Ref "AWS::Region" Architecture: Fn::FindInMap: - AWSInstanceType2Arch - !Ref InstanceType - Arch

Bei Windows stellt die benutzerdefinierte Ressource der Lambda-Funktion die Windows-Version anstelle der Architektur der Instance bereit.

JSON

"AMIInfo": { "Type": "Custom::AMIInfo", "Properties": { "ServiceToken": { "Fn::GetAtt": ["AMIInfoFunction", "Arn"] }, "Region": { "Ref": "AWS::Region" }, "OSName": { "Ref": "WindowsVersion" } } }

YAML

AMIInfo: Type: Custom::AMIInfo Properties: ServiceToken: !GetAtt AMIInfoFunction.Arn Region: !Ref "AWS::Region" OSName: !Ref "WindowsVersion"

Wenn die Lambda-Funktion aufgerufen wird, CloudFormation ruft die Funktion die DescribeImages EC2-API auf AWS-Region und verwendet die Instanzarchitektur oder den Betriebssystemnamen, um die Liste der Images zu filtern. Die Funktion sortiert dann die Liste von Images nach Datum und gibt die ID des aktuellen AMI zurück.

Beim Zurückgeben der ID des aktuellen AMI sendet die Funktion die ID an eine vorsignierte URL in der Data-Eigenschaft des Antwortobjekts. Die Daten sind als Name-Wert-Paar strukturiert, wie im folgenden Beispiel dargestellt:

"Data": { "Id": "ami-02354e95b3example" }

AWS::EC2::InstanceRessource SampleInstance

Der folgende Codeausschnitt zeigt, wie die Daten von der Lambda-Funktion abgerufen werden. Sie verwendet die intrinsische Fn::GetAtt-Funktion, die den Namen der benutzerdefinierten Ressource und den Attributnamen des Werts bereitstellen, den Sie abrufen möchten. In dieser Anleitung lautet der benutzerdefinierte Ressourcenname AMIInfo und der Attributname Id.

JSON

"SampleInstance": { "Type": "AWS::EC2::Instance", "Properties": { "InstanceType" : { "Ref": "InstanceType" }, "ImageId": { "Fn::GetAtt": [ "AMIInfo", "Id" ] } } }

YAML

SampleInstance: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !GetAtt AMIInfo.Id

Voraussetzungen

Bevor Sie die Schritte zum Erstellen des Stacks abschließen können, müssen Sie bereits über einen Amazon S3 S3-Bucket verfügen. Wenn Sie einen Stack mit einer Lambda-Funktion erstellen, müssen Sie den Speicherort des Amazon S3-Buckets angeben, der den Quellcode der Funktion enthält. Der Bucket muss sich in demselben befinden, in dem AWS-Region Sie Ihren Stack erstellen. Weitere Informationen zum Erstellen eines Buckets finden Sie unter Erstellen von Buckets im Benutzerhandbuch für Amazon Simple Storage Service.

Sie benötigen außerdem IAM-Berechtigungen, um alle entsprechenden Dienste wie Lambda, Amazon EC2 und nutzen zu können. CloudFormation

Schritt 1: Speichern Sie das Lambda-Beispielpaket in Amazon S3

In diesem Schritt laden Sie das Lambda-Beispielpaket (eine .zip Datei) in Ihren Amazon S3 S3-Bucket hoch.

Dieses Paket enthält den Quellcode für die Lambda-Funktion und die erforderlichen Bibliotheken. In dieser Anleitung sind für die Funktion keine zusätzlichen Bibliotheken erforderlich.

Um das Musterpaket in Amazon S3 zu speichern
  1. Laden Sie das Beispielpaket von Amazon S3 herunter. Wenn Sie die Datei speichern, verwenden Sie den gleichen Dateinamen wie im Beispiel: amilookup.zip oder amilookup-win.zip.

  2. Öffnen Sie die Amazon S3-Konsole unter https://console.aws.amazon.com/s3/home.

  3. Wählen Sie in der Navigationsleiste oben auf dem Bildschirm den aus, in dem AWS-Region Sie Ihren Amazon S3 S3-Bucket erstellt haben.

  4. Wählen Sie in der Bucket-Liste den Namen Ihres Buckets aus. Notieren Sie sich den Bucket-Namen, da Sie ihn bei der Erstellung des Stacks verwenden.

  5. Klicken Sie auf Hochladen.

  6. Laden Sie unter Upload für Dateien und Ordner das Beispielpaket in den Bucket hoch. Weitere Informationen finden Sie unter Hochladen von Objekten im Benutzerhandbuch von Amazon Simple Storage Service.

Schritt 2: Starten Sie den Stack

In diesem Schritt starten Sie einen Stack aus einer Beispielvorlage. Der Stack umfasst eine Lambda-Funktion, eine IAM-Rolle (Ausführungsrolle), eine benutzerdefinierte Ressource, die die Funktion aufruft, und eine EC2-Instance, die die Ergebnisse der Funktion verwendet.

Während der Stack-Erstellung ruft die benutzerdefinierte Ressource die Lambda-Funktion auf und wartet, bis die Funktion eine Antwort an die vorsignierte Amazon S3-URL sendet. In der Antwort gibt die Funktion die ID des neuesten AMI zurück, das dem EC2-Instance-Typ entspricht, in dem AWS-Region Sie die Instance erstellen. Die Daten aus der Antwort der Funktion werden als Attribut der benutzerdefinierten Ressource gespeichert, die zum Angeben der AMI-ID der EC2-Instance verwendet wird.

So erstellen Sie den Stack
  1. Öffnen Sie die CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation/.

  2. Wählen Sie Stapel erstellen aus.

  3. Wählen Sie im Abschnitt Template die Option Specify an Amazon S3 template URL aus und kopieren Sie dann die folgende URL, und fügen Sie sie in das Textfeld ein:

    Linux-Vorlage

    https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample.template

    Windows-Vorlage

    https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample-win.template

  4. Wählen Sie Weiter aus.

  5. Geben Sie im Namensfeld Stack SampleEC2Instance ein.

  6. Geben Sie im Abschnitt Parameters den Namen des Amazon-S3-Buckets an, den Sie erstellt haben, und wählen Sie dann Next aus.

    Die Standardwerte für die anderen Parameter sind die gleichen Namen, die im Beispiel-.zip-Paket verwendet werden.

  7. Für diese Anleitung müssen Sie keine Tags hinzufügen oder erweiterte Einstellungen angeben, wählen Sie daher Weiter aus.

  8. Stellen Sie sicher, dass der Stack-Name und die Vorlagen-URL richtig sind, und wählen Sie Create.

Die Erstellung Ihres Stacks kann mehrere Minuten CloudFormation dauern. Betrachten Sie die Stack-Ereignisse, um den Fortschritt zu überwachen. Weitere Informationen finden Sie unter AWS CloudFormation Stack-Daten und Ressourcen anzeigen auf dem AWS Management Console.

Wenn die Stack-Erstellung erfolgreich ist, wurden alle Ressourcen in dem Stack, z. B. die Lambda-Funktion, die benutzerdefinierte Ressource und die EC2-Instance, erstellt. Sie haben eine Lambda-Funktion und eine benutzerdefinierte Ressource erfolgreich verwendet, um die AMI-ID einer EC2-Instance anzugeben. In dieser Vorlage müssen Sie keine Zuordnung von AMI-ID erstellen und verwalten.

Um zu sehen, welche AMI-ID CloudFormation zur Erstellung der EC2-Instance verwendet wurde, sehen Sie sich die Stack-Ausgaben an.

Wenn die Lambda-Funktion einen Fehler zurückgibt, sehen Sie sich die Protokolle der Funktion in der CloudWatch Logs-Konsole an. Der Name des Protokollstreams ist die physische ID der benutzerdefinierten Ressource, die Sie durch Anzeigen der Ressourcen des Stacks finden können. Weitere Informationen finden Sie unter Protokolldaten anzeigen im CloudWatch Amazon-Benutzerhandbuch.

Schritt 3: Bereinigen von Ressourcen

Löschen Sie den Stack, um alle Stack-Ressourcen zu bereinigen, die Sie erstellt haben, damit Ihnen keine unnötigen Ressourcen in Rechnung gestellt werden.

So löschen Sie den Stack
  1. Wählen Sie in der CloudFormation Konsole den SampleEC2Instance-Stack aus.

  2. Wählen Sie die Option Actions und anschließend Delete Stack aus.

  3. Wählen Sie im Bestätigungsdialogfeld Yes, Delete aus.

Alle erstellten Ressourcen werden gelöscht.

Nachdem Sie nun verstanden haben, wie Lambda-Funktionen erstellt und verwendet werden CloudFormation, können Sie die Beispielvorlage und den Code aus dieser exemplarischen Vorgehensweise verwenden, um weitere Stacks und Funktionen zu erstellen.

Ähnliche Informationen