Truco 1: Recursividad asíncrona.
A veces queremos garantizar que una lambda se ejecute siempre de forma asíncrona.
def lambda_handler(event, context):
if not event.get('async'):
invoke_self_async(event, context)
return
def invoke_self_async(event, context):
new_event = {
'async': True,
'data': event
}
boto3.client('lambda').invoke_async(
FunctionName=context.invoked_function_arn,
InvokeArgs=json.dumps(new_event)
)
Este truco es muy útil cuando no nos interesa el resultado de la ejecución o el mismo es enviado por vías alternativas (ej. usando SNS)
Truco 2: Planificación dinámica.
A veces la planificación de un servicio debe ser alterada en dependencia de ciertas condiciones.
def lambda_handler(event, context):
reschedule_event()
keep_working()
REGULAR_SCHEDULE = 'rate(20 minutes)'
WEEKEND_SHEDULE = 'rate(1 hour)'
RULE_NAME = 'My Rule'
def reschedule_event():
"""
Cambia la planificación de la lambda, para que descanse los findes :D
"""
sched = boto3.client('events')
current = sched.describe_rule(Name=RULE_NAME)
if is_weekend() and 'minutes' in current['ScheduleExpression']:
sched.put_rule(
Name=RULE_NAME,
ScheduleExpression=WEEKEND_SCHEDULE,
)
if not is_weekend and 'hour' in current['ScheduleExpression']:
sched.put_rule(
Name=RULE_NAME,
ScheduleExpression=REGULAR_SCHEDULE,
)
Truco 3: Flujos de negocio
Cuando vayas a usar StepFunctions recuerda:
Nunca uses un cañón para matar un mosquito
def lambda_handler(event, context):
return dispatch_workflow(event)
def dispatch_workflow(activity):
workflow_id = event.get('workflow_id'):
if workflow_id:
# Retrieve the state from Dynamo
state = get_saved_state(event['workflow_id'])
else:
workflow_id = create_workflow_id() # uuid maybe
state = None
workflow = Workflow(workflow_id)
return workflow(state,events) # Workflow is a callable