Invocar una función de AWS Lambda desde una instancia de base de datos de RDS for PostgreSQL - Amazon Relational Database Service

Invocar una función de AWS Lambda desde una instancia de base de datos de RDS for PostgreSQL

AWS Lambda es un servicio de computación controlado por eventos que permite ejecutar código sin aprovisionar ni administrar servidores. Está disponible para su uso con muchos servicios de AWS, incluidos RDS for PostgreSQL. Por ejemplo, puede utilizar funciones de Lambda para procesar notificaciones de eventos desde una base de datos o para cargar datos desde archivos cada vez que se carga un nuevo archivo en Simple Storage Service (Amazon S3). Para obtener más información sobre Lambda, consulte ¿Qué es AWS Lambda? en la Guía para desarrolladores de AWS Lambda.

nota

La invocación de una función de AWS Lambda se admite en estas versiones de RDS for PostgreSQL:

  • Todas las versiones 16 de PostgreSQL

  • Todas las versiones 15 de PostgreSQL

  • PostgreSQL 14.1 y versiones secundarias posteriores

  • PostgreSQL 13.2 y versiones secundarias posteriores

  • PostgreSQL 12.6 y versiones secundarias posteriores

La configuración de RDS for PostgreSQL para trabajar con las funciones de Lambda es un proceso de varios pasos que incluye AWS Lambda, IAM, su VPC y su instancia de base de datos de RDS for PostgreSQL. A continuación, se muestran resúmenes de los pasos necesarios.

Para obtener más información acerca de las funciones de Lambda, consulte Introducción a Lambda y Conceptos básicos de AWS Lambda en la Guía para desarrolladores de AWS Lambda.

Paso 1: configure la instancia de base de datos de RDS for PostgreSQL para conexiones salientes a AWS Lambda.

Las funciones de Lambda siempre se ejecutan dentro de una Amazon VPC propiedad del servicio de AWS Lambda. Lambda aplica acceso a la red y reglas de seguridad a esta VPC y mantiene y supervisa la VPC automáticamente. Su instancia de base de datos de RDS for PostgreSQL envía tráfico de red a la VPC del servicio de Lambda. La manera en que se configura esto depende de si la instancia de base de datos es pública o privada.

  • Instancia de base de datos de RDS for PostgreSQL pública: una instancia de base de datos es pública si se encuentra en una subred pública de la VPC y si la propiedad “PubliclyAccessible” de la instancia es true. Para encontrar el valor de esta propiedad, puede utilizar el comando describe-db-instances de AWS CLI. O, si lo desea, puede utilizar AWS Management Console para abrir la pestaña Connectivity & security (Conectividad y seguridad) y verificar que Publicly accessible (Acceso público) sea Yes (Sí). Para comprobar que la instancia está en la subred pública de la VPC, puede utilizar la AWS Management Console o la AWS CLI.

    Para configurar el acceso a Lambda, utilice la AWS Management Console o la AWS CLI para crear una regla de salida en el grupo de seguridad de la VPC. La regla de salida especifica que TCP puede utilizar el puerto 443 para enviar paquetes a cualquier dirección IPv4 (0.0.0.0/0).

  • Clúster Instancia de base de datos de RDS PostgreSQL: en este caso, la propiedad “PubliclyAccessible” de la instancia es false o está en una subred privada. Para permitir el funcionamiento de la instancia con Lambda, puede utilizar una puerta de enlace de traducción de direcciones de red (NAT). Para obtener más información, consulte Puerta de enlace NAT. O bien, puede configurar su VPC con un punto de conexión de VPC para Lambda. Para obtener más información, consulte Puntos de enlace de la VPC en la Guía del usuario de Amazon VPC. El punto de conexión responde a las llamadas hechas por su instancia de base de datos de RDS para PostgreSQL a las funciones de Lambda. El punto de conexión de VPC utiliza su propia resolución DNS privada. RDS for PostgreSQL no puede utilizar el punto de conexión de VPC de Lambda hasta que cambie el valor de rds.custom_dns_resolution de su valor predeterminado 0 (no habilitado) a 1. Para ello:

    • Cree un grupo de parámetros de base de datos personalizado.

    • Cambie el valor del parámetro rds.custom_dns_resolution del valor predeterminado de 0 a 1.

    • Modifique la instancia de base de datos para usar el grupo de parámetros de base de datos personalizado.

    • Reinicie la instancia para que el parámetro modificado tenga efecto.

