Tutorial: Uso di AWS Lambda con Amazon Simple Notification Service
In questo tutorial, si utilizza una funzione Lambda in un Account AWS per sottoscrivere un argomento Amazon Simple Notification Service (Amazon SNS) in un Account AWS separato. Quando pubblichi messaggi sul tuo argomento Amazon SNS, la tua funzione Lambda legge il contenuto del messaggio e lo invia a Amazon CloudWatch Logs. Per completare questo tutorial, userai AWS Command Line Interface (AWS CLI).
Per completare questo tutorial, esegui i passaggi riportati:
-
Nell'account A, crea un argomento Amazon SNS.
-
Nell'account B, crea una funzione Lambda che leggerà i messaggi dall'argomento.
-
Nell'account B, crea una sottoscrizione all'argomento.
-
Pubblica messaggi sull'argomento Amazon SNS nell'account Ae conferma che la funzione Lambda nell'account B li invia a CloudWatch Logs.
Completando questi passaggi, imparerai come configurare un argomento Amazon SNS per richiamare una funzione Lambda. Imparerai anche a creare un policy AWS Identity and Access Management (IAM) che fornisce l'autorizzazione per una risorsa in un altro Account AWS per richiamare Lambda.
Nel tutorial, vengono utilizzati due Account AWS separati. I comandi AWS CLI lo illustrano utilizzando due profili denominati accountA e accountB, ciascuno configurato per l'uso con un Account AWS diverso. Per imparare a configurare AWS CLI per utilizzare profili diversi, consulta Impostazioni dei file di configurazione e credenziali nella Guida per l'utente di AWS Command Line Interface per la versione 2. Assicurati di configurare la stessa Regione AWS predefinita per entrambi i profili.
Se i profili AWS CLI creati per i due Account AWS utilizzano nomi diversi o se si utilizza il profilo predefinito e un profilo specifico, modifica i comandi AWS CLI della seguente procedura in base alle esigenze.
Prerequisiti
Se non hai ancora installato l'AWS Command Line Interface, segui i passaggi indicati in Installazione o aggiornamento della versione più recente della AWS CLI per installarla.
Per eseguire i comandi nel tutorial, sono necessari un terminale a riga di comando o una shell (interprete di comandi). In Linux e macOS, utilizza la shell (interprete di comandi) e il gestore pacchetti preferiti.
Nota
Su Windows, alcuni comandi della CLI Bash utilizzati comunemente con Lambda (ad esempio, zip) non sono supportati dai terminali integrati del sistema operativo. Per ottenere una versione integrata su Windows di Ubuntu e Bash, installa il sottosistema Windows per Linux
Creare un argomento Amazon SNS (account A)
Per creare l'argomento
-
Nell'account A, crea un argomento standard di Amazon SNS utilizzando il seguente comando AWS CLI.
aws sns create-topic --name sns-topic-for-lambda --profile accountAVerrà visualizzato un output simile al seguente.
{ "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda" }Prendi nota del nome della risorsa Amazon (ARN) dell'argomento. Sarà necessario in seguito nel tutorial, quando aggiungerai autorizzazioni alla funzione Lambda per effettuare la sottoscrizione all'argomento.
Creazione di un ruolo di esecuzione della funzione (account B)
Un ruolo di esecuzione è un ruolo IAM che concede a una funzione Lambda l'autorizzazione per accedere ai servizi e alle risorse Servizi AWS. Prima di creare la tua funzione nell'account B, crei un ruolo che concede alla funzione le autorizzazioni di base per scrivere i log su CloudWatch Logs. Aggiungeremo le autorizzazioni per la lettura dal tuo argomento Amazon SNS in un passaggio successivo.
Creazione di un ruolo di esecuzione
-
Nell'account B apri la pagina dei ruoli
nella console IAM. -
Scegli Crea ruolo.
-
Per Tipo di entità attendibile, scegli Servizio AWS.
-
In Caso d'uso, scegli Lambda.
-
Scegli Next (Successivo).
-
Aggiungi una policy di autorizzazioni di base al ruolo completando le seguenti operazioni:
-
Nella casella di ricerca Policy di autorizzazione, inserisci
AWSLambdaBasicExecutionRole. -
Scegli Next (Successivo).
-
-
Completa la creazione del ruolo effettuando le seguenti operazioni:
-
In Dettagli ruolo, immetti
lambda-sns-roleper Nome ruolo. -
Scegli Crea ruolo.
-
Creare una funzione Lambda (account B)
Crea una funzione Lambda che elabora i messaggi Amazon SNS. Il codice funzione registra il contenuto dei messaggi di ogni record su Amazon CloudWatch Logs.
Questo tutorial utilizza il runtime Node.js 18.x, ma è fornito anche un codice di esempio in altri linguaggi di runtime. Per visualizzare il codice per il runtime che ti interessa, seleziona la scheda corrispondente nella casella seguente. Il codice JavaScript che utilizzerai in questa fase è il primo esempio mostrato nella scheda JavaScript.
Creazione della funzione
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir sns-tutorial cd sns-tutorial -
Copia il codice JavaScript di esempio in un nuovo file denominato
index.js. -
Crea un pacchetto di implementazione utilizzando il seguente comando
zip.zip function.zip index.js -
Esegui il comando AWS CLI per creare la tua funzione Lambda nell'account B.
aws lambda create-function --function-name Function-With-SNS \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs22.x \ --role arn:aws:iam::<AccountB_ID>:role/lambda-sns-role \ --timeout 60 --profile accountBVerrà visualizzato un output simile al seguente.
{ "FunctionName": "Function-With-SNS", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS", "Runtime": "nodejs22.x", "Role": "arn:aws:iam::123456789012:role/lambda_basic_role", "Handler": "index.handler", ... "RuntimeVersionConfig": { "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206" } } -
Registra il nome della risorsa Amazon (ARN) della funzione. Sarà necessario in seguito nel tutorial, quando aggiungerai autorizzazioni per consentire ad Amazon SNS di richiamare la funzione.
Aggiunta di autorizzazioni alla funzione (account B)
Perché Amazon SNS richiami la tua funzione, è necessario concedergli l'autorizzazione in una istruzione su una policy basata sulle risorse. Questa istruzione viene aggiunta utilizzando il comando AWS CLI add-permission.
Concessione dell'autorizzazione di Amazon SNS per richiamare la tua funzione
-
Nell'account B, esegui il comando AWS CLI utilizzando l'ARN per l'argomento Amazon SNS registrato in precedenza.
aws lambda add-permission --function-name Function-With-SNS \ --source-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \ --statement-id function-with-sns --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountBVerrà visualizzato un output simile al seguente.
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\": \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"}, \"Sid\":\"function-with-sns\"}" }
Nota
Se l'account con l'argomento Amazon SNS è ospitato in una Regione AWS attivata, dovrai specificare la regione nel principale. Ad esempio, se stai lavorando con un argomento Amazon SNS nella regione Asia Pacifico (Hong Kong), per il principale devi specificare sns.ap-east-1.amazonaws.com invece di sns.amazonaws.com.
Concessione dell'autorizzazione tra più account per la sottoscrizione ad Amazon SNS (account A)
Perché la funzione Lambda nell'account B sottoscriva l'argomento Amazon SNS che hai creato nell'account A, è necessario concedere l'autorizzazione per l'account B in modo da sottoscrivere il tuo argomento. L'utente concede questa autorizzazione utilizzando il comando add-permission della AWS CLI.
Concessione dell'autorizzazione per consentire all'account B la sottoscrizione all'argomento
-
Nell'account A, esegui il comando AWS CLI. Usa l'ARN per l'argomento Amazon SNS registrato in precedenza.
aws sns add-permission --label lambda-access --aws-account-id<AccountB_ID>\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \ --action-name Subscribe ListSubscriptionsByTopic --profile accountA
Creare una sottoscrizione (account B)
Nell'account B, ora sottoscrivi la tua funzione Lambda all'argomento Amazon SNS che hai creato all'inizio del tutorial nell'account A. Quando viene inviato un messaggio a questo argomento (sns-topic-for-lambda), Amazon SNS richiama la funzione Lambda Function-With-SNS nell'account B.
Creazione di una sottoscrizione
-
Nell'account B, esegui il comando AWS CLI. Usa la regione predefinita in cui hai creato l'argomento e gli ARN per l'argomento e la funzione Lambda.
aws sns subscribe --protocol lambda \ --regionus-east-1\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \ --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS \ --profile accountBVerrà visualizzato un output simile al seguente.
{ "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
Pubblicazione di messaggi sull'argomento (account A e account B)
Ora che la tua funzione Lambda nell'account B ha sottoscritto l'argomento Amazon SNS nell'account A, è il momento di testare la configurazione pubblicando messaggi sull'argomento. Per verificare che la funzione Lambda sia stata richiamata correttamente da Amazon SNS, utilizza CloudWatch Logs per visualizzare l'output della funzione.
Pubblicazione di un messaggio sull' argomento e visualizzazione dell'output della tua funzione
-
Digita
Hello Worldin un file di testo e salvalo comemessage.txt. -
Dalla stessa directory in cui hai salvato il tuo file di testo, esegui il comando AWS CLI nell'account A. Usa l'ARN per il tuo argomento.
aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \ --profile accountAIn questo modo verrà restituito un ID messaggio con un identificatore univoco, indicando che il messaggio è stato accettato da Amazon SNS. Amazon SNS prova quindi a consegnare il messaggio a tutti i sottoscrittori dell'argomento. Per verificare che la funzione Lambda sia stata richiamata correttamente da Amazon SNS, utilizza CloudWatch Logs per visualizzare l'output della funzione:
-
Nell'account B, apri la pagina Gruppi di log
nella console di Amazon CloudWatch. -
Scegli il nome del gruppo di log per la funzione (
/aws/lambda/Function-With-SNS). -
Scegli il flusso di log più recente.
-
Se la funzione è stata richiamata correttamente, vedrai un output simile al seguente che mostra il contenuto del messaggio pubblicato sull'argomento.
2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World 2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
Pulizia delle risorse
Ora è possibile eliminare le risorse create per questo tutorial, a meno che non si voglia conservarle. Eliminando le risorse AWS che non si utilizzano più, è possibile evitare addebiti superflui sul proprio account Account AWS.
Nell'Account A, elimina l'argomento Amazon SNS.
Per eliminare l'argomento Amazon SNS
-
Aprire la pagina Topics (Argomenti)
nella console Amazon SNS. -
Selezionare l'argomento creato.
-
Scegli Elimina.
-
Inserisci
delete menel campo di immissione del testo. -
Scegli Elimina.
Nell'Account B, elimina il ruolo di esecuzione, la funzione Lambda e la sottoscrizione Amazon SNS.
Come eliminare il ruolo di esecuzione
-
Aprire la pagina Ruoli
della console IAM. -
Selezionare il ruolo di esecuzione creato.
-
Scegliere Elimina.
-
Inserisci il nome del ruolo nel campo di immissione testo e seleziona Delete (Elimina).
Per eliminare la funzione Lambda
-
Aprire la pagina Functions (Funzioni)
della console Lambda. -
Selezionare la funzione creata.
-
Scegliere Operazioni, Elimina.
-
Digita
confirmnel campo di immissione testo e scegli Delete (Elimina).
Per eliminare la sottoscrizione Amazon SNS
-
Aprire la pagina Subscriptions (Sottoscrizioni)
nella console Amazon SNS. -
Selezionare la sottoscrizione creata.
-
Scegli Delete (Elimina), poi Delete (Elimina).