Criar uma UDF do Lambda escalar - Amazon Redshift

Criar uma UDF do Lambda escalar

O Amazon Redshift pode usar funções personalizadas definidas no AWS Lambda como parte de consultas SQL. Você pode escrever UDFs escalares do Lambda em quaisquer linguagens de programação compatíveis com o Lambda, como Java, Go, PowerShell, Node.js, C#, Python e Ruby. Ou você pode usar um tempo de execução personalizado.

As UDFs do Lambda são definidos e gerenciados no Lambda, e você pode controlar os privilégios de acesso para invocar esses UDFs no Amazon Redshift. Você pode invocar várias funções do Lambda na mesma consulta ou invocar a mesma função várias vezes.

Use UDFs do Lambda em quaisquer cláusulas das instruções SQL onde funções escalares são aceitas. Você também pode usar UDFs do Lambda em qualquer instrução SQL, como SELECT, UPDATE, INSERT ou DELETE.

nota

O uso de UDFs do Lambda pode incorrer em custos adicionais do serviço do Lambda. Se ele faz isso depende de fatores como o número de solicitações do Lambda (invocações UDF) e a duração total da execução do programa Lambda. No entanto, não há custo adicional para usar UDFs do Lambda no Amazon Redshift. Para obter mais informações sobre preço do AWS Lambda, consulte AWS LambdaPreço do .

O número de solicitações do Lambda varia dependendo da cláusula de instrução SQL específica em que o UDF do Lambda é usado. Por exemplo, suponha que a função é usada em uma cláusula WHERE como o seguinte.

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

Nesse caso, o Amazon Redshift chama a primeira instrução SELECT para cada uma e chama a segunda instrução SELECT apenas uma vez.

No entanto, usar um UDF na parte de projeção da consulta só pode invocar a função Lambda uma vez para cada linha qualificada ou agregada no conjunto de resultados.

Registrar uma UDF do Lambda

O comando CREATE EXTERNAL FUNCTION cria os seguintes parâmetros:

  • (Opcional) Uma lista de argumentos com tipo de dados.

  • Um tipo de dados de retorno.

  • Um nome de função da função externa chamada pelo Amazon Redshift.

  • Uma função do IAM que o cluster do Amazon Redshift está autorizado a assumir e chamar para o Lambda.

  • Um nome de função do Lambda que o UDF do Lambda chama.

Para obter mais informações sobre CREATE EXTERNAL FUNCTION, consulte CREATE EXTERNAL FUNCTION.

Os tipos de dados de entrada e retorno para esta função podem ser qualquer tipo de dados padrão do Amazon Redshift.

O Amazon Redshift garante que a função externa possa enviar e receber argumentos e resultados em lote.

Gerenciando a segurança e os privilégios da UDF do Lambda

Para criar uma UDF do Lambda, você deve ter permissões para uso no LANGUAGE EXFUNC. Você deve conceder explicitamente USAGE ON LANGUAGE EXFUNC ou revogar USAGE ON LANGUAGE EXFUNC a usuários específicos, grupos ou públicos.

O exemplo a seguir concede uso em EXFUNC para PUBLIC.

grant usage on language exfunc to PUBLIC;

O exemplo a seguir revoga o uso em exfunc de PUBLIC e, em seguida, concede o uso ao grupo de usuários lambda_udf_devs.

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

Para executar uma UDF do Lambda, certifique-se de que você tem permissão para cada função chamada. Por padrão, a permissão para executar novos UDFs do Lambda é concedida a PUBLIC. Para restringir o uso, revogue a execução da função em PUBLIC. Em seguida, conceda o privilégio a usuários ou grupos específicos.

O exemplo a seguir revoga a execução na função exfunc_sum de PUBLIC. Em seguida, ele concede o uso ao grupo de usuários 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;

Os superusuários têm todos os privilégios por padrão.

Para obter mais informações sobre como conceder e revogar privilégios, consulte GRANT e REVOKE.

Configurar o parâmetro de autorização para UDFs do Lambda

O comando CREATE EXTERNAL FUNCTION requer autorização para invocar funções do Lambda no AWS Lambda. Para iniciar a autorização, especifique uma função do AWS Identity and Access Management (IAM) quando você executa o comando CREATE EXTERNAL FUNCTION. Para obter mais informações sobre funções do IAM, consulte Funções do IAM no Manual do usuário do IAM.

Se houver uma função do IAM existente com permissões para invocar funções do Lambda anexadas ao cluster, então você poderá substituir sua função de nome do recurso da Amazon (ARN) no parâmetro IAM_ROLE do comando. As seções a seguir descrevem as etapas para usar uma função do IAM no comando CREATE EXTERNAL FUNCTION.

Criar uma função do IAM para Lambda

