Piano di Sviluppo per la Lambda "Pompeo"
Questo documento descrive il piano di analisi, progettazione, implementazione e deploy per la funzione AWS Lambda che funge da ponte tra la skill Alexa "Pompeo" e l'istanza n8n del progetto ALPHA_PROJECT.
1. Obiettivo
La funzione Lambda ha un unico scopo: agire come un "ponte" (bridge) ultra-leggero e veloce. Il suo compito è ricevere le richieste inviate dalla skill Alexa, inoltrarle in modo sicuro al webhook di n8n che contiene la logica dell'agente, e restituire ad Alexa la risposta testuale (TTS) generata da n8n.
2. Analisi e Requisiti
Requisiti Funzionali
- Ricezione Richiesta: Deve essere in grado di ricevere e interpretare l'oggetto JSON inviato dal servizio Alexa.
- Inoltro a n8n: Deve inoltrare il corpo della richiesta Alexa a un webhook n8n predefinito.
- Autenticazione (Opzionale ma Raccomandato): La chiamata verso n8n dovrebbe includere un
secret tokenper assicurare che solo la Lambda possa attivare il workflow. - Ricezione Risposta da n8n: Deve attendere la risposta da n8n, che conterrà il testo da pronunciare.
- Formattazione Risposta Alexa: Deve costruire un oggetto JSON valido per Alexa, contenente la stringa TTS.
- Gestione Errori: Deve rispondere ad Alexa con un messaggio di errore cortese se n8n non è raggiungibile o restituisce un errore.
Requisiti Non Funzionali
- Costo Zero: L'intera infrastruttura deve operare sotto la soglia del piano gratuito di AWS (AWS Free Tier).
- AWS Lambda: Il free tier include 1 milione di chiamate/mese e 400.000 GB-secondi, ampiamente sufficienti.
- API Gateway (se usata): Il free tier include 1 milione di chiamate API/mese.
- Distribuzione Privata: La skill Alexa non deve essere pubblicata sullo store pubblico. Deve rimanere in stato "In Sviluppo" (
development), rendendola automaticamente disponibile solo sui dispositivi Echo associati all'account Amazon dello sviluppatore. - Bassa Latenza: La funzione deve essere scritta in un linguaggio performante per I/O (es. Python, Node.js) e avere una logica minimale per non introdurre ritardi.
- Sicurezza: La comunicazione tra Lambda e n8n deve avvenire su HTTPS. L'URL del webhook e il secret token devono essere gestiti tramite environment variables della Lambda, non hardcodati nel codice.
3. Progettazione (Design)
Architettura
+--------------+ 1. Utente parla +-----------------+ 3. Inoltra richiesta +---------------+
| | ----------------------> | | --------------------------> | |
| Echo Device | | AWS Lambda | | n8n Webhook |
| | <---------------------- | | <------------------------- | |
+--------------+ 5. Risposta TTS +-----------------+ 4. Risposta TTS +---------------+
(Text-to-Speech)
|
| 2. Trigger
|
+---------------------+
| Alexa Skills Kit |
+---------------------+
Dettagli Tecnici
- Runtime: Python 3.11. È una scelta eccellente per task I/O-bound come questo, con un'ottima integrazione in ambiente AWS.
- Trigger: Il trigger della Lambda sarà "Alexa Skills Kit". Per sicurezza, verrà configurato per accettare chiamate solo dalla specifica Skill ID di "Pompeo".
- IAM Role: Verrà creato un ruolo IAM con due policy:
- Trust Policy: Permette al servizio
lambda.amazonaws.comdi assumere questo ruolo. - Permissions Policy: Si utilizzerà la policy gestita da AWS
AWSLambdaBasicExecutionRole, che garantisce i permessi necessari per scrivere log su Amazon CloudWatch (logs:CreateLogGroup,logs:CreateLogStream,logs:PutLogEvents). Non sono necessari altri permessi.
- Trust Policy: Permette al servizio
- Logica del Codice (Python):
- La funzione
lambda_handler(event, context)sarà il punto di ingresso. - Recupererà l'URL del webhook e il secret token dalle variabili d'ambiente (
os.environ.get('N8N_WEBHOOK_URL')). - Eseguirà una richiesta HTTP POST (usando la libreria
requestsourllib3) verso l'URL di n8n. - Il
bodydella POST conterrà l'intero oggettoeventricevuto da Alexa. L'headerconterrà ilsecret token. - Attenderà la risposta di n8n. Se la risposta è 200 OK e contiene un JSON con un campo
tts_response, procederà. - Costruirà l'oggetto di risposta per Alexa, come da documentazione ufficiale.
- La funzione
- Gestione degli Errori: In caso di timeout, codice di stato HTTP non-200, o JSON malformato da n8n, la Lambda costruirà una risposta di errore standard per Alexa (es. "Mi dispiace, si è verificato un problema. Riprova più tardi.").
4. Implementazione (Codice)
La Lambda richiederà un singolo file index.py e un file requirements.txt per le dipendenze.
requirements.txt:
requests
index.py (Esempio Boilerplate):
import os
import json
import requests
# Recupera le variabili d'ambiente
N8N_WEBHOOK_URL = os.environ.get('N8N_WEBHOOK_URL')
N8N_SECRET_TOKEN = os.environ.get('N8N_SECRET_TOKEN')
def build_alexa_response(text):
"""Costruisce la risposta JSON per Alexa."""
return {
'version': '1.0',
'response': {
'outputSpeech': {
'type': 'PlainText',
'text': text
},
'shouldEndSession': True
}
}
def lambda_handler(event, context):
"""Punto di ingresso della funzione Lambda."""
print(f"Richiesta ricevuta da Alexa: {json.dumps(event)}")
if not N8N_WEBHOOK_URL or not N8N_SECRET_TOKEN:
print("Errore: Variabili d'ambiente non configurate.")
return build_alexa_response("Errore di configurazione del server.")
headers = {
'Content-Type': 'application/json',
'X-N8N-Webhook-Secret': N8N_SECRET_TOKEN
}
try:
response = requests.post(
N8N_WEBHOOK_URL,
headers=headers,
data=json.dumps(event),
timeout=8 # Alexa attende max 10 secondi
)
response.raise_for_status() # Solleva un'eccezione per status code non-2xx
n8n_data = response.json()
tts_text = n8n_data.get('tts_response', 'Nessuna risposta ricevuta da Pompeo.')
print(f"Risposta da n8n: {tts_text}")
return build_alexa_response(tts_text)
except requests.exceptions.RequestException as e:
print(f"Errore nella chiamata a n8n: {e}")
return build_alexa_response("Mi dispiace, non riesco a contattare Pompeo in questo momento.")
except Exception as e:
print(f"Errore generico: {e}")
return build_alexa_response("Si è verificato un errore inaspettato.")
Il codice andrà zippato insieme alla cartella delle dipendenze installate localmente (pip install -r requirements.txt -t .).
5. Procedura Burocratica di Deploy e Configurazione
Questa è la checklist passo-passo per mettere tutto in funzione.
Passo 1: Creazione del Ruolo IAM
- Vai alla console AWS -> IAM -> Roles.
- Clicca su Create role.
- Trusted entity type: Seleziona AWS service.
- Use case: Seleziona Lambda, poi clicca Next.
- Nella pagina Add permissions, cerca e seleziona la policy
AWSLambdaBasicExecutionRole. Clicca Next. - Role name: Inserisci un nome, es.
PompeoAlexaLambdaRole. - Clicca Create role.
Passo 2: Creazione della Funzione Lambda
- Prepara il pacchetto di deploy:
- Crea una cartella, es.
lambda_package. - Salva il codice Python come
index.pyin quella cartella. - Salva
requirements.txt. - Da terminale, nella cartella, esegui:
pip install -r requirements.txt --target . - Zippa l'intero contenuto della cartella
lambda_package(non la cartella stessa).
- Crea una cartella, es.
- Vai alla console AWS -> Lambda.
- Clicca Create function.
- Seleziona Author from scratch.
- Function name:
pompeo-alexa-bridge. - Runtime: Seleziona Python 3.11.
- Architecture:
x86_64. - Permissions: Espandi "Change default execution role", seleziona "Use an existing role" e scegli il ruolo
PompeoAlexaLambdaRolecreato prima. - Clicca Create function.
- Nella pagina della funzione, vai su Code source e clicca Upload from -> .zip file. Carica lo zip creato.
- Vai in Configuration -> Environment variables e aggiungi:
N8N_WEBHOOK_URL: L'URL del tuo webhook n8n.N8N_SECRET_TOKEN: Il token segreto che configurerai su n8n.
Passo 3: Creazione della Skill Alexa "Pompeo"
- Vai su Alexa Developer Console.
- Clicca Create Skill.
- Skill name:
Pompeo. - Choose a model:
Custom. - Choose a method to host:
Provision your own. - Clicca Create skill.
- Una volta nella dashboard della skill, vai nel menu a sinistra su Endpoint.
- Copia il tuo Skill ID. Sarà una stringa simile a
amzn1.ask.skill.xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.
Passo 4: Collegamento tra Skill e Lambda
- Torna alla pagina della funzione Lambda su AWS.
- Nella sezione Function overview, clicca Add trigger.
- Come sorgente, seleziona Alexa Skills Kit.
- Abilita Skill ID verification e incolla lo Skill ID copiato dal portale Alexa.
- Clicca Add.
- Ora, nella pagina della Lambda, in alto a destra, copia l'ARN (Amazon Resource Name) della funzione.
- Torna alla pagina Endpoint della skill nella Alexa Developer Console.
- Seleziona AWS Lambda ARN come Service Endpoint Type.
- Incolla l'ARN della Lambda nel campo Default Region.
- Clicca Save Endpoints in alto.
Passo 5: Test
- Nella Alexa Developer Console, vai alla tab Test.
- Nella casella di testo, scrivi "apri pompeo" o qualsiasi altra frase di avvio.
- Controlla i log della funzione Lambda su AWS CloudWatch per vedere la richiesta in arrivo e la risposta.
- La skill è ora attiva in modalità "Development" e funzionerà su tutti i dispositivi Echo associati al tuo account Amazon, rimanendo completamente privata.