如何获取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资源的表名作为环境变量注入到后端函数中,步骤如下:
- 在
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 }); - 在后端函数中读取环境变量:
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:
- 在函数中初始化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记录:
- 创建一个绑定Cognito Post Confirmation事件的后端函数。
- 在函数中通过Amplify客户端调用GraphQL API,传入用户ID和默认属性创建UserProfile。
- 配置函数的IAM权限,允许其调用Data模块的GraphQL API执行创建操作。
- 在本地沙箱中触发该函数,验证UserProfile是否成功生成。
内容的提问来源于stack exchange,提问作者nycynik
相关产品推荐
相关产品推荐