A função do IAM requer permissão para invocar funções do Lambda. Ao criar a função do IAM, forneça a permissão de uma das seguintes maneiras:

  • Anexe a política AWSLambdaRole na página Anexar política de permissões ao criar uma função do IAM. A política AWSLambdaRole concede ao permissões para invocar funções do Lambda, que é o requisito mínimo. Para obter mais informações e outras políticas, consulte Políticas do IAM baseadas em identidade para AWS Lambda no Guia do desenvolvedor do AWS Lambda.

  • Crie sua própria política personalizada para anexar à sua função do IAM com a permissão lambda:InvokeFunction de todos os recursos ou uma determinada função do Lambda com o ARN dessa função. Para obter informações sobre como criar políticas, consulte Criar políticas do IAM no Manual do usuário do IAM.

    A política de exemplo a seguir permite invocar o Lambda em uma determinada função do Lambda.

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

    Para obter mais informações sobre recursos para funções do Lambda, consulte Recursos e condições para ações do Lambda na Referência de API do IAM.

    Depois de criar sua política personalizada com as permissões necessárias, você pode anexar sua política à função do IAM na página Anexar política de permissões ao criar uma função do IAM.

Para ver as etapas de como criar um perfil do IAM, consulte “Autorizar o Amazon Redshift a acessar outros serviços da AWS em seu nome” no Guia de gerenciamento de clusters do Amazon Redshift.

Se você não quiser criar uma nova função do IAM, adicione as permissões mencionadas anteriormente à função do IAM existente.

Associar uma função do IAM ao cluster

Anexar a função do IAM ao seu cluster. Você pode adicionar uma função a um cluster ou visualizar as funções associadas a um cluster usando o Console de Gerenciamento do Amazon Redshift, a CLI ou a API. Para obter mais informações, consulte “Autorizar operações COPY, UNLOAD, CREATE EXTERNAL FUNCTION e CREATE EXTERNAL SCHEMA usando funções do IAM” no Guia de gerenciamento de clusters do Amazon Redshift.

Incluir a função do IAM no comando

Inclua o ARN da função do IAM no comando CREATE EXTERNAL FUNCTION. Quando você cria uma função do IAM, o IAM retorna um nome de recurso da Amazon (ARN) para a função. Para especificar uma função do IAM, forneça o ARN da função com o parâmetro IAM_ROLE. A seguir é mostrado a sintaxe do parâmetro IAM_ROLE.

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

Para invocar funções do Lambda que residem em outras contas dentro da mesma região, consulte Encadeando funções do IAM no Amazon Redshift.

Usar a interface JSON entre o Amazon Redshift e AWS Lambda

O Amazon Redshift usa uma interface comum para todas as funções do Lambda com as quais o Amazon Redshift se comunica.

A tabela a seguir mostra a lista de campos de entrada que o Lambda designado funções que você pode esperar para a carga JSON.

Nome do campo

Descrição

Intervalo de valores
request_id Um identificador universalmente exclusivo (UID) que identifica exclusivamente cada solicitação de invocar.

Um UUID válido.

cluster

O nome do recurso da Amazon (ARN) completo do cluster.

Um ARN do cluster válido.

usuário

O nome do usuário que faz a chamada. Um nome de usuário válido.

banco de dados

O nome do banco de dados no qual a consulta está sendo executada. Um nome do banco de dados válido.

external_function

O nome totalmente qualificado da função externa que faz a chamada. Um nome de função totalmente qualificado válido.

query_id

O ID de consulta da consulta que está fazendo a chamada. Um ID de consulta válido.

num_records

O número de argumentos na carga útil. Um valor entre 1 e 2^64.

arguments

A carga útil de dados no formato especificado. Os dados em formato de array devem ser um array JSON. Cada elemento é um registro que é um array se o número de argumentos é maior do que 1. Usando um array, o Amazon Redshift preserva a ordem dos registros na carga útil.

A ordem do array JSON determina a ordem do processamento em lote. A função do Lambda deve processar os argumentos iterativamente e produzir o número exato de registros. Veja a seguir um exemplo de carga útil.

{ "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] ] }

A saída de retorno da função do Lambda contém os campos a seguir.

Nome do campo

Descrição

Intervalo de valores
success A indicação de sucesso ou falha para a função.

Um valor de "true" ou "false".

error_msg

A mensagem de erro se o valor de sucesso for "false" (se a função falhar); caso contrário, este campo será ignorado.

Uma mensagem válida.

num_records

O número de registros na carga útil. Um valor entre 1 e 2^64.

results

Os resultados da chamada no formato especificado. N/D

Veja a seguir um exemplo de uma saída de função do 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 ] }

Quando você chama funções do Lambda a partir de consultas SQL, o Amazon Redshift garante a segurança da conexão com as seguintes considerações:

  • Permissões GRANT e REVOKE. Para obter mais informações sobre segurança e privilégios de UDF, consulte Segurança e privilégios de UDF.

  • O Amazon Redshift envia apenas o conjunto mínimo de dados para a função do Lambda designada.

  • O Amazon Redshift chama apenas a função do Lambda designada com a função do IAM designada.