Procedura dettagliata: cerca AMI IDs con una risorsa personalizzata supportata da Lambda - AWS CloudFormation

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 i tuoi modelli. AMI IDs CloudFormation

Quando crei un CloudFormation modello per avviare un'EC2istanza Amazon, devi specificare un AMI ID, che è come un modello per il sistema operativo e il software che verranno installati sull'istanza. L'AMIID corretto dipende dal tipo di istanza e dal tipo di istanza in cui Regione AWS stai avviando l'istanza. Questi IDs possono cambiare regolarmente, ad esempio quando un AMI viene aggiornato con aggiornamenti software.

In genere si specifica l'AMIID in una Mappings sezione che corrisponde AMI IDs a tipi di istanza e regioni specifici. Ciò significa che per aggiornare iIDs, è 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 i tipi di istanza e le regioni nei modelli di stack.

Questa procedura dettagliata mostra come creare una risorsa personalizzata e associarvi una funzione Lambda per eseguire la ricerca. 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'EC2istanza 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, è possibile utilizzare AWS Systems Manager i parametri nel modello per recuperare il valore AMI ID più recente memorizzato in un parametro Systems Manager. Ciò rende i modelli più riutilizzabili e facili da gestire. Per ulteriori informazioni, consulta Fai riferimento alle risorse esistenti e ai parametri di Systems Manager con i CloudFormation tipi di parametri forniti.

Panoramica

I passaggi seguenti forniscono una panoramica di questa implementazione.

  1. 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

  2. Usa il modello di esempio per creare il tuo stack con una risorsa personalizzata, una funzione Lambda, EC2 un'istanza e IAM un ruolo che Lambda utilizza per effettuare chiamate ad Amazon. EC2

  3. 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 Amazon S3 prefirmato. URL

  4. La funzione Lambda utilizza i dati di input per cercare l'AMIID più recente e invia l'AMIID come risposta al prefirmato. URL

  5. CloudFormation ottiene una risposta nella URL posizione prefirmata e procede con la creazione dello stack. Quando CloudFormation crea l'istanza, utilizza l'AMIID fornito dalla funzione Lambda per creare l'EC2istanza con la versione più recente. AMI

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: :Risorsa funzionale 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 la Fn::GetAtt funzione per ottenere il ruolo ARN di LambdaExecutionRole 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: Risorsa di ruolo LambdaExecutionRole

Il ruolo di esecuzione concede alla funzione Lambda il permesso di inviare log AWS a e chiamare. EC2 DescribeImages API

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 la funzione ARN relativa alla ServiceToken proprietà, utilizzando la Fn::GetAtt funzione 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 EC2 DescribeImagesAPI, utilizzando l'architettura Regione AWS and instance 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'ultima. AMI

Quando restituisce l'ID più recenteAMI, la funzione invia l'ID a un elemento prefirmato URL nella Data proprietà dell'oggetto di risposta. I dati sono strutturati come una coppia nome-valore, come nell'esempio seguente:

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

AWS::EC2: Risorsa di istanza 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 IAM delle autorizzazioni 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
  1. Scaricare il pacchetto di esempio da Amazon S3. Quando si salva il file, utilizzare lo stesso nome di file dell'esempio, amilookup.zip o amilookup-win.zip.

  2. Apri la console Amazon S3 a casahttps://console.aws.amazon.com/s3/.

  3. 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.

  4. Nell'elenco dei bucket, scegli il nome del tuo bucket. Prendi nota del nome del bucket perché lo usi quando crei lo stack.

  5. Scegli Carica.

  6. 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, IAM un ruolo (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 che la funzione invii una risposta all'Amazon S3 prefirmato. URL Nella risposta, la funzione restituisce l'ID dell'ultima versione corrispondente al tipo di istanza in AMI cui si sta creando l'EC2istanza. Regione AWS I dati della risposta della funzione vengono archiviati come attributo della risorsa personalizzata, utilizzata per specificare l'AMIID dell'EC2istanza.

Per creare lo stack
  1. Apri la CloudFormation console all'indirizzo https://console.aws.amazon.com/cloudformation/.

  2. Scegli Crea stack.

  3. Nella sezione Modello, scegli Specificare un modello Amazon S3 URL, quindi copia e incolla quanto segue URL nella casella di testo:

    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

  4. Scegli Next (Successivo).

  5. Nel campo Stack name (Nome stack), digitare SampleEC2Instance.

  6. Nella sezione Parameters (Parametri), specificare il nome del bucket Amazon S3 creato e selezionare Next (Avanti).

    I valori predefiniti per gli altri parametri sono gli stessi nomi utilizzati nel pacchetto di esempio .zip.

  7. Per questa procedura guidata, non è necessario aggiungere tag o specificare impostazioni avanzate, quindi selezionare Next (Avanti).

  8. Assicurati che il nome dello stack e il modello URL siano corretti, quindi scegli 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'AMIID di un'EC2istanza. Non è necessario creare e mantenere una mappatura di AMI IDs in questo modello.

Per vedere quale AMI ID è stato CloudFormation utilizzato per creare l'EC2istanza, visualizza gli output dello stack.

Se la funzione Lambda restituisce un errore, visualizza i log della funzione nella CloudWatch console Logs. Il nome del flusso di log è l'ID fisico della risorsa personalizzata, che puoi trovare visualizzando le risorse dello stack. Per ulteriori informazioni, consulta Visualizza i dati di log nella Amazon CloudWatch User Guide.

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
  1. Dalla CloudFormation console, scegli lo EC2Instance stack Sample.

  2. Scegliere Actions (Operazioni) e poi Delete Stack (Elimina stack).

  3. 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.

Informazioni correlate