¿Por qué Amazon SNS no invoca mi función de Lambda cuando la activa una alarma de CloudWatch?

6 minutos de lectura
0

Quiero que Amazon Simple Notification Service (Amazon SNS) invoque mi función de AWS Lambda cuando la active una alarma de Amazon CloudWatch.

Breve descripción

Los siguientes escenarios impiden invocar la función de Lambda:

  • La política de recursos de su función de Lambda no ha otorgado acceso para invocar la función desde el tema SNS. En este escenario, siga los pasos del apartado Comprobación del documento de política basada en recursos para la función de Lambda.
  • Las invocaciones de las funciones de Lambda se retrasan. En este escenario, siga los pasos del apartado Comprobación de los registros de entrega de Amazon SNS.

Nota: En esta solución se presupone que puede llamar a la API Publish en su tema de SNS, pero se producen errores entre la integración de Amazon SNS y Lambda. Si no puede ver ninguna actividad en su tema de SNS, consulte ¿Por qué no he recibido una notificación de SNS para activar mi alarma de CloudWatch? Esa actividad puede incluir las siguientes métricas de CloudWatch: NumberOfMessagesPublished, NumberOfNotificationsDelivered o NumberOfNotificationsFailed

Solución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Errores de solución de problemas de la AWS CLI. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Comprobación del documento de política basada en recursos para la función de Lambda

Cuando Amazon SNS invoca una función de Lambda de forma asincrónica, Lambda devuelve un código de estado HTTP 202 a Amazon SNS. Este código de estado indica que Lambda ha aceptado el mensaje para su procesamiento posterior. Para obtener más información, consulte Asynchronous invocation. Si recibe una respuesta errónea, consulte los registros de entrega de Amazon SNS para obtener más información.

Elija una solución en función del escenario de su cuenta.

Si el tema de SNS y la función de Lambda se encuentran en la misma cuenta:

1.    Abra la consola de Lambda.

2.    En el panel de navegación, seleccione Funciones y, a continuación, elija su función.

3.    Seleccione la pestaña Configuración y, a continuación, Permisos.

4.    En la sección Política basada en recursos, elija la instrucción de la política en la columna ID de instrucción para ver el documento de la política. Verá el siguiente documento de política:

statement id
your-statement-id

principal:
sns.amazonaws.com

effect
allow

action
Lambda:InvokeFunction

conditions
{ "arnlike": { "aws:sourcearn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name" }

Nota: Para ver el documento de la política en JSON, seleccione Ver documento de política en la sección Política basada en recursos.

Si le falta la política de recursos de Lambda que otorga acceso a Amazon SNS para invocar la función, añada la siguiente función a su documento de política. Utilice la consola de Lambda, la AWS CLI o AWS CloudShell.

Utilice la línea de comandos como se muestra a continuación:

aws lambda add-permission \
--function-name your-lambda-function-name \
--statement-id triggerfromsns-statement-id \
--action lambda:invokefunction \
--principal sns.amazonaws.com \
--source-arn arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic-name

Nota: Sustituya your-lambda-function-name, your-aws-region, your-aws-account-id y your-sns-topic-name por sus valores. El comando de la AWS CLI usa la región de AWS predeterminada. Puede anular la región predeterminada con el marcador --region si la función de Lambda se encuentra en otra región distinta.

Utilice la consola de Lambda como se muestra a continuación:

1.    Abra la consola de Lambda.

2.    En el panel de navegación, elija Funciones y, a continuación, seleccione su función.

3.    Seleccione la pestaña Configuración y, a continuación, Permisos.

4.    En la sección Política basada en recursos, seleccione Agregar permisos.

5.    En Entidad principal, seleccione sns.amazonaws.com.

6.    En Acciones, seleccione Lambda:InvokeFunction.

7.    En ID de instrucción, introduzca un identificador único.

8.    Seleccione Guardar.

Si el tema de SNS y la función de Lambda se encuentran en cuentas distintas:

1.    Configure permisos entre cuentas.

2.    En sus registros de CloudWatch, utilice el registro del estado de entrega para comprobar que Amazon SNS haya enviado correctamente un mensaje a Lambda o la métrica NumberOfNotificationsDelivered de CloudWatch.

Ejemplo de una respuesta correcta entre Amazon SNS y Lambda:

{
    "notification": {
        "messagemd5sum": "your-md5-sum",
        "messageid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "topicarn": "arn:aws:sns:your-aws-region:your-aws-account-id:your-sns-topic",
        "timestamp": "2021-04-04 14:08:48.083"
    },
    "delivery": {
        "deliveryid": "your-sns-delivery-id",
        "destination": "arn:aws:lambda:your-aws-region:your-aws-account-id:function:your-function-name",
        "providerresponse": "{\ "lambdarequestid\":\ "your-lambda-request-id\"}",
        "dwelltimems": 92,
        "attempts": 1,
        "statuscode": 202
    },
        "status": "success"
}

Comprobación de los registros de entrega de Amazon SNS

Consulte los registros de entrega del tema de SNS a la función de Lambda. Si la respuesta es correcta, verá un código de estado 202.

Para ver los registros de CloudWatch para su tema de SNS, siga estos pasos:

1.    Abra la consola de CloudWatch.

2.    En el panel de navegación, elija Registros y, a continuación, Grupos de registros.

3.    En el cuadro de búsqueda del filtro, introduzca el nombre de tu tema de SNS. Aparecen dos grupos de registro para su tema de SNS: uno para los casos correctos y otro para los que tienen errores.

4.    Elija el grupo de registro correcto.

5.    En la sección Secuencias de registro, seleccione Buscar todos.

Nota: También puede comprobar la marca temporal de la solicitud en la columna Hora del último evento. A continuación, busque el nombre y el ARN (nombre de recurso de Amazon) de la función de Lambda.

6.    En la columna Secuencia de registro, elija la secuencia de registro para abrirla.

Si no ve ningún resultado, siga estos pasos:

1.    Elija Grupos de registros y, a continuación, elija los grupos de registro con errores.

2.    En la sección Secuencias de registro, seleccione Buscar todos.

3.    En la columna Secuencia de registro, elija la secuencia de registro para abrirla.

Para solucionar los problemas de los grupos de registros con errores, siga estos pasos:

1.    Compruebe si los rastros de X-Ray de la función de Lambda tienen un tiempo de permanencia elevado. Si es así, utilice la consola de CloudWatch para comprobar si las funciones de Lambda en esa región tienen el menor número de errores y limitaciones. Asegúrese de seleccionar todas las funciones y, a continuación, elija las métricas Errores y Limitaciones.

Nota: La cola interna de Lambda puede realizar copias de seguridad cuando se invocan cientos de errores y limitaciones en las funciones de forma asincrónica.  Esta copia de seguridad puede retrasar las invocaciones de funciones. Se recomienda mantener la tasa de errores y limitaciones al mínimo para evitar retrasos no deseados. Para obtener más información, consulte Asynchronous invocation.

2.    Defina una cola de Amazon Simple Queue Service (Amazon SQS) o una función de Lambda de destino para gestionarla por separado. De este modo se evita que se pierdan mensajes, porque los eventos asincrónicos pueden tener una antigüedad máxima de seis horas en el caso de una función de Lambda.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace 4 meses