跳转到内容

TypeScript Agent 到关系数据库

connection 生成器将 TypeScript Agent 连接到 关系数据库 项目,使 Prisma 客户端在您的 agent 工厂中可用。

在使用此生成器之前,请确保您拥有:

  1. 一个 ts#agent 项目
  2. 一个 ts#rdb 项目
Terminal window
pnpm nx g @aws/nx-plugin:connection
您还可以执行试运行以查看哪些文件会被更改
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

选择您的 Agent 项目作为源,选择您的关系数据库项目作为目标。如果项目包含多个 agent 组件,请指定 sourceComponent 以消除歧义。

参数类型默认值描述
sourceProject 必需string-源项目
targetProject 必需string-要连接到的目标项目
sourceComponent string-要从其连接的源组件(组件名称、相对于源项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为源。
targetComponent string-要连接到的目标组件(组件名称、相对于目标项目根目录的路径或生成器 ID)。使用 '.' 显式选择项目作为目标。
preferInstallDependencies booleantrue是否在生成器运行后优先安装依赖项。设置为 false 可在批量运行多个生成器时延迟安装(如果后续生成器需要计算 Nx 项目图,仍会运行安装);在最后统一安装一次。

生成器会修改您的 agent 源目录中的两个文件:

  • 文件夹packages/my-service/src/my-agent
    • agent.ts getAgent 中获取 Prisma 客户端并可供工具使用
    • Dockerfile 安装 RDS CA 证书包以实现与 Aurora 的 SSL 连接

此外,agent 的 <agent-name>-dev 目标会更新为依赖于数据库的 dev 目标。

Prisma 客户端在 getAgent() 内部实例化。由于 ts#agent 生成器为每个会话配置一个 Agent,因此客户端也会在会话的生命周期内重复使用:

packages/my-service/src/my-agent/agent.ts
import { getPrisma as getMyDb } from '@my-scope/my-db';
export const getAgent = async () => {
const myDb = await getMyDb();
// ...
return new Agent({ /* use myDb in tools */ });
};

使用不同的目标再次运行生成器会将第二个数据库添加到第一个数据库旁边:

packages/my-service/src/my-agent/agent.ts
import { getPrisma as getMyDb } from '@my-scope/my-db';
import { getPrisma as getOtherDb } from '@my-scope/other-db';
export const getAgent = async () => {
const myDb = await getMyDb();
const otherDb = await getOtherDb();
// ...
return new Agent({ /* use both clients in tools */ });
};

生成的 agent 构造实现了 IGrantableIConnectable,因此您可以直接在构造上授予对数据库的网络和 IAM 访问权限。

packages/infra/src/stacks/application-stack.ts
import { SecurityGroup } from 'aws-cdk-lib/aws-ec2';
import { RuntimeNetworkConfiguration } from 'aws-cdk-lib/aws-bedrockagentcore';
import { MyDatabase } from '@my-scope/common-constructs';
const db = new MyDatabase(this, 'Db', { vpc, ... });
const myAgent = new MyAgent(this, 'MyAgent', {
networkConfiguration: RuntimeNetworkConfiguration.usingVpc(this, {
vpc,
vpcSubnets: { subnetType: SubnetType.PRIVATE_WITH_EGRESS },
securityGroups: [
new SecurityGroup(this, 'MyAgentSecurityGroup', { vpc, allowAllOutbound: true }),
],
}),
});
db.allowDefaultPortFrom(myAgent);
db.grantConnect(myAgent);

allowDefaultPortFrom 打开安全组规则,以便 agent 运行时可以访问数据库端口。grantConnect 向 agent 的执行角色授予 IAM rds-db:connect 权限。

不使用 RDS Proxy 连接时的 SSL 要求

Section titled “不使用 RDS Proxy 连接时的 SSL 要求”

连接生成器会更新 Dockerfile 以在 /usr/local/share/ca-certificates/rds-bundle.crt 安装 Amazon RDS CA 证书包。将 NODE_EXTRA_CA_CERTS 设置为该路径,以便 Node.js 在不使用 RDS Proxy 连接时信任该证书:

packages/infra/src/stacks/application-stack.ts
new MyAgent(this, 'MyAgent', {
...
environmentVariables: {
NODE_EXTRA_CA_CERTS: '/usr/local/share/ca-certificates/rds-bundle.crt',
},
});

有关更多详细信息,请参阅 Amazon RDS SSL/TLS 文档。使用 RDS Proxy 时,您无需配置 NODE_EXTRA_CA_CERTS

Terminal window
pnpm nx <agent-name>-dev <project-name>

这将启动 agent 和所有连接的数据库。LOCAL_DEV=true 环境变量会导致每个 Prisma 客户端连接到其本地 Docker 数据库而不是 Aurora。