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

时间:2017-01-12 18:29:53

标签: lambda amazon-dynamodb serverless-framework

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

Atm我收到了这个错误:

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

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

7 个答案:

答案 0 :(得分:2)

无法使用Serverless@1.6.1。

我刚刚在github上发布了一个问题:https://github.com/serverless/serverless/issues/3183

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

我将在此处更新新闻。

答案 1 :(得分:2)

这个问题已经很老了,但仍然出现在Google的前5个结果中,因此有一些见解: 将无服务器堆栈拆分成多个服务是个好主意,每个服务都有自己的serverless.yml文件。一种用于API和lambda,另一种用于DynamoDB。这样,您可以单独处理它们并更新lambda,而无需接触数据库。 这是一个很好的指南:

  1. https://serverless-stack.com/chapters/organizing-serverless-projects.html
  2. https://serverless-stack.com/chapters/dynamodb-as-a-serverless-service.html
  3. https://serverless-stack.com/chapters/deploying-multiple-services-in-serverless.html

答案 2 :(得分:1)

为此苦苦挣扎了两个星期,并遇到了其他部署问题

现在我要说-表存在或队列不存在且类似 关于您正试图违反堆栈“安全性”的全部信息:

  • 无服务器应用程序依赖于CloudFormation
  • 如果您的无服务器部署尝试管理不支持的资源 属于它-您将拥有“已经存在...(但不属于您);

由于我从头开始重新部署了所有数据库并恢复了数据库,所以我几乎总是在稳定的部署中进行资源更改,直到有同事 手动做某事)

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

  • 点头添加删除手动修改资源
  • 命名它们不重叠(例如dev-Table / prod-Table)
  • 使用资源作为外部资源以使用arns(或带有无服务器输出的导出驯服)堆栈资源;
  • 尝试将资源(资源组)导入到堆栈中

答案 3 :(得分:0)

我遇到了同样的问题,并删除了xxxDynamoDbTable {/ 1}},您的Dynamodb中已存在的项目可以正常工作。你不必再次serverless.yml了。 :d

答案 4 :(得分:0)

备份表并将其删除。部署后还原。

重命名无服务器项目并尝试进行部署时,我遇到了同样的问题。我有一个表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.

我通过备份储罐表,然后将其删除来解决了该问题。

  1. 控制台> DynamoDB
  2. 在左侧选择“备份”
  3. 创建备份>从下拉列表中选择表并为其命名> 创建
  4. 在左侧选择表格
  5. 检查战车>删除

删除后,必须等待五分钟,因为缓存会定期(而不是立即)清理。 之后,我尝试了serverless deploy并成功了。 之后,您将需要还原备份的数据库。

  1. 在左侧选择“备份”
  2. 检查备份表>恢复
  3. 为表键入与以前相同的名称,作为新表名称。
  4. 还原表 恢复的数据库需要一些时间才能出现,因此可能要等待五分钟或更长时间。

答案 5 :(得分:0)

如果测试环境,您可以转到AWS控制台删除已存在的表,因此,如果要创建多个lambda函数共享一些表,则应创建一个仅处理Dynamodb的无服务器,而其余服务不包含任何Dynamodb配置。

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

例如:

  • 无服务器A:DynamoDB和公共端点/,API网关具有 restApiId:xxxxxrestApiRootResourceId:yyyyyy

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

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

serverless.yml无服务器A

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}

serverless.yml无服务器B

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: "*"

serverless.yml无服务器C

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: "*"

答案 6 :(得分:-1)

检查以确保您没有意外创建CloudFormation堆栈的新实例,也许使用了不同的名称。如果要使用与已经存在的堆栈相同的名称进行部署,则应该只更新所有内容。

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