Creación de una UDF de Lambda escalar - Amazon Redshift

Creación de una UDF de Lambda escalar

Amazon Redshift puede utilizar funciones personalizadas definidas en AWS Lambda como parte de las consultas SQL. Puede escribir UDF de Lambda escalares en cualquier lenguaje de programación admitido por Lambda, como Java, Go, PowerShell, Node.js, C#, Python y Ruby. También puede utilizar un tiempo de ejecución personalizado.

Las UDF de Lambda se definen y administran en Lambda. Además, puede controlar los privilegios de acceso para invocar estas UDF en Amazon Redshift. Puede invocar varias funciones de Lambda en la misma consulta o invocar la misma función varias veces.

Utilice las UDF de Lambda en cualquier cláusula de las instrucciones SQL donde se admitan funciones escalares. También puede utilizar las UDF de Lambda en cualquier instrucción SQL, como SELECT, UPDATE, INSERT o DELETE.

nota

El uso de las UDF de Lambda puede generar cargos adicionales por el servicio Lambda. Si esto sucede o no depende de distintos factores, como el número de solicitudes de Lambda (invocaciones de UDF) y la duración total de la ejecución del programa Lambda. No obstante, no se generan cargos adicionales por el uso de las UDF de Lambda en Amazon Redshift. Para obtener información acerca de los precios de AWS Lambda, consulte Precios de AWS Lambda.

El número de solicitudes de Lambda varía según la cláusula de instrucción SQL específica en la que se utiliza la UDF de Lambda. Por ejemplo, supongamos que la función se utiliza en una cláusula WHERE como la siguiente.

SELECT a, b FROM t1 WHERE lambda_multiply(a, b) = 64; SELECT a, b FROM t1 WHERE a*b = lambda_multiply(2, 32)

En este caso, Amazon Redshift llama a la primera instrucción SELECT para cada una y llama a la segunda instrucción SELECT solo una vez.

No obstante, es posible que el uso de una UDF en la parte de proyección de la consulta solo invoque la función de Lambda una vez por cada fila calificada o agrupada en el conjunto de resultados.

Registro de una UDF de Lambda

El comando CREATE EXTERNAL FUNCTION crea los siguientes parámetros:

  • (Opcional) Una lista de argumentos con tipo de datos.

  • Un tipo de datos de retorno.

  • Un nombre de función de la función externa a la que llama Amazon Redshift.

  • Un rol de IAM que el clúster de Amazon Redshift está autorizado a asumir y llamar a Lambda.

  • Un nombre de función de Lambda que invoca la UDF de Lambda.

Para obtener más información acerca de CREATE EXTERNAL FUNCTION, consulte CREATE EXTERNAL FUNCTION.

Los tipos de datos de entrada y retorno para esta función pueden ser cualquier tipo de datos de Amazon Redshift estándar.

Amazon Redshift se asegura de que la función externa pueda enviar y recibir argumentos y resultados en lotes.

Administración de la seguridad y los privilegios de una UDF de Lambda

Para crear una UDF de Lambda, asegúrese de tener los permisos de uso en LANGUAGE EXFUNC. Debe conceder de forma explícita USAGE ON LANGUAGE EXFUNC o revocar USAGE ON LANGUAGE EXFUNC a usuarios, grupos o público específicos.

En el siguiente ejemplo, se establece el uso de EXFUNC como PUBLIC.

grant usage on language exfunc to PUBLIC;

En el siguiente ejemplo, se revoca el permiso de uso PUBLIC de exfunc y se concede el permiso de uso al grupo de usuarios lambda_udf_devs.

revoke usage on language exfunc from PUBLIC; grant usage on language exfunc to group lambda_udf_devs;

Para ejecutar una UDF de Lambda, asegúrese de tener permiso para cada función a la que se llama. De manera predeterminada, se establece como PUBLIC el permiso para ejecutar las UDF de Lambda nuevas. Para restringir el uso, revoque el permiso PUBLIC para la función. Luego, conceda el privilegio a usuarios o grupos específicos.

En el siguiente ejemplo, se revoca la ejecución de la función exfunc_sum como PUBLIC. Luego, se concede el uso al grupo de usuarios lambda_udf_devs.

revoke execute on function exfunc_sum(int, int) from PUBLIC; grant execute on function exfunc_sum(int, int) to group lambda_udf_devs;

De manera predeterminada, los superusuarios tienen todos los privilegios.

Para obtener más información sobre cómo conceder y revocar privilegios, consulte GRANT y REVOKE.

Configuración del parámetro de autorización para las UDF de Lambda

El comando CREATE EXTERNAL FUNCTION requiere autorización para invocar funciones de Lambda en AWS Lambda. Para comenzar la autorización, especifique un rol de AWS Identity and Access Management (IAM) cuando ejecute el comando CREATE EXTERNAL FUNCTION. Para obtener más información acerca de los roles de IAM, consulte Roles de IAM en Guía del usuario de IAM.

Si ya existe un rol de IAM con permisos para invocar funciones de Lambda adjuntas a su clúster, puede sustituir el nombre de recurso de Amazon (ARN) del rol en el parámetro IAM_ROLE con el comando. En las siguientes secciones, se describen los pasos para utilizar un rol de IAM en el comando CREATE EXTERNAL FUNCTION.

Creación de un rol de IAM para Lambda

