UNPKG

@convo-lang/convo-lang-aws-cdk

Version:
79 lines 3.54 kB
import { openAiSecretsParam } from '@convo-lang/convo-lang'; import { FnsBuilder, getDefaultManagedProps, grantTableQueryPerms } from '@iyio/cdk-common'; import * as cdk from 'aws-cdk-lib'; import * as db from "aws-cdk-lib/aws-dynamodb"; import * as iam from 'aws-cdk-lib/aws-iam'; import * as secrets from 'aws-cdk-lib/aws-secretsmanager'; import { Construct } from 'constructs'; import { convoLangAnonUsdCapParam, convoLangAnonUsdCapTotalParam, convoLangApiFnArnParam, convoLangApiFnUrlParam, convoLangCapsTableParam } from "./convo-lang-aws-cdk.deps.js"; export class ConvoLangConstruct extends Construct { constructor(scope, id, { managed = getDefaultManagedProps(), defaultFnProps, fnName = "ConvoLangApiFn", anonUsdCap, anonUsdCapTotal, grantAccess, handleQuotas = anonUsdCap !== undefined || anonUsdCapTotal !== undefined, } = {}) { super(scope, id); const { params } = managed; let getQName = fnName; if (getQName.endsWith('Fn')) { getQName = getQName.substring(0, getQName.length - 2); } getQName += 'GetTokenQuotaFn'; const fnsInfo = [{ name: fnName, arnParam: convoLangApiFnArnParam, urlParam: convoLangApiFnUrlParam, grantAccess, createProps: { createPublicUrl: true, bundledHandlerFileNames: [ '../../dist/packages/convo-lang-aws-cdk/handlers/ConvoLangApi', '../../node_modules/@convo-lang/convo-lang-aws-cdk/handlers/ConvoLangApi', ], timeoutMs: 1000 * 60 * 5, ...defaultFnProps, }, }]; const fnBuilder = new FnsBuilder(this, "Fns", { fnsInfo, managed, }); this.fnBuilder = fnBuilder; const handlerFn = fnBuilder.fns.find(f => f.info.name === fnName)?.fn; if (!handlerFn) { throw new Error('FnsBuilder did not create a matching named fn'); } this.handlerFn = handlerFn; handlerFn.func.addToRolePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: [ "bedrock:InvokeModel" ], resources: ["*"], })); if (anonUsdCap !== undefined) { handlerFn.func.addEnvironment(convoLangAnonUsdCapParam.typeName, anonUsdCap.toString()); } if (anonUsdCapTotal !== undefined) { handlerFn.func.addEnvironment(convoLangAnonUsdCapTotalParam.typeName, anonUsdCapTotal.toString()); } if (handleQuotas) { const capTable = new db.Table(this, 'Caps', { tableClass: db.TableClass.STANDARD, billingMode: db.BillingMode.PAY_PER_REQUEST, partitionKey: { name: 'id', type: db.AttributeType.STRING, }, removalPolicy: cdk.RemovalPolicy.RETAIN, }); capTable.grantFullAccess(handlerFn.func); grantTableQueryPerms(handlerFn.func, capTable); if (params) { params.setParam(convoLangCapsTableParam, capTable.tableArn); } } const secret = new secrets.Secret(this, 'ApiKey'); secret.grantRead(handlerFn.func); if (params) { params.setParam(openAiSecretsParam, secret.secretArn); } } } //# sourceMappingURL=ConvoLangConstruct.js.map