将 AWS Lambda 与 Amazon Aurora DSQL 结合使用 - Amazon Aurora DSQL

Amazon Aurora DSQL 作为预览服务提供。要了解更多信息,请参阅《AWS Service Terms》中的 Betas and Previews

将 AWS Lambda 与 Amazon Aurora DSQL 结合使用

以下教程介绍了如何将 Lambda 与 Aurora DSQL 结合使用

先决条件

  • 用于创建 Lambda 函数的授权。有关更多信息,请参阅 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. 选择创建函数

  3. 提供名称,例如 dsql-sample

  4. 请勿编辑默认设置,以确保 Lambda 创建具有基本 Lambda 权限的新角色。

  5. 选择创建函数

授权您的 Lambda 执行角色连接到集群
  1. 在 Lambda 函数中,选择配置 > 权限

  2. 选择角色名称以在 IAM 控制台中打开执行角色。

  3. 选择添加权限 > 创建内联策略并使用 JSON 编辑器。

  4. 操作中,粘贴以下操作,以授权您的 IAM 身份使用管理员数据库角色进行连接。

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

    我们使用管理员角色来尽量减少入门的先决条件步骤。不应为生产应用程序使用管理员数据库角色。要了解如何使用对数据库具有最少权限的授权来创建自定义数据库角色,请参阅将数据库角色与 IAM 角色结合使用

  5. 资源中,添加集群的 Amazon 资源名称(ARN)。还可以使用通配符。

    "Resource": ["*"]
  6. 选择下一步

  7. 输入策略的名称,例如 dsql-sample-dbconnect

  8. 选择创建策略

创建一个要上传到 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 函数的代码选项卡中,选择上传自 > .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. 选择测试

  7. 选择详细信息以展开执行响应和日志输出。

  8. 如果成功,Lambda 函数执行响应应返回 200 状态代码:

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

    如果数据库返回错误或数据库连接失败,Lambda 函数执行响应将返回 500 状态代码。

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