You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取AWS Amplify自动生成的DynamoDB表名?

获取Amplify Data自动生成的DynamoDB表名(后端函数中)

问题背景

使用AWS Amplify通过Data模块定义Schema并自动生成DynamoDB表后,需要在后端函数中获取该表的名称以直接访问DynamoDB,当前在本地沙箱环境运行。

已尝试的方法及问题

  • 方法1:尝试通过@aws-amplify/backend-function的getDataSource获取表名,但报错

    import { DynamoDB } from 'aws-sdk';
    import { getDataSource } from '@aws-amplify/backend-function';
    import type { Schema } from '../../data/resource';
    
    const dynamodb = new DynamoDB.DocumentClient();
    
    export const handler: Schema['createEmptyProfile']['handler'] = async (event, context) => {
      const dataSource = getDataSource(context);
      const TABLE_NAME = dataSource.resources.UserProfile.tableName;
    };
    

    报错信息:

    Module "@aws-amplify/backend-function" has no exported member 'getDataSource'.ts(2305)

  • 方法2:执行npx ampx generate graphql-client-code --out /graphql生成客户端代码后,尝试读取env.AMPLIFY_DATA_GRAPHQL_ENDPOINT,但该环境变量未定义,生成的代码中也不存在该变量。

正确解决方案

方案1:通过环境变量注入表名(推荐)

在Amplify v6中,推荐将Data资源的表名作为环境变量注入到后端函数中,步骤如下:

  1. 在backend.ts文件中,引入Data资源并为目标函数添加环境变量:
    import { defineBackend } from '@aws-amplify/backend';
    import { data } from './data/resource';
    import { createEmptyProfile } from './functions/create-empty-profile/resource';
    
    const backend = defineBackend({
      data,
      createEmptyProfile
    });
    
    // 将UserProfile表名注入到createEmptyProfile函数的环境变量中
    backend.createEmptyProfile.addEnvironmentVariables({
      USER_PROFILE_TABLE_NAME: backend.data.resources.tables.UserProfile.name
    });
    
  2. 在后端函数中读取环境变量:
    import { DynamoDB } from 'aws-sdk';
    import { env } from '$amplify/env/create-empty-profile';
    
    const dynamodb = new DynamoDB.DocumentClient();
    
    export const handler = async (event) => {
      const TABLE_NAME = env.USER_PROFILE_TABLE_NAME;
      // 后续使用TABLE_NAME操作DynamoDB
      const params = {
        TableName: TABLE_NAME,
        // 其他参数示例
        Item: {
          id: event.userId,
          userName: event.userName,
          owner: event.userId
        }
      };
      await dynamodb.put(params).promise();
    };
    

方案2:通过Amplify配置获取(GraphQL API场景)

如果不需要直接操作DynamoDB,而是通过GraphQL API访问数据,可以在函数中初始化Amplify并调用API:

  1. 在函数中初始化Amplify并调用API:
    import { Amplify } from 'aws-amplify';
    import { generateClient } from 'aws-amplify/api';
    import { env } from '$amplify/env/create-empty-profile';
    import type { Schema } from '../../data/resource';
    
    // 初始化Amplify配置
    Amplify.configure({
      API: {
        GraphQL: {
          endpoint: env.AMPLIFY_DATA_GRAPHQL_ENDPOINT,
          region: env.AWS_REGION,
          defaultAuthMode: 'iam'
        }
      }
    });
    
    const client = generateClient<Schema>();
    
    export const handler = async (event) => {
      // 调用GraphQL API创建UserProfile
      await client.graphql({
        query: /* GraphQL */`
          mutation CreateUserProfile($input: CreateUserProfileInput!) {
            createUserProfile(input: $input) {
              id
              userName
            }
          }
        `,
        variables: {
          input: {
            userName: event.userName,
            owner: event.userId
          }
        }
      });
    };
    
    注:若AMPLIFY_DATA_GRAPHQL_ENDPOINT未自动生成,可在backend.ts中手动注入:
    backend.createEmptyProfile.addEnvironmentVariables({
      AMPLIFY_DATA_GRAPHQL_ENDPOINT: backend.data.resources.GraphQLAPI.url
    });
    

官方示例中文翻译(原英文文档核心内容)

创建用户档案记录示例

当用户完成Cognito注册后,自动创建对应的UserProfile记录:

  1. 创建一个绑定Cognito Post Confirmation事件的后端函数。
  2. 在函数中通过Amplify客户端调用GraphQL API,传入用户ID和默认属性创建UserProfile。
  3. 配置函数的IAM权限,允许其调用Data模块的GraphQL API执行创建操作。
  4. 在本地沙箱中触发该函数,验证UserProfile是否成功生成。

内容的提问来源于stack exchange,提问作者nycynik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 17:55:01