Pular para o conteúdo

API Smithy para DynamoDB

O gerador connection conecta uma API Smithy a um projeto TypeScript DynamoDB, configurando o desenvolvimento local para que ambos iniciem juntos automaticamente.

Antes de usar este gerador, certifique-se de ter:

  1. Um projeto API TypeScript Smithy (gerado com ts#api usando --framework=smithy)
  2. Um projeto ts#dynamodb
Terminal window
pnpm nx g @aws/nx-plugin:connection
Você também pode realizar uma execução simulada para ver quais arquivos seriam alterados
Terminal window
pnpm nx g @aws/nx-plugin:connection --dry-run

Selecione seu projeto backend de API Smithy como origem e seu projeto DynamoDB como destino.

ParâmetroTipoPadrãoDescrição
sourceProject Obrigatóriostring-O projeto de origem
targetProject Obrigatóriostring-O projeto de destino para conectar
sourceComponent string-O componente de origem para conectar (nome do componente, caminho relativo à raiz do projeto de origem, ou id do gerador). Use '.' para selecionar explicitamente o projeto como origem.
targetComponent string-O componente de destino para conectar (nome do componente, caminho relativo à raiz do projeto de destino, ou id do gerador). Use '.' para selecionar explicitamente o projeto como destino.
preferInstallDependencies booleantrueSe deve preferir instalar dependências após a execução do gerador. Defina como false para adiar a instalação ao executar múltiplos geradores em lote (uma instalação ainda é executada se necessário para que os geradores subsequentes possam calcular o grafo de projetos Nx); instale uma vez no final.

O gerador atualiza o project.json da sua API Smithy para adicionar uma dependência do seu target dev para o target dev do projeto DynamoDB. Nenhum arquivo de código-fonte é modificado.

Importe as factories de entidade do pacote DynamoDB e use-as dentro das implementações de suas operações:

packages/api/src/operations/list-examples.ts
import { createExampleEntity } from '@my-scope/my-table';
import {
ListExamplesOperationInput,
ListExamplesOperationOutput,
} from '../generated/ssdk/index.js';
import { ServiceContext } from '../context.js';
export const listExamples = async (
_input: ListExamplesOperationInput,
_ctx: ServiceContext,
): Promise<ListExamplesOperationOutput> => {
const entity = await createExampleEntity();
const result = await entity.scan.go();
return { items: result.data };
};

Para permitir que funções Lambda acessem a tabela DynamoDB, conceda as permissões necessárias em sua infraestrutura.

Chame grantReadWriteData no construto da tabela. Isso concede tanto as permissões do DynamoDB quanto do KMS exigidas pela função de execução do Lambda:

packages/infra/src/stacks/application-stack.ts
import { MyTable } from '@my-scope/common-constructs';
const table = new MyTable(this, 'Table');
const api = new Api(this, 'Api', {
integrations: Api.defaultIntegrations(this).build(),
});
Object.entries(api.integrations).forEach(([, integration]) => {
table.grantReadWriteData(integration.handler);
});

O gerador connection configura o target dev do seu projeto para depender do target dev do projeto DynamoDB. O DynamoDB Local será iniciado automaticamente junto com seu projeto ao executar dev.

A variável de ambiente LOCAL_DEV=true é definida automaticamente, então getDynamoDBClient() e resolveTableName() se conectam à instância local do DynamoDB Local em vez da AWS.