Funzioni Lambda Python
Il generatore di Funzioni Lambda Python fornisce la capacità di aggiungere una funzione lambda a un progetto python esistente.
Questo generatore crea un nuovo handler lambda python con configurazione dell’infrastruttura AWS CDK o Terraform. Il backend generato utilizza AWS Lambda per il deployment serverless, con type-safety opzionale utilizzando il Parser da AWS Lambda Powertools. Configura AWS Lambda Powertools per l’osservabilità, inclusi logging, tracing AWS X-Ray e Cloudwatch Metrics.
Utilizzo
Sezione intitolata “Utilizzo”Generare una Funzione Lambda
Sezione intitolata “Generare una Funzione Lambda”Puoi generare una nuova Funzione Lambda in due modi:
pnpm nx g @aws/nx-plugin:py#lambda-functionyarn nx g @aws/nx-plugin:py#lambda-functionnpx nx g @aws/nx-plugin:py#lambda-functionbunx nx g @aws/nx-plugin:py#lambda-functionPuoi anche eseguire una prova per vedere quali file verrebbero modificati
pnpm nx g @aws/nx-plugin:py#lambda-function --dry-runyarn nx g @aws/nx-plugin:py#lambda-function --dry-runnpx nx g @aws/nx-plugin:py#lambda-function --dry-runbunx nx g @aws/nx-plugin:py#lambda-function --dry-run- Installa il Nx Console VSCode Plugin se non l'hai già fatto
- Apri la console Nx in VSCode
- Clicca su
Generate (UI)nella sezione "Common Nx Commands" - Cerca
@aws/nx-plugin - py#lambda-function - Compila i parametri richiesti
- Clicca su
Generate
Opzioni
Sezione intitolata “Opzioni”| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
| project Obbligatorio | string | - | Il progetto a cui aggiungere la funzione lambda |
| name Obbligatorio | string | - | Il nome della funzione da aggiungere |
| functionPath | string | - | Il percorso all'interno della directory sorgente del progetto in cui aggiungere la funzione |
| event | Any | AlbModel | APIGatewayProxyEventModel | ApiGatewayAuthorizerToken | ApiGatewayAuthorizerRequest | APIGatewayProxyEventV2Model | ApiGatewayAuthorizerRequestV2 | APIGatewayWebSocketMessageEventModel | APIGatewayWebSocketConnectEventModel | APIGatewayWebSocketDisconnectEventModel | BedrockAgentEventModel | CloudFormationCustomResourceCreateModel | CloudFormationCustomResourceUpdateModel | CloudFormationCustomResourceDeleteModel | CloudWatchLogsModel | DynamoDBStreamModel | EventBridgeModel | IoTCoreThingEvent | IoTCoreThingTypeEvent | IoTCoreThingTypeAssociationEvent | IoTCoreThingGroupEvent | IoTCoreAddOrRemoveFromThingGroupEvent | IoTCoreAddOrDeleteFromThingGroupEvent | KafkaMskEventModel | KafkaSelfManagedEventModel | KinesisDataStreamModel | KinesisFirehoseModel | KinesisFirehoseSqsModel | LambdaFunctionUrlModel | S3BatchOperationModel | S3EventNotificationEventBridgeModel | S3Model | S3ObjectLambdaEvent | S3SqsEventNotificationModel | SesModel | SnsModel | SqsModel | TransferFamilyAuthorizer | VpcLatticeModel | VpcLatticeV2Model | Any | Modello di origine evento opzionale da utilizzare per la funzione lambda |
| infra | lambda | none | lambda | Il tipo di infrastruttura con cui distribuire la tua funzione Lambda. |
| iac | inherit | cdk | terraform | inherit | Il provider IaC preferito. Per impostazione predefinita viene ereditato dalla selezione iniziale. |
| preferInstallDependencies | boolean | true | Se preferire l'installazione delle dipendenze dopo l'esecuzione del generatore. Impostare su false per rimandare l'installazione quando si eseguono più generatori in batch (l'installazione viene comunque eseguita se necessaria affinché i generatori successivi possano calcolare il grafo dei progetti Nx); installare una volta alla fine. |
Output del Generatore
Sezione intitolata “Output del Generatore”Il generatore aggiungerà i seguenti file al tuo progetto:
Directory<module-name>
- <lambda-function>.py Function implementation
Se viene fornita l’opzione functionPath, il generatore aggiungerà i file necessari al percorso specificato:
Directory<module-name>
Directory<custom-path>
- <function-name>.py Function implementation
Infrastruttura
Sezione intitolata “Infrastruttura”Poiché questo generatore fornisce infrastruttura come codice basata sul tuo iac scelto, creerà un progetto in packages/common che include i costrutti CDK o i moduli Terraform pertinenti.
Il progetto comune di infrastruttura come codice è strutturato come segue:
Directorypackages/common/constructs
Directorysrc
Directoryapp/ Constructs for infrastructure specific to a project/generator
- …
Directorycore/ Generic constructs which are reused by constructs in
app- …
- index.ts Entry point exporting constructs from
app
- project.json Project build targets and configuration
Directorypackages/common/terraform
Directorysrc
Directoryapp/ Terraform modules for infrastructure specific to a project/generator
- …
Directorycore/ Generic modules which are reused by modules in
app- …
- project.json Project build targets and configuration
Il generatore crea infrastructure as code per il deployment della tua funzione in base al tuo iac selezionato:
Il generatore crea costrutti CDK che possono essere utilizzati per il deployment della tua funzione, che risiedono nella directory packages/common/constructs.
Il generatore crea un modulo Terraform che può essere utilizzato per il deployment della tua funzione, che risiede nella directory packages/common/terraform/src/app/lambda-functions/<function-name>.
Architettura
Sezione intitolata “Architettura”La funzione distribuita ha la seguente architettura:
Il generatore fornisce la funzione stessa; è necessario collegare la sorgente degli eventi nello stack per invocarla (ad esempio, un’integrazione API Gateway, una regola EventBridge, una notifica S3 o un mapping di sorgente eventi SQS).
Implementare la tua Funzione
Sezione intitolata “Implementare la tua Funzione”L’implementazione principale della funzione si trova in <function-name>.py. Ecco un esempio:
import os
from aws_lambda_powertools import Logger, Metrics, Tracerfrom aws_lambda_powertools.metrics import MetricUnitfrom aws_lambda_powertools.utilities.parser import event_parserfrom aws_lambda_powertools.utilities.parser.models import EventBridgeModelfrom aws_lambda_powertools.utilities.typing import LambdaContext
os.environ["POWERTOOLS_METRICS_NAMESPACE"] = "Foo"os.environ["POWERTOOLS_SERVICE_NAME"] = "Foo"
logger: Logger = Logger()metrics: Metrics = Metrics()tracer: Tracer = Tracer()
@tracer.capture_lambda_handler@metrics.log_metrics@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump() }) metrics.add_metric(name="InvocationCount", unit=MetricUnit.Count, value=1)
try: # TODO: Implement metrics.add_metric(name="SuccessCount", unit=MetricUnit.Count, value=1) # TODO: Implement success response if required except Exception as e: logger.exception(e) metrics.add_metric(name="ErrorCount", unit=MetricUnit.Count, value=1) # TODO: Implement error response if requiredIl generatore configura automaticamente diverse funzionalità:
- Integrazione di AWS Lambda Powertools per l’osservabilità
- Raccolta di metriche
- Type-safety utilizzando
@event_parser
Osservabilità con AWS Lambda Powertools
Sezione intitolata “Osservabilità con AWS Lambda Powertools”Logging
Sezione intitolata “Logging”Il generatore configura il logging strutturato utilizzando AWS Lambda Powertools.
def lambda_handler(event: EventBridgeModel, context: LambdaContext): logger.info("Received event", extra={"event": event.model_dump()})Il logger include automaticamente:
- Richieste di eventi
- Informazioni sul contesto Lambda
- Indicatori di cold start
Tracing
Sezione intitolata “Tracing”Il tracing AWS X-Ray è configurato automaticamente. Puoi aggiungere subsegment personalizzati alle tue tracce:
def lambda_handler(event: EventBridgeModel, context: LambdaContext): # Creates a new subsegment with tracer.provider.in_subsegment("function-subsegment"): # Your logic here return ....Metriche
Sezione intitolata “Metriche”Le metriche CloudWatch vengono raccolte automaticamente per ogni richiesta. Puoi aggiungere metriche personalizzate:
def lambda_handler(event: EventBridgeModel, context: LambdaContext): metrics.add_metric(name="NewMetric", unit=MetricUnit.Count, value=1) return ...Le metriche predefinite includono:
- Conteggi delle invocazioni
- Conteggi di successo/fallimento
- Metriche di cold start
Type Safety
Sezione intitolata “Type Safety”Se hai scelto un event durante la generazione della tua funzione lambda, la tua funzione è instrumentata con @event_parser da AWS Lambda Powertools. Per esempio:
@event_parser(model=EventBridgeModel)def lambda_handler(event: EventBridgeModel, context: LambdaContext): event.detail_type # <- type-safe with IDE autocompletionQuesto ti permette di definire modelli di dati utilizzando Pydantic, in modo simile a lavorare con Fast API.
Se hai selezionato Any per il tuo event, il decorator @event_parser non viene applicato e l’handler riceve un dict di eventi non tipizzato. Rigenera con un event specifico se desideri la validazione Pydantic e l’accesso ai campi tipizzati.
Bundling
Sezione intitolata “Bundling”Il generatore configura automaticamente il bundling Python per i pacchetti di deployment Lambda utilizzando uv:
pnpm nx bundle <project-name>yarn nx bundle <project-name>npx nx bundle <project-name>bunx nx bundle <project-name>Questo processo utilizza:
uv exportper esportare le tue dipendenze Python in un filerequirements.txtuv pip installper installare le dipendenze per la piattaforma di destinazione (x86_64-manylinux_2_28) per il deployment Lambda
Deployment della tua Funzione
Sezione intitolata “Deployment della tua Funzione”Questo generatore crea infrastruttura come codice CDK o Terraform in base al tuo iac selezionato. Puoi utilizzarlo per distribuire la tua funzione.
Questo generatore crea un costrutto CDK per distribuire la tua funzione nella cartella common/constructs. Puoi utilizzarlo in un’applicazione CDK:
import { MyProjectMyFunction } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Add the function to your stack const fn = new MyProjectMyFunction(this, 'MyFunction'); }}Questo configura:
- Funzione AWS Lambda
- Gruppo di log CloudWatch
- Configurazione del tracciamento X-Ray
- Namespace delle metriche CloudWatch
Questa funzione può quindi essere utilizzata come destinazione per qualsiasi sorgente di eventi lambda:
L’esempio seguente dimostra il codice CDK per invocare la tua funzione lambda secondo una pianificazione utilizzando EventBridge:
import { Rule, Schedule } from 'aws-cdk-lib/aws-events';import { LambdaFunction } from 'aws-cdk-lib/aws-events-targets';import { MyProjectMyFunction } from '@my-scope/common-constructs';
export class ExampleStack extends Stack { constructor(scope: Construct, id: string) { // Add the function to your stack const fn = new MyProjectMyFunction(this, 'MyFunction');
// Add the function to an EventBridge scheduled rule const eventRule = new Rule(this, 'MyFunctionScheduleRule', { schedule: Schedule.cron({ minute: '15' }), targets: [new LambdaFunction(fn)], }); }}Questo generatore crea un modulo Terraform per distribuire la tua funzione nella cartella common/terraform. Istanzia il modulo condiviso core/asset-bucket una volta per distribuzione e passa il suo bucket_name nell’input asset_bucket_name:
module "asset_bucket" { source = "../../common/terraform/src/core/asset-bucket"}
module "my_project_my_function" { source = "../../common/terraform/src/app/lambda-functions/my-project-my-function"
asset_bucket_name = module.asset_bucket.bucket_name
env = { SOME_VARIABLE = "some value" }
additional_iam_policy_statements = [ # Add any additional permissions your function needs ]}Questo configura:
- Funzione AWS Lambda
- Gruppo di log CloudWatch
- Configurazione del tracciamento X-Ray
- Namespace delle metriche CloudWatch
Questa funzione può quindi essere utilizzata come destinazione per qualsiasi sorgente di eventi lambda. L’esempio seguente dimostra il codice Terraform per invocare la tua funzione lambda secondo una pianificazione utilizzando EventBridge:
# EventBridge rule for scheduled executionresource "aws_cloudwatch_event_rule" "my_function_schedule" { name = "my-function-schedule" description = "Trigger my function every 15 minutes" schedule_expression = "cron(15 * * * ? *)"}
# EventBridge targetresource "aws_cloudwatch_event_target" "lambda_target" { rule = aws_cloudwatch_event_rule.my_function_schedule.name target_id = "MyFunctionTarget" arn = module.my_project_my_function.function_arn}
# Permission for EventBridge to invoke the Lambda functionresource "aws_lambda_permission" "allow_eventbridge" { statement_id = "AllowExecutionFromEventBridge" action = "lambda:InvokeFunction" function_name = module.my_project_my_function.function_name principal = "events.amazonaws.com" source_arn = aws_cloudwatch_event_rule.my_function_schedule.arn}