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 AMI IDs mit einer von Lambda unterstützten benutzerdefinierten Ressource nach
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. Dies kann Ihnen helfen, die Aktualisierung der AMI IDs in Ihren Vorlagen zu optimieren. CloudFormation
Wenn Sie eine CloudFormation Vorlage zum Starten einer EC2 Amazon-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 und in dem AWS-Region Sie Ihre Instance starten. Diese IDs können sich regelmäßig ändern, z. B. wenn eine mit Softwareupdates aktualisiert AMI wird.
In der Regel geben Sie die AMI ID in einem Mappings
Abschnitt AMI IDs an, der bestimmten Instance-Typen und Regionen zugeordnet ist. Das bedeutet, dass Sie sie in jeder Ihrer Vorlagen manuell ändern müssenIDs, um sie zu aktualisieren. Mithilfe von benutzerdefinierten Ressourcen und Lambda können Sie jedoch eine Funktion erstellen, die die neuesten Informationen AMIs für den IDs Instance-Typ und die Region, die Sie verwenden, abruft. Auf diese Weise müssen Sie die Zuordnungen zwischen Instance-Typen und Regionen in Ihren AMI IDs Stack-Vorlagen nicht manuell verwalten.
In dieser exemplarischen Vorgehensweise wird gezeigt, wie Sie eine benutzerdefinierte Ressource erstellen und ihr eine Lambda-Funktion zuordnen, um sie nachzuschlagen. AMI IDs 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 unterErstellen Sie eine benutzerdefinierte Bereitstellungslogik mit benutzerdefinierten 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 Lambda-Instanz, die Sie in Ihre Stacks aufnehmen, zum jeweils aktuellen Tarif in Rechnung gestellt. Weitere Informationen zur AWS Preisgestaltung finden Sie auf der Detailseite der einzelnen Produkte unter http://aws.amazon.com.
Als Alternative zur Erstellung einer benutzerdefinierten Ressource und Lambda-Funktion können Sie AWS Systems Manager Parameter in Ihrer Vorlage verwenden, um den neuesten AMI ID-Wert abzurufen, der in einem Systems Manager Manager-Parameter gespeichert ist. Dadurch sind Ihre Vorlagen wiederverwendbarer und einfacher zu verwalten. Weitere Informationen finden Sie unter Geben Sie vorhandene Ressourcen zur Laufzeit mit von CloudFormation -bereitgestellten Parametertypen an.
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 Instanz und einer IAM Rolle zu erstellen, die Lambda verwendet, um Amazon aufzurufen. EC2
-
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 z. B. den Anforderungstyp, Eingabedaten und ein vorsigniertes Amazon 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 URL vorsignierte.
-
CloudFormation ruft eine Antwort am vorsignierten URL Speicherort ab und fährt mit der Erstellung des Stacks fort. Beim CloudFormation Erstellen der Instanz wird die von der Lambda-Funktion bereitgestellte AMI ID verwendet, um die EC2 Instanz mit der neuesten Version 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: :Funktionsressource 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 dieLambdaExecutionRole
Ausführungsrolle ARN abzurufen, die an anderer Stelle in der Vorlage deklariert wurde.
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: :Rollenressource LambdaExecutionRole
Die Ausführungsrolle erteilt der Lambda-Funktion die Berechtigung, Protokolle an zu senden AWS und EC2 DescribeImages
API 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: "*"
Benutzerdefiniert: Ressource 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 ARN der Fn::GetAtt
systemeigenen Funktion die 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 auf AWS-Region und verwendet EC2 DescribeImages
API dabei die Instanzarchitektur oder den Betriebssystemnamen, um die Liste der Bilder zu filtern. Anschließend sortiert die Funktion die Liste der Bilder nach Datum und gibt die ID der letzten Bilder zurück. AMI
Bei der Rückgabe der neuesten AMI ID sendet die Funktion die ID an ein URL in der Data
Eigenschaft des Antwortobjekts vorsigniertes Objekt. Die Daten sind als Name-Wert-Paar strukturiert, wie im folgenden Beispiel dargestellt:
"Data": { "Id": "ami-02354e95b3example" }
AWS::EC2: :Instanzressource 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 müssen außerdem über IAM Berechtigungen verfügen, um alle entsprechenden Dienste wie LambdaEC2, Amazon und CloudFormation zu nutzen.
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 Sie nach Linux AMI IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup.zip
- Suchen Sie nach Windows AMI IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup-win.zip
-
Öffnen Sie die Amazon S3 S3-Konsole zu https://console.aws.amazon.com/s3/Hause
. -
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 Buckets-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 Instanz, 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 das vorsignierte Amazon S3 sendet. URL In der Antwort gibt die Funktion die neueste ID zurück, die dem EC2 Instance-Typ entsprichtAMI, in dem AWS-Region Sie die Instance erstellen. Die Daten aus der Antwort der Funktion werden als Attribut der benutzerdefinierten Ressource gespeichert, das zur Angabe der AMI ID der EC2 Instanz verwendet wird.
So erstellen Sie den Stack
-
Öffnen Sie die CloudFormation Konsole unter https://console.aws.amazon.com/cloudformation/
. -
Wählen Sie auf der Seite „Stacks“ oben rechts die Option „Stack erstellen“ und dann „Mit neuen Ressourcen (Standard)“ aus.
Wählen Sie unter Voraussetzung — Vorlage vorbereiten die Option Bestehende Vorlage auswählen aus.
-
Wählen Sie unter Vorlage angeben die Option Amazon S3 ausURL, kopieren Sie dann Folgendes und fügen Sie es URL in das URL Feld Amazon S3 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.
-
Geben Sie für Stack name
SampleEC2Instance
ein. -
Geben Sie unter Parameter den Namen des Amazon S3 S3-Buckets an, den Sie erstellt haben, und wählen Sie dann Weiter.
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 URL die Vorlage korrekt sind, und wählen Sie dann Create.
Es kann mehrere Minuten dauern CloudFormation , bis Ihr Stack erstellt ist. Betrachten Sie die Stack-Ereignisse, um den Fortschritt zu überwachen. Weitere Informationen finden Sie unter Stack-Informationen von der CloudFormation Konsole aus anzeigen.
Wenn die Stack-Erstellung erfolgreich ist, wurden alle Ressourcen im Stack, z. B. die Lambda-Funktion, die benutzerdefinierte Ressource und die EC2 Instanz, erstellt. Sie haben erfolgreich eine Lambda-Funktion und eine benutzerdefinierte Ressource verwendet, um die AMI ID einer EC2 Instanz anzugeben. Sie müssen in dieser Vorlage kein Mapping von AMI IDs erstellen und verwalten.
Um zu sehen, welche AMI ID zum Erstellen der EC2 Instanz CloudFormation 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 EC2InstanceProbenstapel 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.