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

通过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/*'
                }
              ]
原因分析
  1. GSI配置语法错误:全局二级索引(GSI)的Projection部分存在空的NonKeyAttributes字段,而ProjectionType: KEYS_ONLY不需要指定非键属性,这会导致表创建流程失败,后续步骤找不到目标表。
  2. DeletionPolicy残留冲突:表配置了DeletionPolicy: Retain,若之前删除过CloudFormation栈但表被保留,之后手动删除了该表,再次部署时CloudFormation会尝试更新已不存在的表,触发报错。
  3. 自动扩缩容插件依赖问题: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:31:23