

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