

# Aurora PostgreSQL DB クラスターから AWS Lambda 関数を呼び出す
<a name="PostgreSQL-Lambda"></a>

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

**注記**  
AWS Lambda 関数の呼び出しは、Aurora PostgreSQL 11.9 以上のバージョン (Aurora Serverless v2 を含む) でサポートされています。

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

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

Lambda 関数は、常に AWS Lambda サービスが所有する Amazon VPC 内で実行されます。Lambda はこの VPC にネットワークアクセスとセキュリティルールを適用し、この VPC を自動的にモニタリングおよび維持します。Aurora PostgreSQL DB クラスターは、Lambda サービスの VPC にネットワークトラフィックを送信します。このための構成方法は、Aurora DB クラスターのプライマリDB インスタンスが、パブリックであるかプライベートであるかにより異なります。
+ **パブリック Aurora PostgreSQL DB クラスター** — VPC のパブリックサブネット内に置かれた DB クラスターのプライマリ 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) にパケットを送信するように定義しています。
+ **プライベートAurora 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)」を参照してください。このエンドポイントは、Aurora PostgreSQL DB クラスターが Lambda 関数に対して発行した、呼び出しに対して応答します。

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

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

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

**クラスターで Lambda を使用するために IAM のアクセス許可を設定するには**

1. AWS CLI コマンド [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) を実行して、指定された Lambda 関数を、Aurora PostgreSQL DB クラスターが呼び出すことを許可する、IAM ポリシーを作成します。(ステートメント ID (Sid) は、ポリシーステートメントのオプションの記述であり、使用には影響しません。) このポリシーは、Aurora 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-cluster](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/add-role-to-db-cluster.html) を使用して、このロールを Aurora PostgreSQL DB クラスターに適用します。この最後のステップにより、DB クラスターのデータベースユーザーに対し、Lambda 関数の呼び出しを許可します。

   ```
   aws rds add-role-to-db-cluster \
          --db-cluster-identifier my-cluster-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` 拡張機能は、Aurora PostgreSQL DB クラスターの機能に対し何も追加しません。)

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

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

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

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

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

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

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

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

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

## ステップ 4: Aurora 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 関数が Aurora 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: Aurora PostgreSQL DB クラスターから Lambda 関数を呼びだす](#PostgreSQL-Lambda-invoke)」を参照してください。

## ステップ 5: Aurora 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/AuroraUserGuide/images/lambda_simple_function.png)


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

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

   ```
   psql -h cluster.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 cluster.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;
   ```

# 例: Aurora PostgreSQL DB クラスターから Lambda 関数を呼びだす
<a name="PostgreSQL-Lambda-examples"></a>

以下に、[aws\$1lambda.invoke](PostgreSQL-Lambda-functions.md#aws_lambda.invoke) 関数の呼び出し例をいくつか示します。ほとんどの例では、関数の詳細を簡単に渡せるように、[ステップ 4: Aurora 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: Aurora 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 に接続できるようになっていることを確認します。
+ **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>

以下は、Aurora 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>

Aurora 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 リージョン。デフォルトでは、Aurora は AWS の完全な ARN から `function_name` リージョンを解決するか、Aurora 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 リージョンを含む、オプションのテキスト文字列。 リージョン名と関連する値のリストについては、「」を参照してください。[リージョンとアベイラビリティーゾーン](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 エンドポイントを選択します。この静的パラメータの変更を有効にするには、データベースを再起動する必要があります。 | 