Lambda 如果DynamoDb表已经存在,如何继续部署

Lambda 如果DynamoDb表已经存在,如何继续部署,lambda,amazon-dynamodb,serverless-framework,Lambda,Amazon Dynamodb,Serverless Framework,即使资源已经存在,我也希望继续部署(或强制部署) 我犯了这个错误: Serverless Error --------------------------------------- An error occurred while provisioning your stack: AvailableDynamoDbTable - Available already exists. 用自动取款机是不可能的Serverless@1.6.1. 我刚刚在github上打开了一个问题

即使资源已经存在,我也希望继续部署(或强制部署)

我犯了这个错误:

Serverless Error ---------------------------------------

     An error occurred while provisioning your stack: AvailableDynamoDbTable
     - Available already exists.

用自动取款机是不可能的Serverless@1.6.1.

我刚刚在github上打开了一个问题:

所有需要此功能的人,请加入此讨论


我将在这里更新新闻。

我遇到了同样的问题,并删除了
serverless.yml
中的
xxxdynamodtable
,您的Dynamodb中已经存在的项可以工作。您不必再次使用
Resources
D

这个问题已经很老了,但仍然出现在谷歌排名前五的搜索结果中,因此这里有一点见解: 将无服务器堆栈拆分为多个服务是一个好主意,每个服务都有自己的
serverless.yml
文件。一个用于API和lambdas,一个用于DynamoDB。通过这种方式,您可以单独处理它们,并在不接触数据库的情况下更新lambda。 以下是关于这方面的一个很好的指南:


  • 备份该表并将其删除。部署后立即恢复。

    当我重命名我的无服务器项目并尝试部署时,我也遇到了同样的问题。我有一个表
    tanks
    ,它被再次使用。 它失败了,原因如下

    Serverless Error ---------------------------------------
    
     An error occurred: TanksDynamoDbTable - tanks already exists in stack arn:aws:cloudformation:eu-central-1:592235674655:stack/colossal-dev/105693a8-77af-11e9-8f9e-2a86e4085a59.
    
    我通过备份tanks表,然后删除它,解决了这个问题

  • 控制台>发电机B
  • 在左侧选择备份
  • 创建备份>从下拉列表中选择表并为其命名> 创造
  • 在左侧选择表格
  • 检查油箱>删除
  • 删除后,必须等待五分钟,因为缓存会定期清理,而不是立即清理。 在那之后,我尝试了
    无服务器部署
    ,它成功了。 在此之后,您将需要恢复备份的数据库

  • 在左侧选择备份
  • 检查备份表>恢复
  • 为表键入与以前相同的名称作为新表名
  • 还原表 恢复的数据库需要一些时间,因此可能需要等待5分钟或更长时间

  • 如果测试环境,您可以转到AWS控制台删除已有的表,所以如果您想创建多个lambda函数共享一些表,您应该创建一个仅处理Dynamodb的serverless,其余服务不包含任何Dynamodb配置

    如果希望所有lambda都使用相同的API网关,可以在提供程序下方添加
    apiGateway
    ,如下例所示

    例如:

    • 无服务器A:DynamoDB和公共端点
      /
      ,API网关
      restApiId:xxxxx
      restApiRootResourceId:yyyyy

    • 无服务器B:用户服务和公共端点
      /users

    • 无服务器C:车辆服务和公共端点
      /Vehicle

    无服务器.yml无服务器A serverless.yml serverless B serverless.yml serverless C
    检查以确保您没有意外地创建CloudFormation堆栈的新实例,可能使用了不同的名称。如果您使用与已存在的堆栈相同的名称进行部署,那么它应该只是更新所有内容


    但是,如果由于名称更改而无意中创建了新堆栈,例如“my app prod”与“my app production”,则可能会发生此故障,因为您的“my app prod”已经创建了表和“my app production”正在尝试重新创建那些可能会失败的表,因为它们已经存在。

    与其他部署问题一起挣扎了2周

    现在我想说-表alredy存在或队列不存在,并且类似 都是因为您试图违反堆栈“安全性”:

    • 无服务器应用程序依赖于CloudFormation
    • 如果您的无服务器部署尝试管理资源,但 属于它-你将“已经存在…”(但不是你的)
    自从我从头开始重新部署并恢复了dbs以来,我几乎总是在资源发生变化的情况下进行稳定的部署,直到有同事 (手动执行某些操作)

    因此,不存在此类问题会更好:

    • 手动添加、删除、修改资源的步骤
    • 命名它们以避免重叠(如dev表/prod表)
    • 将资源用作外部资源,以使用ARN堆叠资源(或使用无服务器输出的导出TAME)
    • 将资源(资源组)导入堆栈

    如果您的资源不是由该无服务器应用程序单独处理的,则不应尝试处理它。要么处理serverless创建的CloudFormation堆栈中的资源,要么处理它最初创建的位置。@DoorStick,它由serverless处理,但有时您需要重新创建表,现在需要删除所有serverless,因为此错误总是出现,您无法部署为什么必须重新创建表?听起来好像它不是完全由无服务器和云形成堆栈处理的,它有自己的生命。在这种情况下,不要考虑用无服务器管理数据库。只有完全在无服务器项目内部使用并且只有在其中使用的数据库才应由无服务器项目处理。如果数据库具有外部依赖项(其他人调用它),或者其他人将重新创建它,等等,那么它不应该是无服务器堆栈的一部分。这只是我的观点和经验:)这是一个很好的建议,但不是正确的解决方案。因为它不能真正解决问题。正如你在论坛中所看到的那样,@Marckaraujo你指的是哪个论坛?你能链接到它吗?关于这个问题有什么消息吗?这实际上是有效的,尽管我必须在能够再次恢复它之前删除新部署的表。
    resources:
      Resources:
        VehiclesDynamoDbTable:
            Type: 'AWS::DynamoDB::Table'
            DeletionPolicy: Retain
            Properties:
              AttributeDefinitions:
                -
                  AttributeName: id
                  AttributeType: S
              KeySchema:
                -
                  AttributeName: id
                  KeyType: HASH
              ProvisionedThroughput:
                ReadCapacityUnits: 1
                WriteCapacityUnits: 1
              TableName: ${self:provider.environment.DYNAMODB_VEHICLE_TABLE}
    
         UsersDynamoDbTable:
            Type: 'AWS::DynamoDB::Table'
            DeletionPolicy: Retain
            Properties:
              AttributeDefinitions:
                -
                  AttributeName: id
                  AttributeType: S
              KeySchema:
                -
                  AttributeName: id
                  KeyType: HASH
              ProvisionedThroughput:
                ReadCapacityUnits: 1
                WriteCapacityUnits: 1
              TableName: ${self:provider.environment.DYNAMODB_USER_TABLE}
    
    provider:
      apiGateway
        restApiId: xxxxx # REST API resource ID. Default is generated by the framework
        restApiRootResourceId: yyyyyy # Root resource, represent as / path
      iamRoleStatements:
        - Effect: Allow
          Action:
            - dynamodb:Query
            - dynamodb:Scan
            - dynamodb:GetItem
            - dynamodb:PutItem
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
            - dynamodb:DescribeTable
            Resource: "*"
    
    provider:
      apiGateway
        restApiId: xxxxx # REST API resource ID. Default is generated by the framework
        restApiRootResourceId: yyyyyy # Root resource, represent as / path
      iamRoleStatements:
        - Effect: Allow
          Action:
            - dynamodb:Query
            - dynamodb:Scan
            - dynamodb:GetItem
            - dynamodb:PutItem
            - dynamodb:UpdateItem
            - dynamodb:DeleteItem
            - dynamodb:DescribeTable
            Resource: "*"