スカラー Lambda UDF の作成 - Amazon Redshift

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

スカラー Lambda UDF の作成

Amazon Redshift は、SQL クエリの一部として AWS Lambda で定義されたカスタム関数を使用できます。スカラー Lambda は、Java、Go、UDFs、Node.js、C#、Python、Ruby など、Lambda でサポートされている任意のプログラミング言語で記述できます。PowerShellまたは、カスタムランタイムを使用することもできます。

Lambda UDFs は Lambda で定義および管理され、UDFs でこれらの Amazon Redshift を呼び出すアクセス権限を制御できます。同じクエリで複数の Lambda 関数を呼び出すか、同じ関数を複数回呼び出すことができます。

Lambda は、スカラー関数がサポートされている SQL ステートメントのすべての句で使用します。UDFsLambda は、SELECT、UPDATE、INSERT、DELETE などの SQL ステートメントでも使用できます。UDFs

注記

Lambda を使用すると、UDFs サービスから追加料金が発生する可能性があります。Lambdaこれを実行するかどうかは、Lambda リクエストの数 (UDF 呼び出し) や Lambda プログラム実行の合計期間などの要因によって異なります。ただし、Lambda で UDFs Amazon Redshift を使用するための追加料金はかかりません。AWS の料金の詳細については、「Lambda 料金表」を参照してください。AWS Lambda

リクエストの数は、Lambda UDF が使用される特定の SQL ステートメント句によって異なります。Lambdaたとえば、関数が次のような WHERE 句で使用されているとします。

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

この場合、Amazon Redshift は、それぞれに最初の SELECT ステートメントを呼び出し、2 番目の SELECT ステートメントは 1 回のみ呼び出します。

ただし、クエリの射影部分で UDF を使用すると、結果セットの修飾行または集計行ごとに Lambda 関数を 1 回のみ呼び出す場合があります。関数の複数の呼び出しのバッチ処理を設定して、パフォーマンスを向上させ、コストを削減できます。Lambda

UDF の登録Lambda

コマンドによって以下のパラメータが作成されます。外部関数の作成

  • (オプション) データ型を含む引数のリスト。

  • 1 つの戻りデータ型。

  • によって呼び出される外部関数の 1 つの関数名。Amazon Redshift

  • クラスターが Amazon Redshift を引き受け、呼び出すのが許可されている 1 つの IAM ロール。Lambda

  • UDF が呼び出す 1 つの Lambda 関数名。Lambda

CREATE EXTERNAL FUNCTION の詳細については、「外部関数の作成」を参照してください。

この関数の入力データタイプと戻りデータタイプは、任意の標準 Amazon Redshift データタイプにすることができます。

Amazon Redshift により、外部関数はバッチ処理された引数と結果を送受信できるようになります。

UDF のセキュリティおよび権限の管理Lambda

UDF を作成するには、LANUGAGE EXFUNC で使用するためのアクセス許可があることを確認してください。Lambda特定のユーザー、グループ、またはパブリックに明示的に USAGE ON LANGUAGE EXFUNC を付与するか、USAGE ON LANGUAGE EXFUNC を取り消す必要があります。

次の例では、EXFUNC の使用を PUBLIC に許可します。

grant usage on language exfunc to PUBLIC;

次の例では、PUBLIC から exfunc の使用を取り消し、ユーザーグループ lambda_udf_devs に使用を許可します。

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

UDF を実行するには、呼び出される各関数のアクセス許可を持っていることを確認してください。Lambdaデフォルトでは、新しい Lambda UDFs を実行するアクセス許可が PUBLIC に付与されます。使用を制限するには、関数に対して PUBLIC からこのアクセス許可を取り消します。次に、特定のユーザーまたはグループに権限を付与します。

次の例では、PUBLIC から関数 exfunc_sum の実行を取り消します。次に、ユーザーグループ 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;

スーパーユーザーは、デフォルトですべての権限を持っています。

権限の付与および取り消しの詳細については、「GRANT」および「REVOKE」を参照してください。

Lambda の認証パラメータの設定UDFs

CREATE EXTERNAL FUNCTION コマンドには、Lambda の AWS Lambda 関数を呼び出すための認証が必要です。認証を開始するには、CREATE EXTERNAL FUNCTION コマンドを実行するときに AWS Identity and Access Management (IAM) ロールを指定します。ロールの詳細については、IAM の「IAM ロール」を参照してください。IAM ユーザーガイド

クラスターにアタッチされた Lambda 関数を呼び出すアクセス許可を持つ既存の IAM ロールがある場合は、コマンドの IAM_ROLE パラメータでロールの Amazon リソースネーム (ARN) を置き換えることができます。以下のセクションでは、CREATE EXTERNAL FUNCTION コマンドで IAM ロールを使用するためのステップについて説明します。

の IAM ロールの作成Lambda

