Aller au contenu

Agent TypeScript vers Base de Données Relationnelle

Le générateur connection relie un Agent TypeScript à un projet de Base de Données Relationnelle, rendant un client Prisma disponible à l’intérieur de votre factory d’agent.

Avant d’utiliser ce générateur, assurez-vous d’avoir :

  1. Un projet ts#agent
  2. Un projet ts#rdb
Terminal window
pnpm nx g @aws/nx-plugin:connection
Vous pouvez également effectuer une simulation pour voir quels fichiers seraient modifiés
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Sélectionnez votre projet Agent comme source et votre projet de base de données relationnelle comme cible. Si le projet contient plusieurs composants d’agent, spécifiez sourceComponent pour lever l’ambiguïté.

ParamètreTypePar défautDescription
sourceProject Requisstring-Le projet source
targetProject Requisstring-Le projet cible auquel se connecter
sourceComponent string-Le composant source depuis lequel se connecter (nom du composant, chemin relatif à la racine du projet source, ou identifiant du générateur). Utilisez '.' pour sélectionner explicitement le projet comme source.
targetComponent string-Le composant cible auquel se connecter (nom du composant, chemin relatif à la racine du projet cible, ou identifiant du générateur). Utilisez '.' pour sélectionner explicitement le projet comme cible.
preferInstallDependencies booleantrueIndique s'il faut privilégier l'installation des dépendances après l'exécution du générateur. Définir à false pour différer l'installation lors de l'exécution de plusieurs générateurs en lot (une installation s'exécute quand même si nécessaire pour que les générateurs suivants puissent calculer le graphe de projet Nx) ; installer une seule fois à la fin.

Le générateur modifie deux fichiers dans le répertoire source de votre agent :

  • Répertoirepackages/my-service/src/my-agent
    • agent.ts Client Prisma récupéré dans getAgent et disponible pour les outils
    • Dockerfile Bundle CA RDS installé pour les connexions SSL à Aurora

De plus, la cible <agent-name>-dev de l’agent est mise à jour pour dépendre de la cible dev de la base de données.

Utiliser la Base de Données dans les Outils de l’Agent

Section intitulée « Utiliser la Base de Données dans les Outils de l’Agent »

Le client Prisma est instancié à l’intérieur de getAgent(). Étant donné que le générateur ts#agent configure un seul Agent par session, le client est également réutilisé pendant toute la durée de vie de la session :

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 */ });
};

Exécuter à nouveau le générateur avec une cible différente ajoute la deuxième base de données à côté de la première :

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 */ });
};

Le construct d’agent généré implémente IGrantable et IConnectable, vous pouvez donc accorder l’accès réseau et IAM à la base de données directement sur le construct.

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 ouvre la règle du groupe de sécurité afin que le runtime de l’agent puisse atteindre le port de la base de données. grantConnect accorde la permission IAM rds-db:connect au rôle d’exécution de l’agent.

Le générateur de connexion met à jour le Dockerfile pour installer le bundle CA Amazon RDS à l’emplacement /usr/local/share/ca-certificates/rds-bundle.crt. Définissez NODE_EXTRA_CA_CERTS sur ce chemin afin que Node.js fasse confiance au certificat lors de la connexion sans 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',
},
});

Pour plus de détails, consultez la documentation Amazon RDS SSL/TLS. Lors de l’utilisation de RDS Proxy, vous n’avez pas besoin de configurer NODE_EXTRA_CA_CERTS.

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

Cela démarre l’agent et toutes les bases de données connectées. La variable d’environnement LOCAL_DEV=true fait en sorte que chaque client Prisma se connecte à sa base de données Docker locale au lieu d’Aurora.