Amplify Gen 2部署DynamoDB表环境标识为NONE的修改方法问询
解决Amplify Gen2 DynamoDB表名环境标识为NONE的问题
可以通过两种方式自定义表名中的环境部分:
1. 直接在模型定义中指定自定义表名
在amplify/data/resource.ts里定义模型时,使用.tableName()方法拼接环境标识,结合环境变量动态设置:
import { type ClientSchema, a, defineData } from '@aws-amplify/backend'; const schema = a.schema({ User: a.model({ name: a.string(), email: a.string().required() }).authorization((allow) => [allow.publicApiKey()]) // 拼接模型名、AppSync ID和自定义环境标识 .tableName(`User-${process.env.APPSYNC_ID}-${process.env.ENV_NAME}`) }); export const data = defineData({ schema, authorizationModes: { defaultAuthorizationMode: 'apiKey', apiKeyAuthorizationMode: { expiresInDays: 30 } } });
- 设置环境变量:
- 本地开发:在项目根目录的
.env文件中添加ENV_NAME=Dev1Sandbox APPSYNC_ID=你的AppSync服务ID # 可通过amplify status或控制台获取 - 生产部署:在Amplify控制台的环境变量面板中设置
ENV_NAME=PROD
- 本地开发:在项目根目录的
2. 通过CDK覆盖默认表名(无需修改模型定义)
如果不想改动模型代码,可以在amplify/backend.ts中通过CDK修改自动生成的DynamoDB表名:
import { defineBackend } from '@aws-amplify/backend'; import { data } from './data/resource'; import { Table } from 'aws-cdk-lib/aws-dynamodb'; const backend = defineBackend({ data }); // 获取自动生成的User表,替换原表名的NONE部分为自定义环境标识 const userTable = backend.data.resources.tables.User as Table; const originalParts = userTable.tableName.split('-'); userTable.node.addPropertyOverride( 'TableName', `${originalParts[0]}-${originalParts[1]}-${process.env.ENV_NAME}` );
同样需要设置ENV_NAME环境变量,Amplify部署时会自动读取该变量并替换表名。
注意事项
AMPLIFY_ENV_NAME是Amplify部署时自动注入的环境变量,对应你创建的Amplify环境名称(比如运行amplify env add prod后,该变量值为prod),可以直接用来替代自定义的ENV_NAME,减少手动配置。- 修改表名后需要重新部署:本地沙箱运行
amplify sandbox,生产环境运行amplify push。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

