

 Amazon Redshift は、パッチ 198 以降、新しい Python UDF の作成をサポートしなくなります。既存の Python UDF は、2026 年 6 月 30 日まで引き続き機能します。詳細については、[ブログ記事](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)を参照してください。

# スカラー Lambda UDF
<a name="udf-creating-a-lambda-sql-udf"></a>

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

[CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md) コマンドでは、次のパラメータが作成されます。
+ (オプション) データ型を持つ引数のリスト。
+ 1 つの戻りデータ型。
+ Amazon Redshift によって呼び出される外部関数の 1 つの関数名。
+ Amazon Redshift クラスターが Lambda を引き受けて呼び出すことが許可されている 1 つの IAM ロール。
+ Lambda UDF によって呼び出される 1 つのLambda 関数名。

CREATE EXTERNAL FUNCTION の詳細については、「[CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)」を参照してください。

Lambda UDF の入力データ型と戻りデータ型は、以下のいずれかのタイプになります。
+  SMALLINT 
+  INTEGER 
+  BIGINT 
+  DECIMAL 
+  REAL 
+  DOUBLE PRECISION 
+  CHAR 
+  VARCHAR 
+  BOOLEAN 
+  DATE 
+  TIMESTAMP 

これらのタイプのエイリアスも有効です。データ型とそのエイリアスの完全なリストについては、「[データ型](c_Supported_data_types.md)」を参照してください。

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

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

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

**注記**  
Lambda UDF を使用すると、Lambda サービスから追加料金が発生する可能性があります。そうするかどうかは、Lambda リクエスト数 (UDF 呼び出し) や Lambda プログラム実行の合計時間などの要因によって異なります。ただし、Amazon Redshift で Lambda UDF を使用するための追加料金はありません。AWS Lambda の料金の詳細については、[AWS Lambda の料金](https://aws.amazon.com/lambda/pricing)を参照してください。  
Lambda リクエストの数は、Lambda UDF が使用される特定の SQL ステートメント句によって異なります。例えば、この関数が次の `` のような 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 回だけ呼び出す可能性があります。

## UDF のセキュリティとアクセス許可
<a name="udf-lambda-security"></a>

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

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

```
grant usage on language exfunc to PUBLIC; 
```

次の例では、最初に PUBLIC に対して exfunc の使用を取り消し、次にユーザーグループ lambda\$1udf\$1devs に使用を許可します。

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

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

次の例では、PUBLIC から関数 exfunc\$1sum での実行を取り消します。次に、ユーザーグループ lambda\$1udf\$1devs に使用を許可します。

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

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

権限の付与と取り消しの詳細については、「[GRANT](r_GRANT.md)」および「[REVOKE](r_REVOKE.md)」を参照してください。

## Lambda UDF の認可パラメータの設定
<a name="udf-lambda-authorization"></a>

CREATE EXTERNAL FUNCTION コマンドには、AWS Lambdaで Lambda 関数を呼び出すための認可が必要です。認可を行うには、CREATE EXTERNAL FUNCTION コマンドの実行時に、AWS Identity and Access Management (IAM) ロールを指定します。IAM ロールの詳細については、*IAM ユーザーガイド*の [IAM ロール](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles.html)をご参照ください。

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

### Lambda 用に IAM ロールを作成する
<a name="udf-lambda-create-iam"></a>

IAM ロールには、Lambda 関数を呼び出すための許可が必要です。IAM ロールの作成時に、次のいずれかの方法でアクセス許可を提供します。
+ IAM ロールの作成中に、[**Attach permissions policy (アクセス許可ポリシーのアタッチ)**] ページで `AWSLambdaRole` ポリシーをアタッチします。`AWSLambdaRole` ポリシーは、最小要件である Lambda 関数を呼び出すためのアクセス許可を付与します。詳細およびその他のポリシーについては、*AWS Lambda デベロッパーガイド*の [AWS Lambda のアイデンティティベースの IAM ポリシー](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html)を参照してください。
+ すべてのリソースの `lambda:InvokeFunction` 許可、またはその関数の ARN を持つ特定の Lambda 関数を使用して、IAM ロールにアタッチする独自のカスタムポリシーを作成します。ポリシー作成方法の詳細については、「*IAM ユーザーガイド*」の「[IAM ポリシーの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)」を参照してください。

  次のポリシー例では、特定の Lambda 関数で Lambda を呼び出すことができます。

------
#### [ JSON ]

****  

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

------

  Lambda 関数のリソースの詳細については、「*IAM API リファレンス*」の「[Lambda アクションのリソースと条件](https://docs.aws.amazon.com/lambda/latest/dg/lambda-api-permissions-ref.html)」を参照してください。

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

IAM ロールを作成する手順については、「*Amazon Redshift 管理ガイド*」の「[ユーザーに代わって Amazon Redshift が他の AWS サービスにアクセスすることを許可する](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)」を参照してください。

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

### クラスターを使用して IAM ロールを関連付ける
<a name="udf-lambda-associate-iam"></a>

IAM ロールをクラスターにアタッチします。クラスターにロールを追加するか、Amazon Redshift マネジメントコンソール、CLI、または API を使用してクラスターに関連付けられるロールを表示できます。詳細については、「*Amazon Redshift 管理ガイド*」の「[IAM ロールをクラスターと関連付ける](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)」を参照してください。

### コマンドに IAM ロールを含める
<a name="udf-lambda-include-iam"></a>

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

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

同じリージョン内の他のアカウントに存在する Lambda 関数を呼び出すには、[Amazon Redshift での IAM ロールの連鎖](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles.html)を参照してください。

## Amazon Redshift と AWS Lambda 間で JSON インターフェイスを使用する
<a name="udf-lambda-json"></a>

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

次のテーブルに、JSON ペイロードで期待できる指定済みの Lambda 関数の入力フィールド一覧を示しています。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/udf-creating-a-lambda-sql-udf.html)

JSON 配列の順序によって、バッチ処理の順序が決まります。Lambda 関数では、引数を繰り返し取得して、正確な数のレコードを生成する必要があります。ペイロードの例を次に示します。

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/udf-creating-a-lambda-sql-udf.html)

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 のセキュリティとアクセス許可](udf-security-and-privileges.md)」を参照してください。
+ Amazon Redshift は、指定された Lambda 関数に最低限のデータセットのみを送信します。
+ Amazon Redshift は、指定された IAM ロールを持つ指定済みの Lambda 関数のみを呼び出します。