AWS Lambda permet de deployer du code sans gerer de serveurs. Ce n’est pas “sans infrastructure” — c’est une infrastructure dont les contraintes sont differentes.
Les contraintes fondamentales
| Contrainte | Valeur |
|---|---|
| Duree max | 15 minutes |
| Cold start | 100ms - 3s |
| Concurrence defaut | 1000 |
| Taille du package | 50 MB zippe |
Minimiser les cold starts
# Initialiser en dehors du handler (execute une seule fois par container)
import boto3
# Connexion au niveau module
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('orders')
def lambda_handler(event, context):
response = table.get_item(Key={'id': event['order_id']})
return response['Item']
Idempotence obligatoire
Lambda peut invoquer votre fonction plusieurs fois en cas d’erreur. Votre fonction doit etre idempotente.
def lambda_handler(event, context):
order_id = event['order_id']
if is_already_processed(order_id):
return {'statusCode': 200, 'body': 'Already processed'}
process_order(order_id)
mark_as_processed(order_id)
return {'statusCode': 200}
Pattern SQS + Lambda : le plus fiable
def lambda_handler(event, context):
failed_messages = []
for record in event['Records']:
try:
body = json.loads(record['body'])
process_message(body)
except Exception as e:
failed_messages.append({'itemIdentifier': record['messageId']})
return {'batchItemFailures': failed_messages}
Notre formation AWS couvre Lambda avec des ateliers sur architectures serverless.