通过YAML创建AWS DynamoDB表时提示表不存在的问题排查
问题描述
部署Serverless应用时创建DynamoDB表失败,错误信息如下:
UPDATE_FAILED: productGroupTable (AWS::DynamoDB::Table)
Resource handler returned message: "Table: productGroupTableDev does not exist." (RequestToken: bdc2ae26-5fde-6965-8609-bdaddff79ddf, HandlerErrorCode: NotFound)
使用的YAML配置文件:
custom: product: wms modelName: productGroups microServiceAction: create microServiceVersion: v1 microService: wms-productGroups-create-v1 capacities: - table: productGroupTable read: minimum: 5 # Minimum read capacity maximum: 100 # Maximum read capacity usage: 0.60 # Targeted usage percentage write: minimum: 5 # Minimum write capacity maximum: 50 # Maximum write capacity usage: 0.60 # Targeted usage percentage resources: Resources: productGroupTable: Type: AWS::DynamoDB::Table DeletionPolicy: Retain Properties: TableName: productGroupTableDev AttributeDefinitions: - AttributeName: id AttributeType: S - AttributeName: external_id AttributeType: S KeySchema: - AttributeName: id KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 GlobalSecondaryIndexes: - IndexName: "external_id-index" KeySchema: - AttributeName: external_id KeyType: HASH Projection: NonKeyAttributes: ProjectionType: KEYS_ONLY ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5 provider: environment: MICROSERVICE_CREATE_PRODUCT_GROUP: wms-productGroups-create-v1-lambda-dev plugins: - serverless-dynamodb-autoscaling functions: P_1_3_1_productGroup_create: name: wms-productGroups-create-v1-lambda-dev handler: src.P_1_3_1_productGroup_create.core.handler.product_groups_create environment: DB_NAME: productGroupTableDev JSON_SCHEMA_PATH: ./src/P_1_3_1_productGroup_create/core/wms-productGroups-create-v1-schema.json timeout: 30 events: - http: method: POST path: products/create/groups/ cors: true # request: # schemas: # application/json: ${self:provider.apiGateway.request.schemas.model} # if you want to raise schema validator error from api gateway # application/json: ${self:provider.apiGateway.request.schemas.model.schema} - eventBridge: pattern: source: - wms-serverless.dev.event detail-type: - CREATE_PRODUCT_GROUP
IAM策略配置:
Policies: - PolicyName: ${self:custom.microService}-${opt:stage, 'dev'}-lambda PolicyDocument: Version: '2012-10-17' Statement: [ { Effect: 'Allow', Action: [ 'cognito-idp:AdminInitiateAuth', 'events:PutEvents', 'lambda:InvokeFunction' ], Resource: '*' }, { Effect: 'Allow', Action: [ 'dynamodb:GetItem', 'dynamodb:Scan', 'dynamodb:PutItem' ], Resource: 'arn:aws:dynamodb:${aws:region}:${aws:accountId}:table/*' }, { Effect: 'Allow', Action: [ 'logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents' ], Resource: 'arn:aws:logs:${aws:region}:${aws:accountId}:log-group:/aws/lambda/*' } ]
原因分析
- GSI配置语法错误:全局二级索引(GSI)的
Projection部分存在空的NonKeyAttributes字段,而ProjectionType: KEYS_ONLY不需要指定非键属性,这会导致表创建流程失败,后续步骤找不到目标表。 - DeletionPolicy残留冲突:表配置了
DeletionPolicy: Retain,若之前删除过CloudFormation栈但表被保留,之后手动删除了该表,再次部署时CloudFormation会尝试更新已不存在的表,触发报错。 - 自动扩缩容插件依赖问题:
serverless-dynamodb-autoscaling插件可能在表创建完成前就尝试配置自动扩缩容规则,导致找不到表的错误。
解决方案
1. 修复GSI配置错误
删除GSI中Projection下空的NonKeyAttributes字段,修正后的配置如下:
GlobalSecondaryIndexes: - IndexName: "external_id-index" KeySchema: - AttributeName: external_id KeyType: HASH Projection: ProjectionType: KEYS_ONLY ProvisionedThroughput: ReadCapacityUnits: 5 WriteCapacityUnits: 5
2. 处理DeletionPolicy与残留资源
- 若无需保留表,将
DeletionPolicy改为Delete,避免栈删除后残留表引发的冲突:productGroupTable: Type: AWS::DynamoDB::Table DeletionPolicy: Delete ... - 若必须保留表,先检查AWS控制台:
- 若
productGroupTableDev不存在,手动创建表(或删除当前CloudFormation栈后重新部署); - 若表存在,确认表的主键、GSI等属性与配置文件完全一致,避免属性不匹配导致更新失败。
- 若
3. 调整插件执行逻辑
- 先单独部署表资源,再部署整个应用,确保表创建完成后再配置自动扩缩容:
serverless deploy --resource productGroupTable - 更新
serverless-dynamodb-autoscaling插件到最新版本,修复已知的兼容性问题。
4. 验证IAM权限
确认部署使用的IAM角色拥有dynamodb:CreateTable和dynamodb:UpdateTable权限(当前策略的table/*资源已包含这些操作,但需排查是否有其他权限限制)。
内容的提问来源于stack exchange,提问作者Juan Pablo Cifuentes
相关产品推荐
相关产品推荐

