Amazon Aurora DSQL はプレビューサービスとして提供されています。詳細については、「AWS サービス規約」の「ベータ版とプレビュー
Amazon Aurora DSQL での AWS Lambda の使用
次のチュートリアルでは、Aurora DSQL で Lambda を使用する方法について説明します。
前提条件
-
Lambda 関数を作成する承認。詳細については「Getting started with Lambda」を参照してください。
-
Lambda によって作成された IAM ポリシーを作成または変更する承認。アクセス許可
iam:CreatePolicy
とiam:AttachRolePolicy
が必要です。詳細については、「Actions, resources, and condition keys for IAM」を参照してください。 -
npm v8.5.3 以降がインストールされている必要があります。
-
zip v3.0 以降がインストールされている必要があります。
AWS Lambda で新しい関数を作成する
AWS Management Console にサインインして AWS Lambda コンソール (https://console.aws.amazon.com/lambda/
) を開きます。 -
[Create function] (関数の作成) を選択します。
-
dsql-sample
などの名前を指定します。 -
Lambda が基本的な Lambda アクセス許可を持つ新しいロールを作成するようにデフォルト設定を編集しないでください。
-
[関数の作成] を選択してください。
Lambda 実行ロールにクラスターへの接続を許可する
-
Lambda 関数で、[設定]、[アクセス許可] の順に選択します。
-
[ロール名] を選択して、IAM コンソールで実行ロールを開きます。
-
[アクセス許可の追加]、[インラインポリシーの作成] の順に選択し、JSON エディタを使用します。
-
アクションに以下のアクションを貼り付け、IAM ID が管理データベースロールを使用して接続できるように権限を付与します。
"Action": ["dsql:DbConnectAdmin"],
注記
開始するための前提条件のステップを最小限に抑えるために、管理者ロールを使用しています。本番稼働用アプリケーションには管理者データベースロールを使用しないでください。データベースへのアクセス許可が最も少ない認可でカスタムデータベースロールを作成する方法については、「IAM ロールでのデータベースロールの使用」を参照してください。
-
[リソース] で、クラスターの Amazon リソースネーム (ARN) を追加します。ワイルドカードを使用することもできます。
"Resource": ["*"]
-
[次へ] を選択します。
-
ポリシーの名前を入力します (例:
dsql-sample-dbconnect
)。 -
[Create policy] (ポリシーの作成) を選択します。
Lambda にアップロードするためのパッケージを作成します。
-
myfunction
という名前のフォルダを作成します。 -
そのフォルダ内に、以下の内容を含む
package.json
という名前の新しいファイルを作成します。{ "dependencies": { "@aws-sdk/dsql-signer": "^3.705.0", "assert": "2.1.0", "pg": "^8.13.1" } }
-
フォルダ内のディレクトリに以下の内容で
index.mjs
というファイルを作成します。import { DsqlSigner } from "@aws-sdk/dsql-signer"; import pg from "pg"; import assert from "node:assert"; const { Client } = pg; async function dsql_sample(clusterEndpoint, region) { let client; try { // The token expiration time is optional, and the default value 900 seconds const signer = new DsqlSigner({ hostname: clusterEndpoint, region, }); const token = await signer.getDbConnectAdminAuthToken(); // <https://node-postgres.com/apis/client> // By default `rejectUnauthorized` is true in TLS options // <https://nodejs.org/api/tls.html#tls_tls_connect_options_callback> // The config does not offer any specific parameter to set sslmode to verify-full // Settings are controlled either via connection string or by setting // rejectUnauthorized to false in ssl options client = new Client({ host: clusterEndpoint, user: "admin", password: token, database: "postgres", port: 5432, // <https://node-postgres.com/announcements> for version 8.0 ssl: true, rejectUnauthorized: false }); // Connect await client.connect(); // Create a new table await client.query(`CREATE TABLE IF NOT EXISTS owner ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(30) NOT NULL, city VARCHAR(80) NOT NULL, telephone VARCHAR(20) )`); // Insert some data await client.query("INSERT INTO owner(name, city, telephone) VALUES($1, $2, $3)", ["John Doe", "Anytown", "555-555-1900"] ); // Check that data is inserted by reading it back const result = await client.query("SELECT id, city FROM owner where name='John Doe'"); assert.deepEqual(result.rows[0].city, "Anytown") assert.notEqual(result.rows[0].id, null) await client.query("DELETE FROM owner where name='John Doe'"); } catch (error) { console.error(error); throw new Error("Failed to connect to the database"); } finally { client?.end(); } Promise.resolve(); } // https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html export const handler = async (event) => { const endpoint = event.endpoint; const region = event.region; const responseCode = await dsql_sample(endpoint, region); const response = { statusCode: responseCode, endpoint: endpoint, }; return response; };
-
次のコマンドを使用してパッケージを作成します。
npm install zip -r pkg.zip .
コードパッケージをアップロードし、Lambda 関数をテストする
-
Lambda 関数の [Code] タブで、[Upload from]、[zip ファイル] の順に選択します。
-
作成した
pkg.zip
をアップロードします。詳細については、「.zip ファイルアーカイブで Node.js Lambda 関数をデプロイする」を参照してください。 -
Lambda 関数の [テスト] タブで、次の JSON ペイロードを貼り付け、クラスター ID を使用するように変更します。
-
Lambda 関数の [テスト] タブで、次のイベント JSON を変更してクラスターのエンドポイントを指定します。
{"endpoint": "replace_with_your_cluster_endpoint"}
-
イベント名を入力します (例:
dsql-sample-test
)。[保存] を選択します。 -
[Test] を選択します。
-
[詳細] を選択して、実行レスポンスとログ出力を展開します。
-
成功した場合、Lambda 関数の実行レスポンスは 200 のステータスコードを返します。
{statusCode": 200, "endpoint": "your_cluster_endpoint"}
データベースがエラーを返した場合、またはデータベースへの接続が失敗した場合、Lambda 関数の実行レスポンスは 500 ステータスコードを返します。
{"statusCode": 500,"endpoint": "your_cluster_endpoint"}