La VPC ahora puede interactuar con la VPC de AWS Lambda en el ámbito de red. A continuación, debe configurar los permisos mediante IAM.

Paso 2: configure IAM para su instancia de base de datos de RDS for PostgreSQL y AWS Lambda.

La invocación de funciones de Lambda desde su instancia de base de datos de RDS for PostgreSQL requiere ciertos privilegios. Para configurar los privilegios necesarios, recomendamos crear una política de IAM que permita invocar funciones de Lambda, asignarla a un rol y, a continuación, aplicar el rol a su instancia de base de datos. Este enfoque da a la instancia de base de datos privilegios para invocar la función de Lambda especificada en su nombre. En los pasos siguientes se muestra cómo hacer esto con AWS CLI.

Para configurar los permisos de IAM para utilizar su instancia de Amazon RDS con Lambda, lleve a cabo el siguiente procedimiento.
  1. Utilice el comando create-policy de AWS CLI para crear una política de IAM que permita a su instancia de base de datos de RDS for PostgreSQL invocar la función de Lambda especificada. (El ID de instrucción [Sid] es una descripción opcional de la instrucción de política y no afecta al uso). Esta política proporciona a su instancia de base de datos los permisos mínimos necesarios para invocar la función de Lambda especificada.

    aws iam create-policy --policy-name rds-lambda-policy --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowAccessToExampleFunction", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:aws-region:444455556666:function:my-function" } ] }'

    También puede utilizar la política predefinida de AWSLambdaRole que le permite invocar cualquiera de las funciones de Lambda. Para obtener más información, consulte Políticas de IAM basadas en identidades para Lambda.

  2. Utilice el comando de la AWS CLI create-role para crear un rol de IAM que la política pueda asumir en tiempo de ejecución.

    aws iam create-role --role-name rds-lambda-role --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "rds.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }'
  3. Aplique la política al rol mediante el comando attach-role-policy de AWS CLI.

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \ --role-name rds-lambda-role --region aws-region
  4. Aplique el rol a su instancia de base de datos de RDS for PostgreSQL mediante el comando add-role-to-db-instance de la AWS CLI. En este último paso se permite a los usuarios de bases de datos de su instancia de base de datos invocar funciones de Lambda.

    aws rds add-role-to-db-instance \ --db-instance-identifier my-instance-name \ --feature-name Lambda \ --role-arn arn:aws:iam::444455556666:role/rds-lambda-role \ --region aws-region

