Tengo una función lambda simple que se encuentra en el siguiente punto final:
https://******.execute-api.eu-west-2.amazonaws.com/lambda/add?x=1&y=2
AWS Chalice se utilizó para agregar puntos de enlace simples aquí.
@app.route('/{exp}', methods=['GET']) def add(exp): app.log.debug("Received GET request...") request = app.current_request app.log.debug(app.current_request.json_body) x = request.query_params['x'] y = request.query_params['y'] if exp == 'add': app.log.debug("Received ADD command...") result = int(x) + int(y) return {'add': result} Básicamente, verifica si la path es igual a add y suma dos valores de query_params .
Ahora, estoy tratando de invocar esta lambda en otra lambda.
Mi pregunta:
¿Cómo puedo pasar la path y query_params a mi función lambda original usando el cliente boto3 lambda?
Lo que he probado hasta ahora:
Agregué dos líneas al archivo policy.json que me permiten invocar la función original.
Vi muchas preguntas similares en StackOverflow, pero la mayoría de ellas pasan la carga útil como json.
@app.route('/') def index(): lambda_client = boto3.client('lambda') invoke_response = lambda_client.invoke( FunctionName="function-name", InvocationType="RequestResponse" ) app.log.debug(invoke_response['Payload'].read())¡Gracias de antemano!
Tal vez pueda agregar el siguiente código a su función de agregar, para que también acepte cargas útiles:
@app.route('/{exp}', methods=['GET']) def add(exp, *args, **kwargs): if isinstance(exp, dict): # exp is event here request = exp.get('request', {'x': 0, 'y': 0}) exp = exp.get('exp', 'add') Voy a escribir un ejemplo general, y puedes modificarlo fácilmente para que se ajuste a tus necesidades. En su caso, el diccionario de datos tendría claves de request y exp , y necesita encontrar el arn de su función lambda.
Documentación de AWS Lambda.invoke
Supongamos que de ahora en adelante tenemos 2 Lambdas llamados "maestro" y "esclavo". el maestro llamará esclavo.
Actualmente existen 3 tipos de invocaciones:
Me quedo con #1 RequestResponse:
Esclavo:
def lambda_handler(event, context): result = {} result['event'] = event result['result'] = "It's ok" return result Y su arn es algo así como arn:aws:lambda:us-east-1:xxxxxxxxxxxxxx:function:slave
En el ejemplo, el esclavo es solo una función de eco.
Ahora, el maestro necesita el permiso del rol necesario para llamarlo y el arn o nombre. Entonces puedes escribir algo como esto:
import boto3 from datetime import datetime import json client = boto3.client('lambda') def lambda_handler(event, context): arn = 'arn:aws:lambda:us-east-1:xxxxxxxxxxxxxx:function:slave' data = {'my_dict': {'one': 1, 'two': 2}, 'my_list': [1,2,3], 'my_date': datetime.now().isoformat()} response = client.invoke(FunctionName=arn, InvocationType='RequestResponse', Payload=json.dumps(data)) result = json.loads(response.get('Payload').read()) return result Por lo general, obtendría arn con algo como os.environ.get('slave_arn')
Todos los datos de/a lambdas deben ser JSON serializables.