El rol de IAM requiere permiso para invocar funciones de Lambda. Cuando cree el rol de IAM, proporcione el permiso a través de una de las siguientes maneras:

  • Adjunte la política AWSLambdaRole en la página Attach permissions policy (Adjuntar política de permisos) cuando cree un rol de IAM. La política AWSLambdaRole concede permisos para invocar funciones de Lambda, que es el requisito mínimo. Para obtener más información y otras políticas, consulte Políticas de IAM basadas en identidad para AWS Lambda en la Guía para desarrolladores de AWS Lambda.

  • Cree su propia política personalizada para adjuntarla a su rol de IAM con el permiso lambda:InvokeFunction de todos los recursos o de una función de Lambda en particular con el ARN de esa función. Para obtener más información sobre cómo crear una política, consulte Creación de políticas de IAM en la Guía del usuario de IAM.

    La siguiente política de ejemplo permite invocar a Lambda en una función de Lambda en particular.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function" } ] }

    Para obtener más información sobre los recursos para funciones de Lambda, consulte Recursos y condiciones para acciones de Lambda en la Referencia de la API de IAM.

    Después de crear una política personalizada con los permisos necesarios, puede adjuntar la política al rol de IAM en la página Attach permissions policy (Adjuntar política de permisos) cuando cree un rol de IAM.

Para conocer los pasos que se deben realizar para crear un rol de IAM, consulte Autorización de Amazon Redshift para acceder a otros servicios de AWS en su nombre en la Guía de administración de Amazon Redshift.

Si no desea crear un rol de IAM nuevo, puede agregar los permisos mencionados anteriormente a su rol de IAM existente.

Asociación de un rol de IAM al clúster

Adjunte el rol de IAM a su clúster. Puede agregar un rol a un clúster o ver los roles asociados a un clúster mediante la consola de administración, la CLI o la API de Amazon Redshift. Para obtener más información, consulte Asociación de un rol de IAM a un clúster en la Guía de administración de Amazon Redshift.

Inclusión del rol de IAM en el comando

Incluya el ARN del rol de IAM en el comando CREATE EXTERNAL FUNCTION. Al crear un rol de IAM, IAM devuelve el Amazon Resource Name (ARN, Nombre de recurso de Amazon) del rol. Para especificar un rol de IAM, proporcione el ARN del rol con el parámetro IAM_ROLE. A continuación, se muestra la sintaxis del parámetro IAM_ROLE.

IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'

Para invocar funciones de Lambda que se encuentran en otras cuentas dentro de la misma región, consulte Encadenamiento de roles de IAM en Amazon Redshift.

Uso de la interfaz JSON entre Amazon Redshift y AWS Lambda

Amazon Redshift utiliza una interfaz común para todas las funciones de Lambda con las que Amazon Redshift se comunica.

La siguiente tabla muestra la lista de campos de entrada con las funciones designadas de Lambda que puede esperar con la carga de JSON.

Nombre del campo

Descripción

Rango de valor
request_id Un identificador único universal (UUID) que identifica de manera inequívoca cada solicitud de invocación

Un UUID válido

Clúster

El nombre de recurso de Amazon (ARN) completo del clúster

Un ARN de clúster válido

usuario

El nombre del usuario que realiza la llamada Un nombre de usuario válido

base de datos

El nombre de la base de datos en la que se ejecuta la consulta Un nombre de base de datos válido

external_function

El nombre válido y completo de la función externa que realiza la llamada Un nombre válido y completo de función

query_id

El ID de la consulta que realiza la llamada Un ID de consulta válido

num_records

El número de argumentos de la carga Un valor de 1 - 2^64

arguments

La carga de datos en el formato especificado Los datos en formato de matriz deben estar en una matriz JSON. Cada elemento es un registro que es una matriz si el número de argumentos es mayor que 1. Mediante el uso de una matriz, Amazon Redshift conserva el orden de los registros de la carga.

El orden de la matriz JSON determina el orden del procesamiento por lotes. La función de Lambda debe procesar los argumentos de manera iterativa y producir el número exacto de registros. A continuación, se muestra un ejemplo de carga.

{ "request_id" : "23FF1F97-F28A-44AA-AB67-266ED976BF40", "cluster" : "arn:aws:redshift:xxxx", "user" : "adminuser", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }

La salida de la función de Lambda contiene los siguientes campos.

Nombre del campo

Descripción

Rango de valor
success La indicación del éxito o del error de la función

Un valor de "true" o "false"

error_msg

El mensaje de error si el valor de éxito se establece como "false" (si la función presenta error); de lo contrario, este campo se ignora.

Un mensaje válido

num_records

El número de registros de la carga Un valor de 1 - 2^64

results

Los resultados de la llamada en el formato especificado N/A

El siguiente es un ejemplo de la salida de la función de Lambda.

{ "success": true, // true indicates the call succeeded "error_msg" : "my function isn't working", // shall only exist when success != true "num_records": 4, // number of records in this payload "results" : [ 1, 4, null, 7 ] }

Cuando llama a las funciones de Lambda desde consultas SQL, Amazon Redshift garantiza la seguridad de la conexión con las siguientes consideraciones:

  • Permisos GRANT y REVOKE. Para obtener más información acerca de la seguridad y los privilegios de UDF, consulte Privilegios y seguridad de las UDF.

  • Amazon Redshift solo envía el conjunto mínimo de datos a la función de Lambda designada.

  • Amazon Redshift solo llama a la función de Lambda designada con el rol de IAM designado.