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.
Themen
Übersicht
Die folgenden Schritte bieten einen Überblick über diese Implementierung.
-
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.
-
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.
-
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.
-
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.
-
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 auf30
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 dieFn::GetAtt
Funktion, um den ARN derLambdaExecutionRole
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
-
Laden Sie das Beispielpaket von Amazon S3 herunter. Wenn Sie die Datei speichern, verwenden Sie den gleichen Dateinamen wie im Beispiel:
amilookup.zip
oderamilookup-win.zip
.- Suchen nach Linux-AMI-IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup.zip
- Suchen nach Windows-AMI-IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup-win.zip
-
Öffnen Sie die Amazon S3-Konsole unter https://console.aws.amazon.com/s3/home
. -
Wählen Sie in der Navigationsleiste oben auf dem Bildschirm den aus, in dem AWS-Region Sie Ihren Amazon S3 S3-Bucket erstellt haben.
-
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.
-
Klicken Sie auf Hochladen.
-
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
-
Öffnen Sie die CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation/
. -
Wählen Sie Stapel erstellen aus.
-
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
-
Wählen Sie Weiter aus.
-
Geben Sie im Namensfeld Stack
SampleEC2Instance
ein. -
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. -
Für diese Anleitung müssen Sie keine Tags hinzufügen oder erweiterte Einstellungen angeben, wählen Sie daher Weiter aus.
-
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
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
-
Wählen Sie in der CloudFormation Konsole den SampleEC2Instance-Stack aus.
-
Wählen Sie die Option Actions und anschließend Delete Stack aus.
-
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.