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 Smithy TypeScript API (gerado com ts#api usando --framework=smithy)
  2. Um projeto ts#dynamodb
  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - connection
  5. Preencha os parâmetros obrigatórios
    • Clique em Generate

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

    Parâmetro Tipo Padrão Descrição
    sourceProject Obrigatório string - O projeto de origem
    targetProject Obrigatório string - 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 boolean true Se 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 ao 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 suas implementações de operação:

    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 as permissões do DynamoDB e KMS necessárias para a 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 o seu projeto ao executar dev.

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