Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

812
Views
AWS Lambda: llame a la función desde otro AWS lambda usando la invocación de boto3

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!

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

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:

  1. RequestResponse (predeterminado): el maestro llama y espera la respuesta del esclavo
  2. Evento: Asíncrono, llamadas maestras y olvidos
  3. DryRun: Verifique un poco antes de ejecutar

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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!