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



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

Atm我得到了这个错误:

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

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

当我重命名我的无服务器项目并尝试部署时,我也遇到了同样的问题。我有一张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. 还原表恢复的数据库需要一些时间,所以可能要等待五分钟或更长时间

这个问题已经很老了,但仍然出现在谷歌的前五名结果中,所以这里有一些见解:将无服务器堆栈拆分为多个服务是个好主意,每个服务都有自己的serverless.yml文件。一个用于API和lambdas,一个用于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

这是不可能的atmServerless@1.6.1.

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

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

我会在这里更新消息。

已经为此与其他部署问题斗争了两周

现在我会说-表已经存在或队列不存在,类似都是关于你试图违反堆栈"安全性":

  • 无服务器应用程序依赖CloudFormation
  • 如果您的无服务器部署尝试管理没有属于它-你将拥有"已经存在…"。。。(但不是你的)

由于我从头开始重新部署并恢复了dbs,我几乎总是在资源发生变化的情况下进行稳定的部署,直到一些同事手动操作)

因此,没有这样的问题会更好:

  • 手动点头添加删除修改资源
  • 将它们命名为不重叠(如dev表/prod表)
  • 使用外部资源将资源与arns(或导出的具有无服务器输出的tame)进行堆叠
  • 将资源(资源组)导入堆栈

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

如果您想要所有lambda都相同的API网关,您可以在提供程序下面添加apiGateway,作为下面的示例

例如:

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

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

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

无服务器.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 serverless 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 serverless 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: "*"

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

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

但是,如果您因为名称更改而无意中创建了一个新堆栈,例如"我的应用程序生产"与"我的程序生产",则可能会发生此故障,因为您的"我的软件生产"已经创建了这些表,而"我的应用程序生产"正试图重新创建那些相同的表,这些表由于已经存在而会失败。

相关内容

  • 没有找到相关文章

最新更新