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 utilizar invoke_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