

# RDS for PostgreSQL DB インスタンスから AWS Lambda 関数を呼び出す
<a name="PostgreSQL-Lambda"></a>

AWS Lambda は、サーバーのプロビジョニングや管理を行わなくてもコードの実行が可能な、イベント駆動型のコンピューティングサービスです。この機能は、RDS for PostgreSQL を含む多くの AWS サービスで利用可能です。例えば、データベースからのイベント通知の処理や、新しいファイルが Amazon S3 にアップロードされるたびに行うファイルからのデータロードのために、Lambda を使用することができます。詳細については、「*AWS Lambda デベロッパーガイド*の「[AWS Lambda とは](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)」を参照してください。

**注記**  
RDS for PostgreSQL では、以下のバージョンで AWS Lambda 関数の呼び出しがサポートされています。  
すべての PostgreSQL 18 バージョン
すべての PostgreSQL 17 バージョン
すべての PostgreSQL 16 バージョン
すべての PostgreSQL 15 バージョン
PostgreSQL 14.1 以降のマイナーバージョン
PostgreSQL 13.2 以降のマイナーバージョン
PostgreSQL 12.6 以降のマイナーバージョン

RDS for PostgreSQL で Lambda 関数を操作するためのセットアップは、AWS Lambda、IAM、VPC、および RDS for PostgreSQL DB インスタンスが関係する複数ステップのプロセスとなります。以下に、必要なステップの概要を示します。

