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à.
Procedura dettagliata: cerca AMI IDs con una risorsa personalizzata supportata da Lambda
Questa procedura dettagliata mostra come utilizzare Lambda e una risorsa personalizzata per cercare dinamicamente Amazon Machine Image (AMI IDs ) nel tuo modello. CloudFormation Questo può aiutarti a semplificare il modo in cui aggiorni l'AMI IDs nei tuoi CloudFormation modelli.
Quando crei un CloudFormation modello per avviare un' EC2 istanza Amazon, devi specificare un ID AMI, che è come un modello per il sistema operativo e il software che verranno installati sull'istanza. L'ID AMI corretto dipende dal tipo di istanza in Regione AWS cui stai avviando l'istanza. Questi IDs possono cambiare regolarmente, ad esempio quando un'AMI viene aggiornata con aggiornamenti software.
In genere si specifica l'ID AMI in una Mappings
sezione che mappa l'AMI IDs a tipi di istanza e regioni specifici. Ciò significa che per aggiornare i IDs, è necessario modificarli manualmente in ciascuno dei modelli. Tuttavia, utilizzando risorse personalizzate e Lambda, puoi creare una funzione che ottenga le ultime novità AMIs per il tipo IDs di istanza e la regione che stai utilizzando. In questo modo, non è necessario mantenere manualmente le mappature tra AMI IDs, tipi di istanza e regioni nei modelli di stack.
Questa procedura dettagliata mostra come creare una risorsa personalizzata e associarvi una funzione Lambda per cercare l'AMI. IDs Si presuppone che tu abbia dimestichezza con le risorse personalizzate e le funzioni Lambda. Per un'introduzione alle risorse personalizzate e al loro funzionamento, consulta. Crea una logica di provisioning personalizzata con risorse personalizzate Per informazioni su Lambda, consulta la AWS Lambda Developer Guide.
Nota
CloudFormation è un servizio gratuito; tuttavia, ti verranno addebitate le AWS risorse, come la funzione e l' EC2 istanza Lambda, che includi negli stack alla tariffa corrente per ciascuna di esse. Per ulteriori informazioni sui AWS prezzi, consulta la pagina dei dettagli di ciascun prodotto all'indirizzo http://aws.amazon.com.
In alternativa alla creazione di una risorsa personalizzata e di una funzione Lambda, puoi utilizzare AWS Systems Manager i parametri nel modello per recuperare il valore ID AMI più recente memorizzato in un parametro Systems Manager. Ciò rende i modelli più riutilizzabili e facili da gestire. Per ulteriori informazioni, consulta Specificare le risorse esistenti in fase di esecuzione con i CloudFormation tipi di parametri forniti.
Argomenti
Panoramica
I passaggi seguenti forniscono una panoramica di questa implementazione.
-
Salva un pacchetto di esempio contenente il codice della funzione Lambda in un bucket Amazon S3 Regione AWS nello stesso in cui desideri creare l'istanza. EC2
-
Usa il modello di esempio per creare il tuo stack con una risorsa personalizzata, una funzione Lambda, EC2 un'istanza e un ruolo IAM che Lambda utilizza per effettuare chiamate ad Amazon. EC2
-
Lo stack associa la funzione Lambda alla risorsa personalizzata. Quando lo stack viene creato, CloudFormation richiama la funzione e le invia informazioni, come il tipo di richiesta, i dati di input e un URL Amazon S3 prefirmato.
-
La funzione Lambda utilizza i dati di input per cercare l'ID AMI più recente e invia l'ID AMI come risposta all'URL prefirmato.
-
CloudFormation ottiene una risposta nella posizione URL prefirmata e procede con la creazione dello stack. Quando CloudFormation crea l'istanza, utilizza l'ID AMI fornito dalla funzione Lambda per creare l' EC2 istanza con l'AMI più recente.
Spiegazione passo per passo del modello
Per visualizzare l'intero modello di esempio, consulta:
I seguenti frammenti spiegano le parti rilevanti del modello di esempio per aiutarti a capire come associare una funzione Lambda a una risorsa personalizzata e come utilizzare la risposta della funzione.
AWS::Lambda::Functionrisorsa AMIInfoFunction
La AWS::Lambda::Function
risorsa specifica il codice sorgente della funzione, il nome del gestore, l'ambiente di runtime e il ruolo di esecuzione Amazon Resource Name (ARN).
-
La proprietà
Code
specifica la posizione Amazon S3 (nome del bucket e nome del file), dove è caricato il pacchetto di esempio. Il modello di esempio utilizza i parametri di input ("Ref": "S3Bucket"
e"Ref": "S3Key"
) per impostare il bucket e i nomi dei file in modo che sia possibile specificare i nomi al momento della creazione dello stack. Allo stesso modo, anche il nome del gestore, che corrisponde al nome del file sorgente (il JavaScript file) nel.zip
pacchetto, utilizza un parametro di input ()."Ref": "ModuleName"
Poiché il file sorgente è JavaScript codice, il runtime è specificato comenodejs18.x
. -
Per il codice utilizzato in questa procedura dettagliata, il tempo di esecuzione della funzione supera il valore predefinito di
3
secondi, quindi il timeout è impostato su secondi.30
Se non specifichi un timeout sufficientemente lungo, Lambda potrebbe causare un timeout prima che la funzione possa essere completa, causando errori nella creazione dello stack. -
La
Role
proprietà utilizza laFn::GetAtt
funzione per ottenere l'ARN del ruolo diLambdaExecutionRole
esecuzione dichiarato altrove nel modello.
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::Rolerisorsa LambdaExecutionRole
Il ruolo di esecuzione concede alla funzione Lambda l'autorizzazione a inviare log e AWS chiamare l'API. EC2 DescribeImages
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: "*"
Risorsa personalizzata: AMIInfo AMIInfo
Per entrambi i modelli Linux e Windows, la risorsa personalizzata richiama la funzione Lambda ad essa associata. Per associare una funzione a una risorsa personalizzata, si specifica l'ARN della funzione per la ServiceToken
proprietà, utilizzando la funzione Fn::GetAtt
intrinseca. CloudFormation invia le proprietà aggiuntive incluse nella dichiarazione personalizzata delle risorse, come Region
eArchitecture
, alla funzione Lambda come input. La funzione Lambda determina i nomi e i valori corretti per queste proprietà di input.
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
Per Windows, la risorsa personalizzata fornisce la versione di Windows alla funzione Lambda invece dell'architettura dell'istanza.
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"
Quando CloudFormation richiama la funzione Lambda, la funzione chiama l' EC2DescribeImages
API, utilizzando l'architettura Regione AWS e l'istanza o il nome del sistema operativo per filtrare l'elenco di immagini. Quindi la funzione ordina l'elenco delle immagini per data e restituisce l'ID dell'AMI più recente.
Durante la restituzione dell'ID dell'AMI più recente, la funzione invia l'ID a un URL prefirmato nella proprietà Data
dell'oggetto di risposta. I dati sono strutturati come una coppia nome-valore, come nell'esempio seguente:
"Data": { "Id": "ami-02354e95b3example" }
AWS::EC2::Instancerisorsa SampleInstance
Il frammento seguente mostra come ottenere i dati da una funzione Lambda. Utilizza la funzione intrinseca Fn::GetAtt
, fornendo il nome della risorsa personalizzata e il nome attributo del valore che desideri ottenere. In questa procedura guidata, il nome della risorsa personalizzata è AMIInfo
e il nome attributo è 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
Prerequisiti
Prima di completare i passaggi per creare lo stack, devi già disporre di un bucket Amazon S3. Quando crei uno stack con una funzione Lambda, devi specificare la posizione del bucket Amazon S3 contenente il codice sorgente della funzione. Il bucket deve trovarsi nello stesso in cui Regione AWS hai creato lo stack. Per ulteriori informazioni sulla creazione di un bucket, consulta Creazione di un bucket nella Guida per l'utente di Amazon Simple Storage Service.
È inoltre necessario disporre delle autorizzazioni IAM per utilizzare tutti i servizi corrispondenti, come Lambda, EC2 Amazon e. CloudFormation
Fase 1: salvare il pacchetto Lambda di esempio in Amazon S3
In questo passaggio, carichi il pacchetto Lambda di esempio (un .zip
file) nel tuo bucket Amazon S3.
Questo pacchetto contiene il codice sorgente per la funzione Lambda e le librerie richieste. Per questa procedura guidata, la funzione non richiede librerie aggiuntive.
Per salvare il pacchetto di esempio in Amazon S3
-
Scaricare il pacchetto di esempio da Amazon S3. Quando si salva il file, utilizzare lo stesso nome di file dell'esempio,
amilookup.zip
oamilookup-win.zip
.- Cerca AMI Linux IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup.zip
- Cerca AMI Windows IDs
-
https://s3.amazonaws.com/cloudformation-examples/lambda/amilookup-win.zip
-
Apri la console Amazon S3 a casahttps://console.aws.amazon.com/s3/.
-
Nella barra di navigazione nella parte superiore dello schermo, scegli il bucket Amazon S3 in Regione AWS cui hai creato il tuo bucket Amazon S3.
-
Nell'elenco dei bucket, scegli il nome del tuo bucket. Prendi nota del nome del bucket perché lo usi quando crei lo stack.
-
Scegli Carica.
-
In Carica, per File e cartelle, carica il pacchetto di esempio nel bucket. Per ulteriori informazioni, consulta Caricamento degli oggetti nella Guida per l'utente di Amazon Simple Storage Service.
Passaggio 2: avvia lo stack
In questo passaggio, si avvia uno stack a partire da un modello di esempio. Lo stack include una funzione Lambda, un ruolo IAM (ruolo di esecuzione), una risorsa personalizzata che richiama la funzione e EC2 un'istanza che utilizza i risultati della funzione.
Durante la creazione dello stack, la risorsa personalizzata richiama la funzione Lambda e attende finché la funzione invia una risposta all'URL Amazon S3 prefirmato. Nella risposta, la funzione restituisce l'ID dell'AMI più recente che corrisponde al tipo di EC2 istanza in Regione AWS cui si sta creando l'istanza. I dati della risposta della funzione vengono archiviati come attributo della risorsa personalizzata, utilizzata per specificare l'ID AMI dell' EC2 istanza.
Per creare lo stack
-
Apri la CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation/
. -
Nella pagina Pile, scegli Crea pila in alto a destra, quindi scegli Con nuove risorse (standard).
Per Prerequisito - Prepara modello, scegli Scegli un modello esistente.
-
Per Specificare il modello, scegli Amazon S3 URL, quindi copia e incolla il seguente URL nel campo URL Amazon S3:
- Modello di Linux
-
https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample.template
- Modello di Windows
-
https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample-win.template
-
Scegli Next (Successivo).
-
Per Stack name (Nome stack), digitare
SampleEC2Instance
. -
Per Parametri, specifica il nome del bucket Amazon S3 che hai creato, quindi scegli Avanti.
I valori predefiniti per gli altri parametri sono gli stessi nomi utilizzati nel pacchetto di esempio
.zip
. -
Per questa procedura guidata, non è necessario aggiungere tag o specificare impostazioni avanzate, quindi selezionare Next (Avanti).
-
Assicurarsi che il nome dello stack e l'URL del modello siano corretti e scegliere Create (Crea).
La creazione dello stack potrebbe richiedere alcuni minuti. CloudFormation È possibile controllare l'avanzamento negli eventi per lo stack. Per ulteriori informazioni, consulta Visualizza le informazioni sullo stack dalla console CloudFormation .
Se la creazione dello stack ha esito positivo, vengono create tutte le risorse dello stack, ad esempio la funzione Lambda, la risorsa personalizzata e EC2 l'istanza. Hai utilizzato correttamente una funzione Lambda e una risorsa personalizzata per specificare l'ID AMI di un' EC2 istanza. Non è necessario creare e mantenere una mappatura degli AMI IDs in questo modello.
Per vedere quale ID AMI è stato CloudFormation utilizzato per creare l' EC2 istanza, visualizza gli output dello stack.
Se la funzione Lambda restituisce un errore, visualizza i log della funzione nella CloudWatch console Logs.
Fase 3: Eliminazione delle risorse
Elimina lo stack per cancellare tutte le risorse dello stack create in modo da non pagare per le risorse superflue.
Per eliminare lo stack
-
Dalla CloudFormation console, scegli lo stack Sample EC2 Instance.
-
Scegliere Actions (Operazioni) e poi Delete Stack (Elimina stack).
-
Nel messaggio di conferma, scegliere Yes, Delete (Sì, elimina).
Tutte le risorse create vengono eliminate.
Ora che hai capito come creare e usare le funzioni Lambda CloudFormation, puoi usare il modello e il codice di esempio di questa procedura dettagliata per creare altri stack e funzioni.