Amazon Aurora DSQL での AWS Lambda の使用 - Amazon Aurora DSQL

Amazon Aurora DSQL はプレビューサービスとして提供されています。詳細については、「AWS サービス規約」の「ベータ版とプレビュー」を参照してください。

Amazon Aurora DSQL での AWS Lambda の使用

次のチュートリアルでは、Aurora DSQL で Lambda を使用する方法について説明します。

前提条件

  • Lambda 関数を作成する承認。詳細については「Getting started with Lambda」を参照してください。

  • Lambda によって作成された IAM ポリシーを作成または変更する承認。アクセス許可 iam:CreatePolicyiam:AttachRolePolicy が必要です。詳細については、「Actions, resources, and condition keys for IAM」を参照してください。

  • npm v8.5.3 以降がインストールされている必要があります。

  • zip v3.0 以降がインストールされている必要があります。

AWS Lambda で新しい関数を作成する
  1. AWS Management Console にサインインして AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. [Create function] (関数の作成) を選択します。

  3. dsql-sample などの名前を指定します。

  4. Lambda が基本的な Lambda アクセス許可を持つ新しいロールを作成するようにデフォルト設定を編集しないでください。

  5. [関数の作成] を選択してください。

Lambda 実行ロールにクラスターへの接続を許可する
  1. Lambda 関数で、[設定][アクセス許可] の順に選択します。

  2. [ロール名] を選択して、IAM コンソールで実行ロールを開きます。

  3. [アクセス許可の追加][インラインポリシーの作成] の順に選択し、JSON エディタを使用します。

  4. アクションに以下のアクションを貼り付け、IAM ID が管理データベースロールを使用して接続できるように権限を付与します。

    "Action": ["dsql:DbConnectAdmin"],
    注記

    開始するための前提条件のステップを最小限に抑えるために、管理者ロールを使用しています。本番稼働用アプリケーションには管理者データベースロールを使用しないでください。データベースへのアクセス許可が最も少ない認可でカスタムデータベースロールを作成する方法については、「IAM ロールでのデータベースロールの使用」を参照してください。

  5. [リソース] で、クラスターの Amazon リソースネーム (ARN) を追加します。ワイルドカードを使用することもできます。

    "Resource": ["*"]
  6. [次へ] を選択します。

  7. ポリシーの名前を入力します (例: dsql-sample-dbconnect)。

  8. [Create policy] (ポリシーの作成) を選択します。

Lambda にアップロードするためのパッケージを作成します。
  1. myfunction という名前のフォルダを作成します。

  2. そのフォルダ内に、以下の内容を含む package.json という名前の新しいファイルを作成します。

    { "dependencies": { "@aws-sdk/dsql-signer": "^3.705.0", "assert": "2.1.0", "pg": "^8.13.1" } }
  3. フォルダ内のディレクトリに以下の内容で 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; };
  4. 次のコマンドを使用してパッケージを作成します。

    npm install zip -r pkg.zip .
コードパッケージをアップロードし、Lambda 関数をテストする
  1. Lambda 関数の [Code] タブで、[Upload from][zip ファイル] の順に選択します。

  2. 作成した pkg.zip をアップロードします。詳細については、「.zip ファイルアーカイブで Node.js Lambda 関数をデプロイする」を参照してください。

  3. Lambda 関数の [テスト] タブで、次の JSON ペイロードを貼り付け、クラスター ID を使用するように変更します。

  4. Lambda 関数の [テスト] タブで、次のイベント JSON を変更してクラスターのエンドポイントを指定します。

    {"endpoint": "replace_with_your_cluster_endpoint"}
  5. イベント名を入力します (例: dsql-sample-test)。[保存] を選択します。

  6. [Test] を選択します。

  7. [詳細] を選択して、実行レスポンスとログ出力を展開します。

  8. 成功した場合、Lambda 関数の実行レスポンスは 200 のステータスコードを返します。

    {statusCode": 200, "endpoint": "your_cluster_endpoint"}

    データベースがエラーを返した場合、またはデータベースへの接続が失敗した場合、Lambda 関数の実行レスポンスは 500 ステータスコードを返します。

    {"statusCode": 500,"endpoint": "your_cluster_endpoint"}