Lambda 関数の詳細については、「*AWS Lambda デベロッパーガイド*」の「[Lambda の開始方法](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)」および「[AWS Lambda の基礎](https://docs.aws.amazon.com/lambda/latest/dg/lambda-foundation.html)」を参照してください。

**Topics**
+ [ステップ 1: RDS for PostgreSQL DB インスタンスで、AWS Lambda へのアウトバウンド接続を設定する。](#PostgreSQL-Lambda-network)
+ [ステップ 2: RDS for PostgreSQL DB インスタンスおよび AWS Lambda のために IAM を設定する](#PostgreSQL-Lambda-access)
+ [ステップ 3: RDS for PostgreSQL DB インスタンス用に `aws_lambda` 拡張機能をインストールする](#PostgreSQL-Lambda-install-extension)
+ [ステップ 4: RDS for PostgreSQL DB インスタンスで Lambda のヘルパー関数を使用する (オプション)](#PostgreSQL-Lambda-specify-function)
+ [ステップ 5: RDS for PostgreSQL DB インスタンスから Lambda 関数を呼びだす](#PostgreSQL-Lambda-invoke)
+ [ステップ 6: Lambda 関数を呼び出すその他のユーザー許可を付与する](#PostgreSQL-Lambda-grant-users-permissions)
+ [例: RDS for PostgreSQL DB インスタンスから Lambda 関数を呼びだす](PostgreSQL-Lambda-examples.md)
+ [Lambda 関数のエラーメッセージ](PostgreSQL-Lambda-errors.md)
+ [AWS Lambda 関数とパラメータのリファレンス](PostgreSQL-Lambda-functions.md)

## ステップ 1: RDS for PostgreSQL DB インスタンスで、AWS Lambda へのアウトバウンド接続を設定する。
<a name="PostgreSQL-Lambda-network"></a>

Lambda 関数は、常に AWS Lambda サービスが所有する Amazon VPC 内で実行されます。Lambda はこの VPC にネットワークアクセスとセキュリティルールを適用し、この VPC を自動的にモニタリングおよび維持します。RDS for PostgreSQL DB インスタンスは、Lambda サービスの VPC にネットワークトラフィックを送信します。このための構成方法は、DB インスタンスが、パブリックであるかプライベートであるかにより異なります。
+ **パブリック RDS for PostgreSQL DB インスタンス** — VPC のパブリックサブネット内に置かれた DB インスタンスで、「PubliclyAccessible」プロパティに `true` が設定されている場合、そのインスタンスはパブリックです。このプロパティの値は、AWS CLI コマンド [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) を使用して確認できます。または、AWS マネジメントコンソール を使用して **[Connectivity & security]** (接続とセキュリティ) タブを開き、**[Publicly accessible]** (パブリックアクセス可能) が「**はい**」となっているかを確認します。インスタンスが VPC のパブリックサブネット内に置かれていることを確認するには、AWS マネジメントコンソール または AWS CLI を使用します。

  Lambda へのアクセスを設定するには、AWS マネジメントコンソール または AWS CLI を使用して、VPC のセキュリティグループでアウトバウンドルールを作成します。アウトバウンドルールでは、TCP がポート 443 を使用して任意の IPv4 アドレス (0.0.0.0/0) にパケットを送信するように定義しています。
+ **プライベートRDS for PostgreSQL DB インスタンス** — この例では、インスタンスの「PubliclyAccessible」プロパティが `false` に指定されているか、インスタンスがプライベートサブネット内に置かれています。インスタンスが Lambda で動作できるようにするには、ネットワークアドレス変換 (NAT) ゲートウェイを使用します。詳細については、「[NAT ゲートウェイ](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)」を参照してください。または、VPC で Lambda の VPC エンドポイントを設定できます。詳細については、*Amazon VPC ユーザーガイド*の「[VPC エンドポイント](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)」を参照してください。このエンドポイントは、RDS for PostgreSQL DB インスタンスが Lambda 関数に対して発行した、呼び出しに対して応答します。VPC エンドポイントは、独自のプライベートな DNS 解決を使用します。`rds.custom_dns_resolution` の値がデフォルトの 0 (有効化されていない) から 1 に変更されない限り、RDS for PostgreSQL は、Lambda VPC エンドポイントを使用することはできません。そのためには、次の操作を行います。
  + カスタム DB パラメータグループを作成します。
  + `rds.custom_dns_resolution` パラメータの値を、デフォルトの `0` から `1` に変更します。
  + カスタムの DB パラメータグループを使用するように DB インスタンスを変更します。
  + 修正されたパラメータを反映させるために、インスタンスを再起動します。

ご使用の VPC は、ネットワークレベルで AWS Lambda VPC とやり取りできるようになります。次に、IAM を使用してアクセス権限を設定します。

## ステップ 2: RDS for PostgreSQL DB インスタンスおよび AWS Lambda のために IAM を設定する
<a name="PostgreSQL-Lambda-access"></a>

RDS for PostgreSQL DB インスタンスからの Lambda 関数の呼び出しには、特定の権限が必要です。必要な権限を設定するには、Lambda 関数の呼び出しを許可する IAM ポリシーを作成し、そのポリシーをロールに割り当てた上で、そのロールを DB インスタンスに適用することをお勧めします。このアプローチでは、指定された Lambda 関数をユーザーに代わって呼び出すための権限を、DB インスタンスに対し付与します。以下のステップで、AWS CLI を使用してこれを行う方法を示します。

**Amazon RDS インスタンスで Lambda を使用するために IAM のアクセス許可を設定するには**

1. AWS CLI コマンド [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) を実行して、指定された Lambda 関数を、RDS for PostgreSQL DB インスタンスが呼び出すことを許可する、IAM ポリシーを作成します。(ステートメント ID (Sid) は、ポリシーステートメントのオプションの記述であり、使用には影響しません。) このポリシーは、DB インスタンスに対し、指定された Lambda 関数を呼び出すための最小限のアクセス許可を付与します。

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

   または、任意の Lambda 関数の呼び出しを許可する、事前定義済みの `AWSLambdaRole` ポリシーを使用することもできます。詳細については、「[Lambda のアイデンティティベースの IAM ポリシー](https://docs.aws.amazon.com/lambda/latest/dg/access-control-identity-based.html#access-policy-examples-aws-managed)」を参照してください。

1. AWS CLI コマンド [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) を使用して、実行時にポリシーが引き受けることができる IAM ロールを作成します。

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

1. AWS CLI コマンド [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html) を使用して、このポリシーをロールに適用します。

   ```
   aws iam attach-role-policy \
       --policy-arn arn:aws:iam::444455556666:policy/rds-lambda-policy \
       --role-name rds-lambda-role --region aws-region
   ```

1. AWS CLI コマンド [add-role-to-db-instance](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/add-role-to-db-instance.html) を使用して、このロールを RDS for PostgreSQL DB インスタンスに適用します。この最後のステップにより、DB インスタンスのデータベースユーザーに対し、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   \
          --region aws-region
   ```

VPC と IAM の設定が完了したので、ここで `aws_lambda` 拡張をインストールできます。(拡張機能は任意のタイミングでインストールできますが、先に VPC サポートと IAM 権限を適切に設定する必要があります。`aws_lambda` 拡張機能は、RDS for PostgreSQL DB インスタンスの機能に対し何も追加しません。)

## ステップ 3: RDS for PostgreSQL DB インスタンス用に `aws_lambda` 拡張機能をインストールする
<a name="PostgreSQL-Lambda-install-extension"></a>

RDS for PostgreSQL DB インスタンスで AWS Lambda を使用し、RDS for PostgreSQL DB インスタンスに対し `aws_lambda` PostgreSQL 拡張機能を追加します。この拡張機能は、RDS for PostgreSQL DB インスタンスに対し、PostgreSQL からの Lambda 関数呼び出し機能を追加します。

**RDS for PostgreSQL DB インスタンスに `aws_lambda` 拡張機能をインストールするには**

PostgreSQL の `psql` コマンドライン、または pgAdmin ツールを使用して、RDS for PostgreSQL DB インスタンスに接続します。

1. RDS for PostgreSQL DB インスタンスに、`rds_superuser` 権限を持つユーザーとして接続します。例では、デフォルトの `postgres` ユーザが示されています。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. `aws_lambda` 拡張機能をインストールします。`aws_commons` 拡張機能も必要です。これは、`aws_lambda` や、他の多数の PostgreSQL向け Aurora 拡張機能にヘルパー関数を提供します。この拡張機能が、RDS for PostgreSQL DB インスタンス上で見つからない場合は、次のように `aws_lambda` を使用してインストールされています。

   ```
   CREATE EXTENSION IF NOT EXISTS aws_lambda CASCADE;
   NOTICE:  installing required extension "aws_commons"
   CREATE EXTENSION
   ```

`aws_lambda` 拡張機能は、 DB インスタンスにインストールされています。この段階で、Lambda 関数を呼び出すための、使いやすい構造を作成することが可能です。

## ステップ 4: RDS for PostgreSQL DB インスタンスで Lambda のヘルパー関数を使用する (オプション)
<a name="PostgreSQL-Lambda-specify-function"></a>

`aws_commons` 拡張機能のヘルパー関数を使用すると、PostgreSQL からより簡単に呼び出すことができるエンティティを準備することができます。これを行うには、Lambda 関数に関する以下の情報が必要です。
+ **[Function name]** (関数名) – Lambda 関数の名前、Amazon リソースネーム (ARN)、バージョンまたはエイリアス。[ステップ 2: インスタンスおよび Lambda のために IAM を設定する](#PostgreSQL-Lambda-access) で作成された IAM ポリシーは ARN を必要とするため、関数の ARN を使用することをお勧めします。
+ **[AWS Region]** (リージョン) – (オプション) Lambda 関数が RDS for PostgreSQL DB インスタンスと同じリージョンに存在しない場合の、Lambda 関数が置かれている AWS リージョン。

Lambda 関数名の情報を保持するには、[aws\$1commons.create\$1lambda\$1function\$1arn](PostgreSQL-Lambda-functions.md#aws_commons.create_lambda_function_arn) 関数を使用します。このヘルパー関数は、呼び出し関数に必要な詳細を含む `aws_commons._lambda_function_arn_1` 複合構造を作成します。以下に、この複合構造を設定するための 3 つの代替手段を説明します。

```
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
```

これらの値はいずれも、[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 関数の呼び出し時に使用されます。例については「[ステップ 5: RDS for PostgreSQL DB インスタンスから Lambda 関数を呼びだす](#PostgreSQL-Lambda-invoke)」を参照してください。

## ステップ 5: RDS for PostgreSQL DB インスタンスから Lambda 関数を呼びだす
<a name="PostgreSQL-Lambda-invoke"></a>

`aws_lambda.invoke` 関数は、`invocation_type` に応じて同期または非同期的で動作します。以下のように、このパラメーターには 2 つの選択肢、`RequestResponse` (デフォルト) と `Event` があります。
+ **`RequestResponse`** – この呼び出しタイプは*同期*です。これは、呼び出しタイプを指定せずに呼び出しが行われた場合のデフォルトの動作です。レスポンスペイロードには、`aws_lambda.invoke` 関数の結果が含まれます。処理を続行する前に Lambda 関数から結果を受け取る必要があるワークフローの場合は、この呼び出しタイプを使用します。
+ **`Event`** – この呼び出しタイプは*非同期*です。この場合の応答には、結果を含むペイロードは含まれません。この呼び出しタイプは、処理を続行するために Lambda 関数の結果を必要としないワークフローで使用します。

セットアップの簡単なテストとして、`psql` を使用して DB インスタンスに接続し、コマンドラインからサンプル関数を起動します。今、次のスクリーンショットに示すシンプルな Python 関数のような基本的関数の 1 つが、Lambda サービスに設定されているとします。

![\[AWS Lambda の AWS CLI 内に表示された Lambda 関数の例\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/lambda_simple_function.png)


**サンプル関数を呼び出すには**

1. `psql` または pgAdmin を使用して、 DB インスタンスに接続します。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. 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 );
   ```

   この応答は次のようになります。

   ```
   status_code |                        payload                        | executed_version | log_result
   -------------+-------------------------------------------------------+------------------+------------
            200 | {"statusCode": 200, "body": "\"Hello from Lambda!\""} | $LATEST          |
   (1 row)
   ```

呼び出しが成功しなかった場合は、「[Lambda 関数のエラーメッセージ](PostgreSQL-Lambda-errors.md)」を参照してください。

## ステップ 6: Lambda 関数を呼び出すその他のユーザー許可を付与する
<a name="PostgreSQL-Lambda-grant-users-permissions"></a>

手順のこの時点で、`rds_superuser` であるユーザーだけが Lambda 関数を呼び出すことができます。作成した関数の呼び出しを他のユーザーに許可するには、許可を付与する必要があります。

**Lambda 関数を呼び出すアクセス許可を付与するには**

1. `psql` または pgAdmin を使用して、 DB インスタンスに接続します。

   ```
   psql -h instance.444455556666.aws-region.rds.amazonaws.com -U postgres -p 5432
   ```

1. 次の SQL コマンドを実行します。

   ```
   postgres=>  GRANT USAGE ON SCHEMA aws_lambda TO db_username;
   GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA aws_lambda TO db_username;
   ```

# 例: RDS for PostgreSQL DB インスタンスから Lambda 関数を呼びだす
<a name="PostgreSQL-Lambda-examples"></a>

以下に、[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 関数の呼び出し例をいくつか示します。ほとんどの例では、関数の詳細を簡単に渡せるように、[ステップ 4: RDS for PostgreSQL DB インスタンスで Lambda のヘルパー関数を使用する (オプション)](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) で作成した複合構造 `aws_lambda_arn_1` を使用しています。非同期呼び出しの例については、「[例: Lambda 関数の (Event による) 非同期呼び出し](#PostgreSQL-Lambda-Event)」を参照してください。ここに示されたその他の例はすべて、同期呼び出しを使用します。

Lambda 呼び出しタイプの詳細については、「*AWS Lambdaデベロッパーガイド*」の「[Lambda 関数を呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)」を参照してください。`aws_lambda_arn_1`の詳細については、「[aws\$1commons.create\$1lambda\$1function\$1arn](PostgreSQL-Lambda-functions.md#aws_commons.create_lambda_function_arn)」を参照してください。

**Topics**
+ [例: Lambda 関数の (RequestResponse による) 同期呼び出し](#PostgreSQL-Lambda-RequestResponse)
+ [例: Lambda 関数の (Event による) 非同期呼び出し](#PostgreSQL-Lambda-Event)
+ [例: 関数レスポンスからの Lambda 実行ログのキャプチャリング](#PostgreSQL-Lambda-log-response)
+ [例: Lambda 関数にクライアントコンテキストを含める](#PostgreSQL-Lambda-client-context)
+ [例: Lambda 関数の特定のバージョンの呼び出し](#PostgreSQL-Lambda-function-version)

## 例: Lambda 関数の (RequestResponse による) 同期呼び出し
<a name="PostgreSQL-Lambda-RequestResponse"></a>

以下に、Lambda 関数の同期呼び出しの例を 2 つ示します。これらの `aws_lambda.invoke` 関数呼び出しの結果は同じです。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json);
```

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse');
```

パラメータの説明は次のとおりです。
+ `:'aws_lambda_arn_1'` – このパラメータは、ヘルパー関数 `aws_commons.create_lambda_function_arn` を使用して、[ステップ 4: RDS for PostgreSQL DB インスタンスで Lambda のヘルパー関数を使用する (オプション)](PostgreSQL-Lambda.md#PostgreSQL-Lambda-specify-function) で作成される複合構造を識別します。この構造は、次のように `aws_lambda.invoke` 呼び出しの中で、インラインで作成することもできます。

  ```
  SELECT * FROM aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function', 'aws-region'),
  '{"body": "Hello from Postgres!"}'::json
  );
  ```
+ `'{"body": "Hello from PostgreSQL!"}'::json` - Lambda関数に渡す JSON ペイロード。
+ `'RequestResponse'`-Lambda 呼び出しタイプ。

## 例: Lambda 関数の (Event による) 非同期呼び出し
<a name="PostgreSQL-Lambda-Event"></a>

以下は、Lambda 関数の非同期呼び出しの例です。`Event` 呼び出しタイプは、指定された入力ペイロードを使用して Lambda 関数の呼び出しをスケジュールし、すぐに返します。Lambda 関数の結果に依存しない特定のワークフローでは、`Event` 呼び出しタイプを使用します。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'Event');
```

## 例: 関数レスポンスからの Lambda 実行ログのキャプチャリング
<a name="PostgreSQL-Lambda-log-response"></a>

関数レスポンスに実行ログの最後の 4 KB を含めるには、`log_type` パラメーターを使用しながら `aws_lambda.invoke` 関数を呼び出します。デフォルトでは、このパラメータには `None` が設定されています。レスポンス内の Lambda 実行ログの結果をキャプチャする場合は、以下のように `Tail` を指定します。

```
SELECT *, select convert_from(decode(log_result, 'base64'), 'utf-8') as log FROM aws_lambda.invoke(:'aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse', 'Tail');
```

[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 関数の `log_type` パラメータを `Tail` に設定して、実行ログをレスポンスに含めます。この `log_type` パラメータのデフォルト値は `None` です。

返された `log_result` は、`base64` エンコードされた文字列です。このコンテンツは、`decode` と `convert_from` PostgreSQL 関数の組み合わせを使用してデコードできます。

`log_type` の詳細については、「[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke)」を参照してください。

## 例: Lambda 関数にクライアントコンテキストを含める
<a name="PostgreSQL-Lambda-client-context"></a>

`aws_lambda.invoke` 関数では、次に示すとおり `context` パラメータを使用して、ペイロードとは別の情報を渡すことができます。

```
SELECT *, convert_from(decode(log_result, 'base64'), 'utf-8') as log FROM aws_lambda.invoke(:'aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse', 'Tail');
```

クライアントコンテキストを含めるときは、[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 関数の `context` パラメータに JSON オブジェクトを使用します。

`context` パラメータの詳細については、「[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke)」でリファレンスを参照してください。

## 例: Lambda 関数の特定のバージョンの呼び出し
<a name="PostgreSQL-Lambda-function-version"></a>

`aws_lambda.invoke` 呼び出しに `qualifier` パラメータを含めることで、Lambda 関数の特定のバージョンを指定することが可能です。以下は、`'custom_version'` をバージョンのエイリアスに使用してこれを行う場合の例です。

```
SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json, 'RequestResponse', 'None', NULL, 'custom_version');
```

代わりに、Lambda 関数名の詳細により、次のように関数の修飾子を指定することもできます。

```
SELECT * FROM aws_lambda.invoke(aws_commons.create_lambda_function_arn('my-function:custom_version', 'us-west-2'),
'{"body": "Hello from Postgres!"}'::json);
```

`qualifier` および他のパラメータの詳細については、「[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke)」でリファレンスを参照してください。

# Lambda 関数のエラーメッセージ
<a name="PostgreSQL-Lambda-errors"></a>

次のリストには、エラーメッセージに関する情報と、考えられる原因と解決策が表示されます。
+ **VPC 設定の問題**

  VPC の設定の問題により、接続しようとすると次のエラーメッセージが表示されることがあります。

  ```
  ERROR:  invoke API failed
  DETAIL: AWS Lambda client returned 'Unable to connect to endpoint'.
  CONTEXT:  SQL function "invoke" statement 1
  ```

  このエラーの一般的な原因は、VPC セキュリティグループが不適切に設定されていることです。VPC セキュリティグループのポート 443 で TCP のアウトバウンドルールが開いており、VPC が Lambda VPC に接続できるようになっていることを確認します。

  プライベートの DB インスタンスを使用している場合は、VPC のプライベート DNS 設定を確認します。`rds.custom_dns_resolution` パラメータには 1 が設定されており、AWS PrivateLink は [ステップ 1: RDS for PostgreSQL DB インスタンスで、AWS Lambda へのアウトバウンド接続を設定する。](PostgreSQL-Lambda.md#PostgreSQL-Lambda-network) での概説どおりにセットアップされていることを確認します。詳細については、「[インターフェイス VPC エンドポイント (AWS PrivateLink)](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-interface.html#vpce-private-dns)」を参照してください。
+ **Lambda 関数を呼び出すために必要な許可がない**

  次のいずれかのエラーメッセージが表示された場合、関数を呼び出すユーザー (ロール) に適切な許可がありません。

  ```
  ERROR:  permission denied for schema aws_lambda
  ```

  ```
  ERROR:  permission denied for function invoke
  ```

  Lambda 関数を呼び出すには、ユーザー (ロール) に特定の許可を付与する必要があります。詳しくは、「[ステップ 6: Lambda 関数を呼び出すその他のユーザー許可を付与する](PostgreSQL-Lambda.md#PostgreSQL-Lambda-grant-users-permissions)」を参照してください。
+ **Lambda 関数でのエラーの不適切な処理**

  リクエストの処理中に Lambda 関数が例外をスローした場合、`aws_lambda.invoke` は、次のように PostgreSQL エラーで失敗します。

  ```
  SELECT * FROM aws_lambda.invoke('aws_lambda_arn_1', '{"body": "Hello from Postgres!"}'::json);
  ERROR:  lambda invocation failed
  DETAIL:  "arn:aws:lambda:us-west-2:555555555555:function:my-function" returned error "Unhandled", details: "<Error details string>".
  ```

  Lambda 関数または PostgreSQL アプリケーションの中でエラーに対処します。

# AWS Lambda 関数とパラメータのリファレンス
<a name="PostgreSQL-Lambda-functions"></a>

以下は、RDS for PostgreSQL で Lambda を呼び出すために使用する関数とパラメータのリファレンスです。

**Topics**
+ [aws\$1lambda.invoke](#aws_lambda.invoke)
+ [aws\$1commons.create\$1lambda\$1function\$1arn](#aws_commons.create_lambda_function_arn)
+ [aws\$1lambda パラメータ](#aws_lambda.parameters)

## aws\$1lambda.invoke
<a name="aws_lambda.invoke"></a>

の RDS for PostgreSQL DB インスタンスの Lambda 関数を実行します。

Lambda関数の呼び出しの詳細については、*AWS Lambda デベロッパーガイド*の「[呼び出し](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)」も参照してください。

**[Syntax]** (構文)

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

```
aws_lambda.invoke(
IN function_name TEXT,
IN payload JSON,
IN region TEXT DEFAULT NULL,
IN invocation_type TEXT DEFAULT 'RequestResponse',
IN log_type TEXT DEFAULT 'None',
IN context JSON DEFAULT NULL,
IN qualifier VARCHAR(128) DEFAULT NULL,
OUT status_code INT,
OUT payload JSON,
OUT executed_version TEXT,
OUT log_result TEXT)
```

```
aws_lambda.invoke(
IN function_name aws_commons._lambda_function_arn_1,
IN payload JSON,
IN invocation_type TEXT DEFAULT 'RequestResponse',
IN log_type TEXT DEFAULT 'None',
IN context JSON DEFAULT NULL,
IN qualifier VARCHAR(128) DEFAULT NULL,
OUT status_code INT,
OUT payload JSON,
OUT executed_version TEXT,
OUT log_result TEXT)
```

------
#### [ JSONB ]

```
aws_lambda.invoke(
IN function_name TEXT,
IN payload JSONB,
IN region TEXT DEFAULT NULL,
IN invocation_type TEXT DEFAULT 'RequestResponse',
IN log_type TEXT DEFAULT 'None',
IN context JSONB DEFAULT NULL,
IN qualifier VARCHAR(128) DEFAULT NULL,
OUT status_code INT,
OUT payload JSONB,
OUT executed_version TEXT,
OUT log_result TEXT)
```

```
aws_lambda.invoke(
IN function_name aws_commons._lambda_function_arn_1,
IN payload JSONB,
IN invocation_type TEXT DEFAULT 'RequestResponse',
IN log_type TEXT DEFAULT 'None',
IN context JSONB DEFAULT NULL,
IN qualifier VARCHAR(128) DEFAULT NULL,
OUT status_code INT,
OUT payload JSONB,
OUT executed_version TEXT,
OUT log_result TEXT
)
```

------入力パラメータ

**function\$1name**  
Lambda 関数の識別名。値には、関数名、ARN、または部分的な ARN を指定できます。可能な形式のリストについては、*AWS Lambda デベロッパーガイド*の「[Lambda関数名の形式](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_RequestParameters)」を参照してください。

*payload*  
Lambda 関数の入力。形式には、JSON または JSONB を使用できます。詳細については、PostgreSQL ドキュメントの「[JSON タイプ](https://www.postgresql.org/docs/current/datatype-json.html)」を参照してください。

*リージョン*  
(オプション) 関数の Lambda リージョン。デフォルトでは、RDS は AWS の完全な ARN から `function_name` リージョンを解決するか、 RDS for PostgreSQL DB インスタンスのリージョンを使用します。このリージョン値が `function_name` ARN で指定されたものと競合する場合、エラーが発生します。

*invocation\$1type*  
Lambda 関数の呼び出しタイプ。 値は大文字と小文字が区別されます。以下に示しているのは、可能な値です。  
+ `RequestResponse`-デフォルト。Lambda 関数の呼び出しタイプは同期で、結果にレスポンスペイロードを返します。ワークフローが Lambda 関数の結果をすぐに受け取ることに依存しているときは、`RequestResponse` 呼び出しのタイプを使用します。
+ `Event`- Lambda 関数の呼び出しタイプは非同期で、返されたペイロードなしにすぐに返されます。ワークフローを先に進める前に Lambda 関数の結果を知る必要がないときは、`Event` の呼び出しタイプを使用します。
+ `DryRun`- この呼び出しタイプは、Lambda 関数を実行せずに、アクセスをテストします。

*log\$1type*  
`log_result`出力パラメータで返される Lambda ログのタイプ。 値は大文字と小文字が区別されます。以下に示しているのは、可能な値です。  
+ Tail - 返された `log_result` 出力パラメータには、実行ログの最後の 4 KB が含まれます。
+ None - Lambda のないログ情報は返されません。

*context*  
JSON または JSONB形式のクライアントコンテキスト。使用されるフィールドには `custom` と `env` が含まれます 。

*修飾子*  
呼び出される Lambda 関数のバージョンを識別する修飾子。この値が `function_name` ARN で指定されたものと競合する場合、エラーが発生します。出力パラメータ

*status\$1code*  
HTTP ステータスレスポンスコード。詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda 応答要素の呼び出し](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html#API_Invoke_ResponseElements)」を参照してください。

*payload*  
実行された Lambda 関数から返された情報。形式は JSON または JSONB です。

*executedversion*  
実行された Lambda 関数のバージョン。

*result*  
Lambda 関数が呼び出されたとき `log_type` 値が `Tail` である場合に返される実行ログ情報。結果には、Base64 でエンコードされた実行ログの最後の 4 KB が含まれます。

## aws\$1commons.create\$1lambda\$1function\$1arn
<a name="aws_commons.create_lambda_function_arn"></a>

Lambda 関数名情報を保持するように、`aws_commons._lambda_function_arn_1` 構造を作成します。`aws_commons.create_lambda_function_arn` 関数の結果は、aws\$1lambda.invoke `function_name` 関数の [aws\$1lambda.invoke](#aws_lambda.invoke) パラメータで使用します。

**[Syntax]** (構文)

```
aws_commons.create_lambda_function_arn(
    function_name TEXT,
    region TEXT DEFAULT NULL
    )
    RETURNS aws_commons._lambda_function_arn_1
```入力パラメータ

*function\$1name*  
Lambda 関数名を含む必須のテキスト文字列。値には、関数名、部分的な ARN、または完全な ARN を指定します。

*リージョン*  
Lambda 関数がある AWS リージョンを含む、オプションのテキスト文字列。 リージョン名と関連する値のリストについては、「」を参照してください。[リージョン、アベイラビリティーゾーン、および Local Zones](Concepts.RegionsAndAvailabilityZones.md)

## aws\$1lambda パラメータ
<a name="aws_lambda.parameters"></a>

この表には、`aws_lambda` 関数に関連するパラメータが記載されています。


| パラメータ  | 説明 | 
| --- | --- | 
| `aws_lambda.connect_timeout_ms` | これは動的パラメータであり、AWS Lambda への接続中の最大待機時間を設定します。デフォルト値は `1000` です。このパラメータに指定できる値は、1～900000 です。 | 
| `aws_lambda.request_timeout_ms` | これは動的パラメータであり、AWS Lambda からのレスポンスの最大待機時間を設定します。デフォルト値は `3000` です。このパラメータに指定できる値は、1～900000 です。 | 
| `aws_lambda.endpoint_override` | AWS Lambda への接続に使用できるエンドポイントを指定します。空の文字列は、リージョンのデフォルトの AWS Lambda エンドポイントを選択します。この静的パラメータの変更を有効にするには、データベースを再起動する必要があります。 | 