【问题标题】:How to continue deploy if DynamoDb table already exists如果 DynamoDb 表已存在,如何继续部署
【发布时间】:2017-05-27 23:43:57
【问题描述】:

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

ATM 我收到此错误:

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

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

【问题讨论】:

  • 如果您的资源不是由该无服务器应用程序单独处理,那么您不应该尝试处理它。要么处理无服务器创建的 CloudFormation 堆栈中的资源,要么处理它最初创建的位置。
  • @doorstuck,它是由 serverless 处理的,但有时你需要重新创建表,现在你需要删除所有 serverless,因为这个错误总是出现,你不能部署
  • 为什么必须重新创建表?听起来它没有完全由无服务器和云形成堆栈处理,并且有自己的生命。在这种情况下,请考虑不要使用无服务器管理数据库。只有一个完全在无服务器项目内部使用的数据库,并且只有那里才应该由无服务器项目处理。如果数据库具有外部依赖项(其他人调用它)或其他人将重新创建它等,那么它不应该是无服务器堆栈的一部分。这只是我的意见和经验:)
  • 你需要的是SkipIfExists: True (github.com/serverless/serverless/issues/…)。

标签: lambda amazon-dynamodb serverless-framework


【解决方案1】:

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

现在我会说 - 表已经存在或队列不存在和类似 是关于您试图违反堆栈“安全性”的全部内容:

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

自从我从头开始重新部署所有数据库并恢复了数据库,我几乎总是随着资源的变化而稳定部署,直到某个同事 手动做某事)

所以最好不要有这样的问题:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果测试环境你可以去 AWS 控制台删除已存在的表,所以如果你想创建多个 lambda 函数共享一些表,你应该创建一个无服务器只处理 Dynamodb,其余服务不包含任何 Dynamodb 配置。

      如果您想要所有 lambda 相同的 API 网关,您可以在提供者下方添加 apiGateway,如下例所示

      例如:

      • 无服务器 A:DynamoDB 和公共端点/,API 网关有 restApiId:xxxxx, restApiRootResourceId: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: "*"
      

      【讨论】:

      • 我使用了这个的变体,基本上我的无服务器 A 保持不变,它创建和管理 DynamoDB。它还运行代码并做一些事情。对于无服务器 B、C ...我注释掉了资源:部分并使用了 Resource: "*" sn-p。 Resource: "*" 是所有这一切的真正收获。我相信它还可以让我们使用手动设置的 DyanamoDB 表。
      【解决方案4】:

      备份表并将其删除。部署后恢复。

      我在重命名无服务器项目并尝试部署时遇到了同样的问题。我有一张桌子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 表解决了这个问题,然后将其删除。

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

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

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

      【讨论】:

      • 这确实有效,尽管我必须删除新部署的表才能再次恢复它。
      • 当然可以,你们正在删除表,然后进行部署。要解决的问题是:第一次部署时,然后再次部署。它不应该抛出。
      【解决方案5】:

      这个问题已经相当老了,但仍然出现在 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

      【讨论】:

      • 这是一个很好的建议,但不是正确的解决方案。因为它并没有真正解决问题。正如您在论坛中看到的长时间讨论。
      • @Marckaraujo 你指的是哪个论坛?能给个链接吗?
      【解决方案6】:

      我有同样的问题,删除 serverless.yml 中的 xxxDynamoDbTable 那个项目已经存在于你的 Dynamodb 中可以工作。您不必再次Resources。 :D

      【讨论】:

        【解决方案7】:

        Serverless@1.6.1 无法使用 atm。

        我只是在github上打开一个问题:https://github.com/serverless/serverless/issues/3183

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

        我会在这里更新新闻。

        【讨论】:

        • 有关于这个问题的消息吗?
        猜你喜欢
        • 1970-01-01
        • 2010-10-17
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 2018-03-13
        • 2021-07-01
        • 1970-01-01
        相关资源
        最近更新 更多