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.
Temas
- Paso 1: configure la instancia de base de datos de RDS for PostgreSQL para conexiones salientes a AWS Lambda.
- Paso 2: configure IAM para su instancia de base de datos de RDS for PostgreSQL y AWS Lambda.
- Paso 3: instale la extensión de aws_lambda para una instancia de base de datos de RDS for PostgreSQL
- Paso 4: utilice las funciones auxiliares de Lambda con su instancia de base de datos de RDS for PostgreSQL (Opcional)
- Paso 5: invoque una función de Lambda desde su instancia de base de datos de RDS for PostgreSQL
- Paso 6: Conceder permiso a otros usuarios para invocar las funciones de Lambda
- Ejemplos: invoque las funciones de Lambda desde su instancia de base de datos de RDS for PostgreSQL
- Mensajes de error de la función de Lambda
- Referencia de parámetros y funciones 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 derds.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 de0
a1
.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.
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-functionTambié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.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" } ] }'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-namerds-lambda-role
--regionaws-region
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
\ --regionaws-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.
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 depostgres
se muestra en el ejemplo.psql -h
instance.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
-
Instale la extensión de
aws_lambda
. La extensión deaws_commons
también es necesaria. Proporciona funciones auxiliares paraaws_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 conaws_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ónaws_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.
Para invocar una función de ejemplo
Conéctese a la instancia de base de datos con
psql
o pgAdmin.psql -h
instance.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
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
Conéctese a la instancia de base de datos con
psql
o pgAdmin.psql -h
instance.444455556666.
.rds.amazonaws.com -U postgres -p 5432aws-region
Ejecute los siguientes comandos SQL:
postgres=>
GRANT USAGE ON SCHEMA aws_lambda TOdb_username
; GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TOdb_username
;