Con la VPC y las configuraciones de IAM completadas, ahora puede instalar la extensión de aws_lambda. (Tenga en cuenta que puede instalar la extensión en cualquier momento, pero hasta que no configure la compatibilidad con VPC y los privilegios de IAM correctos, la extensión de aws_lambda no agrega nada a las capacidades de su instancia de base de datos de RDS for PostgreSQL.

Paso 3: instale la extensión de aws_lambda para una instancia de base de datos de RDS for PostgreSQL

Para utilizar AWS Lambda con su instancia de base de datos de RDS para PostgreSQL, agregue la extensión de PostgreSQL de aws_lambda a su instancia de base de datos de RDS para PostgreSQL. Esta extensión proporciona a su instancia de base de datos de RDS for PostgreSQL la capacidad de llamar a funciones de Lambda desde PostgreSQL.

Para instalar la extensión de aws_lambda en su instancia de base de datos de RDS for PostgreSQL

Utilice la línea de comandos psql de PostgreSQL o la herramienta pgAdmin para conectarse a su instancia de base de datos de RDS for PostgreSQL.

  1. Conéctese a su instancia de base de datos de RDS for PostgreSQL como usuario con privilegios de rds_superuser. El valor predeterminado de usuario de postgres se muestra en el ejemplo.

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. Instale la extensión de aws_lambda. La extensión de aws_commons también es necesaria. Proporciona funciones auxiliares para aws_lambda y muchas otras extensiones de Aurora para PostgreSQL. Si aún no está en su instancia de base de datos de RDS for PostgreSQL, se instala con aws_lambda como se muestra a continuación.

    CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE; NOTICE: installing required extension "aws_commons" CREATE EXTENSION

La extensión de aws_lambda se instala en su instancia de base de datos Ahora puede crear estructuras de conveniencia para invocar las funciones de Lambda.

Paso 4: utilice las funciones auxiliares de Lambda con su instancia de base de datos de RDS for PostgreSQL (Opcional)

Puede utilizar las funciones auxiliares en la extensión de aws_commons para preparar entidades que puede invocar con más facilidad desde PostgreSQL. Para ello, debe tener la siguiente información sobre las funciones de Lambda:

  • Nombre de la función: el nombre, el nombre de recurso de Amazon (ARN), la versión o el alias de la función de Lambda. La política de IAM creada en Paso 2: configure IAM para su instancia y Lambda requiere el ARN, por lo que recomendamos utilizar el ARN de su función.

  • Región de AWS: (Opcional) la región de AWS en la que se encuentra la función de Lambda si no se encuentra en la misma región que su instancia de base de datos de RDS for PostgreSQL.

Para mantener la información del nombre de la función Lambda, utilice la función aws_commons.create_lambda_function_arn. Esta función auxiliar crea una estructura compuesta de aws_commons._lambda_function_arn_1 con los detalles necesarios para la función de invocación. A continuación, encontrará tres enfoques alternativos para configurar esta estructura compuesta.

SELECT aws_commons.create_lambda_function_arn( 'my-function', 'aws-region' ) AS aws_lambda_arn_1 \gset
SELECT aws_commons.create_lambda_function_arn( '111122223333:function:my-function', 'aws-region' ) AS lambda_partial_arn_1 \gset
SELECT aws_commons.create_lambda_function_arn( 'arn:aws:lambda:aws-region:111122223333:function:my-function' ) AS lambda_arn_1 \gset

Cualquiera de estos valores se puede utilizar en las llamadas a la función aws_lambda.invoke. Para ver ejemplos, consulte Paso 5: invoque una función de Lambda desde su instancia de base de datos de RDS for PostgreSQL.

Paso 5: invoque una función de Lambda desde su instancia de base de datos de RDS for PostgreSQL

La función aws_lambda.invoke se comporta de forma sincrónica o asíncrona, según invocation_type. Las dos alternativas para este parámetro son RequestResponse (el valor predeterminado) y Event, como se muestra a continuación.

  • RequestResponse: este tipo de invocación es sincrónico. Es el comportamiento predeterminado cuando la llamada se hace sin especificar un tipo de invocación. La carga de respuesta incluye los resultados de la función aws_lambda.invoke. Utilice este tipo de invocación cuando el flujo de trabajo requiera recibir los resultados de la función de Lambda antes de continuar.

  • Event: este tipo de invocación es asíncrono. La respuesta no incluye una carga que contenga resultados. Utilice este tipo de invocación cuando el flujo de trabajo no necesite un resultado de la función de Lambda para continuar con el procesamiento.

Como simple prueba de la configuración, puede conectarse a la instancia de base de datos mediante psql e invocar una función de ejemplo desde la línea de comandos. Supongamos que tiene una de las funciones básicas configuradas en su servicio Lambda, como la sencilla función de Python que se muestra en la siguiente captura de pantalla.

Ejemplo de función de Lambda de ejemplo que se muestra en AWS CLI para AWS Lambda.
Para invocar una función de ejemplo
  1. Conéctese a la instancia de base de datos con psql o pgAdmin.

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. Invoque la función mediante su ARN.

    SELECT * from aws_lambda.invoke(aws_commons.create_lambda_function_arn('arn:aws:lambda:aws-region:444455556666:function:simple', 'us-west-1'), '{"body": "Hello from Postgres!"}'::json );

    La respuesta tiene el siguiente aspecto.

    status_code | payload | executed_version | log_result -------------+-------------------------------------------------------+------------------+------------ 200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST | (1 row)

Si el intento de invocación no se lleva a cabo correctamente, consulte Mensajes de error de la función de Lambda .

Paso 6: Conceder permiso a otros usuarios para invocar las funciones de Lambda

En este punto de los procedimientos, solo usted como rds_superuser puede invocar las funciones de Lambda. Para permitir que otros usuarios puedan invocar cualquier función que haya creado usted, deberá otorgarles permiso.

Para otorgar permiso para invocar una función de Lambda
  1. Conéctese a la instancia de base de datos con psql o pgAdmin.

    psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
  2. Ejecute los siguientes comandos SQL:

    postgres=> GRANT USAGE ON SCHEMA aws_lambda TO db_username; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TO db_username;