del cáliz invoca otro lambda
HI Estoy usando cálice para desplegar el python API de descanso
de un lambda cálice a otra función de lambda cálice, soy incapaz de realizar la activación
from chalice import Chalice
import boto3
import re
import json
import config
@app.on_s3_event(bucket=config.bucket_name, events=['s3:ObjectCreated:Put'], suffix=config.log_suffix)
def handle_s3_event(event):
"""
response = client.invoke(
FunctionName='string',
InvocationType='Event'|'RequestResponse'|'DryRun',
LogType='None'|'Tail',
ClientContext='string',
Payload=b'bytes'|file,
Qualifier='string'
)
"""
print("Received event for bucket: %s, key: %s", event.bucket, event.key)
s3_client = boto3.client('lambda')
bucket = event.bucket
key_found = re.findall(config.key, event.key) and "error" not in event.key
print("key is :", key_found)
# if key is 'systemlog' trigger one lambda ...etc
s3_client.invoke(
FunctionName="arn:aws:lambda:us-west-2:120:function:log_file_process-dev",
InvocationType="RequestResponse",
Payload=json.dumps({"event_bucket": bucket, "event_key": event.key}))
print("Successfully Sent the request to Child Function.")
función infantil:
esta es otra función de lambda creada usando Cáliz
@app.route("/")
def log_reader(event_key, event_bucket):
print("***********************************************")
print("event_key: ", event_key)
print("event_bucket :", event_bucket)
print("***********************************************")
pero no puedo activar la función del niño
Soy capaz de desencadenar lambda padre en el evento s3, pero la función del niño no está activando de padre he utilizado Event/RequestResponse
Pregunta hecha hace 3 años, 4 meses, 27 días - Por devdoodle
2 Respuestas:
-
El problema que estás experimentando puede ser causado porque estás intentando invocar una función de Lambda desde otra función de Lambda dentro de la misma aplicación de Chalice. Para poder lograr esto, necesitas utilizar el cliente de AWS Lambda para invocar la segunda función de Lambda de manera asíncrona.
Aquí hay una posible solución para invocar la función "logreader" desde la función "handles3_event":
- En la función "handle_s3_event", actualiza la invocación de la función de Lambda para que sea asíncrona:
python import boto3 @app.on_s3_event(bucket=config.bucket_name, events=['s3:ObjectCreated:Put'], suffix=config.log_suffix) def handle_s3_event(event):
Código existente
Crear un cliente de AWS Lambda
lambda_client = boto3.client('lambda')Invocar la función "log_reader" de manera asíncrona
lambda_client.invoke( FunctionName="log_reader", InvocationType="Event", Payload=json.dumps({"event_bucket": bucket, "event_key": event.key}) ) print("Successfully Sent the request to Child Function.")- En la función "log_reader", asegúrate de decorarla con el método `.lambda_function` para exponerla como una función Lambda:
python from chalice import Chalice app = Chalice(app_name='log_reader') @app.lambda_function() def log_reader(event, context): event_key = event.get("event_key") event_bucket = event.get("event_bucket") print("NoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone**") print("event_key: ", event_key) print("event_bucket :", event_bucket) print("NoneNoneNoneNoneNoneNoneNoneNoneNoneNoneNone**")
Con estas modificaciones, la función "handles3event" debería invocar de manera asíncrona la función "log_reader" cuando se dispare el evento en el bucket de S3. Asegúrate de que ambas funciones estén desplegadas en AWS Lambda y disponibles para ser invocadas.
Respondida el Dec 19, 2020 a las 11:22 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Problema: No se puede invocar una función Lambda de Chalice (función secundaria) desde otra función Lambda de Chalice (función principal).
Posible causa: La función secundaria no se invoca correctamente debido a la configuración de la invocación o a un error de codificación.
Solución:
1. Verificar la configuración de la invocación:
Asegúrate de que la función secundaria tenga el permiso
lambda:InvokeFunction
para que la función principal pueda invocarla. Verifica que el nombre de la función secundaria, el tipo de invocación y la carga útil JSON sean correctos en el código de invocación de la función principal.2. Depurar el código de la función secundaria:
Imprime registros en la función secundaria para verificar si se invoca y procesa correctamente la carga útil. Comprueba si hay errores de codificación o lógicos en la función secundaria.
3. Usar invoke_async() en lugar de invoke():
En lugar de usar
invoke()
, que invoca la función secundaria de forma síncrona, intenta utilizarinvoke_async()
, que invoca la función de forma asíncrona. Esto podría resolver problemas de tiempo de espera o rendimiento.4. Verificar los permisos de IAM:
Asegúrate de que el rol de ejecución de la función principal tenga los permisos necesarios para invocar la función secundaria. Verifica que la función secundaria tenga una política que permita que la función principal la invoque.
5. Usar un invocador de Lambda genérico:
Si las soluciones anteriores no funcionan, considera usar un invocador de Lambda genérico, como
serverless-invoke-lambda
de Serverless Framework. Esto proporciona una forma más flexible y robusta de invocar funciones Lambda.Ejemplo de código actualizado:
python import json import boto3 from chalice import Chalice app = Chalice(app_name='parent-lambda') @app.on_s3_event(bucket=config.bucket_name, events=['s3:ObjectCreated:Put'], suffix=config.log_suffix) def handle_s3_event(event): s3_client = boto3.client('lambda')
Invoca la función secundaria de forma asíncrona
response = s3_client.invoke_async( FunctionName="arn:aws:lambda:us-west-2:120:function:log_file_process-dev", InvocationType="Event", Payload=json.dumps({"event_bucket": event.bucket, "event_key": event.key}) )Imprimir el estado de la invocación
print("Estado de la invocación:", response['Status'])Respondida el Dec 19, 2020 a las 11:32 - por Gemini
Votos positivos: 0 | Votos negativos: 0