目前我遇到了这个错误:
Serverless Error ---------------------------------------
An error occurred while provisioning your stack: AvailableDynamoDbTable
- Available already exists.
Serverless Error ---------------------------------------
An error occurred while provisioning your stack: AvailableDynamoDbTable
- Available already exists.
serverless.yml
文件。一个用于API和lambda函数,另一个用于DynamoDB。这样您就可以单独处理它们并更新您的lambda函数而不触及您的DB。
这里有一个很棒的指南:
备份表并删除它。一旦部署,就进行还原。
当我重命名我的无服务器项目并尝试部署时,我遇到了相同的问题。我有一个被再次使用的表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表并将其删除来解决了这个问题。
删除后,需要等待五分钟,因为缓存会定期清除而不是立即清除。之后,我尝试了serverless deploy
,它能够成功执行。此外,您需要还原备份的数据库:
目前使用Serverless@1.6.1还无法实现该功能。
我在github上开了一个问题:https://github.com/serverless/serverless/issues/3183
请有需要的人加入此讨论。
我会在这里更新消息。
我已经和其他人一起努力解决这个问题两周了,同时还有其他的部署问题。
现在我想说的是 - 表格已经存在或队列不存在等类似的问题都是因为你试图违反堆栈“安全”:
自从我重新从头开始部署并恢复了数据库以来,我几乎总是可以稳定地部署带有资源更改的内容,直到某个同事手动进行了操作)
所以为了避免这样的问题,最好:
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: "*"
Resource: "*"
是所有这些的真正要点。 我相信它也可以使我们使用手动设置的DyanamoDB表。 - JasonWilson我曾经遇到过同样的问题,解决方法是在 serverless.yml
文件中删除已经存在于 DynamoDB 中的 xxxDynamoDbTable
,这样就可以正常工作了。你不需要再次使用 Resources
。
请确保您没有意外创建一个新的 CloudFormation 堆栈实例,可能使用不同的名称。如果您正在使用与已经存在的堆栈相同的名称进行部署,则应该只是更新所有内容。
但是,如果您无意中创建了一个新的堆栈,因为名称发生了变化,例如 "my-app-prod" 与 "my-app-production",则可能会出现此故障,因为您的 "my-app-prod" 已经创建了表格,而 "my-app-production" 正在尝试重新创建这些相同的表格,这将失败,因为它们已经存在。
SkipIfExists: True
(https://github.com/serverless/serverless/issues/3183#issuecomment-962529842)。 - Ash