es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Enviar los atributos de un mensaje en API Gateway V2 no funciona para $request.header.

Estamos intentando conectar la API Gateway V2 con la integración de API SQS. Esta integración funciona correctamente y los mensajes están llegando a la cola.

El problema surge cuando intentamos agregar el valor del encabezado header.sample1 al mensaje.

Normalmente, la solución sugerida es utilizar los atributos del mensaje en la integración, pero eso no está funcionando. En la captura de pantalla a continuación, puedes ver $request.header.sample1. Esperaríamos recibir el valor del encabezado en SQS, pero eso no está sucediendo y en su lugar, la solicitud completa de la API falla.

Imagen

También hemos intentado formatearlo como un objeto:

{"CUSTOM-ATTRIBUTE-NAME": {"DataType": "String", "StringValue":"felippe"}}

Esto funciona correctamente. Sin embargo, si intento lo siguiente:

{"CUSTOM-ATTRIBUTE-NAME": {"DataType": "String", "StringValue":"$request.header.sample1"}}

Esto tampoco funciona. Cualquier cosa que utilice $request.header o $request.body no funciona. Además, intentar utilizar $request.header.sample1 tampoco funciona.

A continuación, se muestran algunas imágenes de cómo estamos llamando al método.

Imagen 1
Imagen 2

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para agregar valor de encabezado al mensaje en la Integración de API Gateway V2 y SQS

    La solución sugerida de usar Atributos de Mensaje en la Integración no funciona al intentar agregar un valor del encabezado header.sample1 al mensaje en la Integración de API Gateway V2 y SQS. Intentar $request.header.sample1 o cualquier cosa utilizando $request.header o $request.body no funciona.

    Sin embargo, podemos formatear el valor del encabezado en un objeto utilizando el siguiente formato:

    {"NOMBRE-DE-ATRIBUTO-PERSONALIZADO": {"DataType": "String", "StringValue":"<valor de="" encabezado="">"}}
    

    Este formato funciona bien en la integración. Pero, si intentamos usar $request.header.sample1 u otra referencia al valor del encabezado, no funciona.

    Para resolver este problema, podemos usar una función Lambda entre la API Gateway V2 y la Integración de SQS. La función Lambda puede extraer el valor del encabezado de la solicitud de API y agregarlo como Atributo de Mensaje en el mensaje SQS.

    Aquí hay un ejemplo de código para la función Lambda utilizando la biblioteca boto3 en Python:

    import json
    import boto3
    
    sqs = boto3.client('sqs')
    
    def lambda_handler(event, context):
        # extraer el valor del encabezado de la solicitud de API
        header_value = event['headers']['sample1'] # reemplace sample1 con la clave del encabezado
    
        # obtener el cuerpo del mensaje de la solicitud de API
        message_body = event['body'] # suponiendo que el cuerpo del mensaje está en formato JSON
    
        # crear atributo de mensaje con el valor del encabezado
        message_attribute = {
            "NOMBRE-DE-ATRIBUTO-PERSONALIZADO": {
                "DataType": "String",
                "StringValue": header_value
            }
        }
    
        # enviar mensaje a SQS con el atributo de mensaje
        response = sqs.send_message(
            QueueUrl='<url de="" la="" cola="" sqs="">',
            MessageBody=json.dumps(message_body),
            MessageAttributes=message_attribute
        )
    
        return {
            'statusCode': 200,
            'body': json.dumps('Mensaje enviado a SQS exitosamente')
        }
    

    La función Lambda extrae el valor del encabezado de la solicitud de API, obtiene el cuerpo del mensaje de la solicitud de API, crea un atributo de mensaje con el valor del encabezado y envía el mensaje a la cola SQS con el atributo de mensaje.

    Para usar esta función Lambda, debemos modificar la API Gateway V2 y la Integración de SQS de la siguiente manera:

    1. En el método de la API Gateway V2, cambie el tipo de integración a función Lambda y seleccione la función Lambda que acabamos de crear.

      ![Configuración de integración del método de API Gateway V2][4]

    2. En la función Lambda, modifique el rol IAM para permitir el acceso al servicio de SQS.

    3. En la cola SQS, cree un nuevo atributo de mensaje con el nombre NOMBRE-DE-ATRIBUTO-PERSONALIZADO para que coincida con el de la función Lambda.

    Después de estas modificaciones, la Integración de API Gateway V2 y SQS deberían funcionar como se esperaba y el mensaje en la cola SQS debería tener el valor del encabezado como un atributo de mensaje.

Comments are closed.