即使资源已经存在,我也希望继续部署(或强制)。
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.
我通过备份坦克表,然后删除它来解决这个问题。
- 控制台>DynamoDB
- 在左侧选择"备份">
- 创建备份>从下拉列表中选择表并命名>创建
- 在左侧选择"表格">
- 检查储罐>删除
删除后,必须等待五分钟,因为缓存是定期清理的,而不是立即清理。之后,我尝试了serverless deploy
,它成功了。在此之后,您将需要恢复备份的数据库。
- 在左侧选择"备份">
- 检查备份表>恢复
- 键入与以前相同的表名称作为新表名称
- 还原表恢复的数据库需要一些时间,所以可能要等待五分钟或更长时间
这个问题已经很老了,但仍然出现在谷歌的前五名结果中,所以这里有一些见解:将无服务器堆栈拆分为多个服务是个好主意,每个服务都有自己的serverless.yml
文件。一个用于API和lambdas,一个用于DynamoDB。通过这种方式,您可以单独处理它们,并在不接触数据库的情况下更新Lambda。这里有一个很好的指南:
- https://serverless-stack.com/chapters/organizing-serverless-projects.html
- https://serverless-stack.com/chapters/dynamodb-as-a-serverless-service.html
- 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:xxxxx
,restApiRootResourceId: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堆栈的新实例,可能使用了不同的名称。如果您使用与已经存在的堆栈相同的名称进行部署,那么它应该只是更新所有内容。
但是,如果您因为名称更改而无意中创建了一个新堆栈,例如"我的应用程序生产"与"我的程序生产",则可能会发生此故障,因为您的"我的软件生产"已经创建了这些表,而"我的应用程序生产"正试图重新创建那些相同的表,这些表由于已经存在而会失败。