ロールには、IAM 関数を呼び出すためのアクセス許可が必要です。Lambdaロールの作成中に、次のいずれかの方法でアクセス権限を提供します。IAM

  • ロールの作成中に、[AWSLambdaRoleAttach permissions policy (アクセス権限ポリシーをアタッチする)] ページで ポリシーをアタッチします。IAMポリシーは、最小限の要件である AWSLambdaRole 関数を呼び出すアクセス権限を付与します。Lambda詳細およびその他のポリシーについては、https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html の「AWS Lambda のアイデンティティベースの IAM ポリシーAWS Lambda Developer Guide」を参照してください

  • 独自のカスタムポリシーを作成し、その関数の ARN を使用して、すべてのリソースまたは特定の IAM 関数の lambda:InvokeFunction アクセス許可を持つ Lambda ロールにアタッチします。ポリシーの作成方法の詳細については、IAM の「 ポリシーの作成」を参照してください。IAM ユーザーガイド

    次のポリシー例では、特定の Lambda 関数に対する Lambda の呼び出しを有効にします。

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

    関数のリソースの詳細については、Lambda の「Lambda アクションのリソースと条件」を参照してください。IAM API リファレンス

    必要なアクセス許可を使用してカスタムポリシーを作成したら、 ロールの作成中に、[Attach permissions policy (アクセス許可ポリシーのアタッチ)IAM] ページで IAM ロールにポリシーをアタッチできます。

ロールを作成する手順については、IAM の「Amazon Redshiftユーザーに代わって他の AWS サービスにアクセスすることを に許可する」を参照してください。Amazon Redshift Cluster Management Guide

新しい IAM ロールを作成しない場合は、前に説明したアクセス許可を既存の IAM ロールに追加できます。

ロールとクラスターの関連付けIAM

ロールをクラスターにアタッチします。IAMAmazon Redshift マネジメントコンソール、CLI、または API を使用して、クラスターにロールを追加したり、クラスターに関連付けられたロールを表示したりできます。詳細については、IAM の「 ロールをクラスターに関連付ける」を参照してください。Amazon Redshift Cluster Management Guide

コマンドに IAM ロールを含める

CREATE EXTERNAL FUNCTION コマンドに IAM ロール ARN を含めます。ロールを作成すると、IAM はそのロールの Amazon リソースネーム (ARN) を返します。IAMロールを指定するには、IAM パラメータでロールの ARN を指定します。IAM_ROLE以下に、IAM_ROLE パラメータの構文を示します。

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

同じリージョン内の他のアカウントに存在する Lambda 関数を呼び出すには、「 で IAM ロールを連鎖するAmazon Redshift」を参照してください。

と Amazon Redshift 間の JSON インターフェイスの使用AWS Lambda

Amazon Redshift は、Lambda が通信するすべての Amazon Redshift 関数に共通のインターフェイスを使用します。

次の表は、JSON ペイロードに使用可能な、指定された Lambda 関数の入力フィールドのリストを示しています。

フィールド名

説明

値の範囲
request_id 各呼び出しリクエストを一意に識別する汎用一意識別子 (UUID)。

有効な UUID。

クラスター

クラスターの完全な Amazon リソースネーム (ARN)。

有効なクラスター ARN。

ユーザー

呼び出しを行うユーザーの名前。 有効なユーザー名。

データベース

クエリが実行されているデータベースの名前。 有効なデータベース名。

external_function (外部関数)

呼び出しを行う外部関数の完全修飾名。 有効な完全修飾関数名。

query_id

呼び出しているクエリのクエリ ID。 有効なクエリ ID。

num_records

ペイロード内の引数の数。 値 1 ~ 2^64。

引数

指定された形式のデータペイロード。 配列形式のデータは JSON 配列である必要があります。各要素は、引数の数が 1 より大きい場合に配列となるレコードです。配列を使用することで、Amazon Redshift はペイロード内のレコードの順序を保持します。

JSON 配列の順序によって、バッチ処理の順序が決まります。関数は引数を反復的に事前処理し、正確なレコード数を生成する必要があります。Lambda以下に示しているのは、ペイロードの例です。

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

関数の戻り出力には、次のフィールドが含まれています。Lambda

フィールド名

説明

値の範囲
success 関数の成功または失敗の表示。

"true" または "false"

エラー msg

成功値が "false" (関数が失敗した場合) の場合のエラーメッセージ。それ以外の場合は、このフィールドは無視されます。

有効なメッセージ。

num_records

ペイロード内のレコード数。 値 1 ~ 2^64。

結果

指定された形式の呼び出しの結果。 該当なし

関数出力の例を次に示します。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 ] }

SQL クエリから Lambda 関数を呼び出すと、Amazon Redshift は、以下の考慮事項を参照して接続のセキュリティを保証します。

  • GRANT および REVOKE アクセス権限。UDF のセキュリティおよび権限については、「UDF のセキュリティおよび権限」を参照してください。

  • Amazon Redshift は、指定された Lambda 関数に最小データセットのみを送信します。

  • Amazon Redshift は、指定された IAM ロールで指定された Lambda 関数のみを呼び出します。