即使资源已经存在,我仍希望继续部署(或强制)。
Atm我收到了这个错误:
Serverless Error ---------------------------------------
An error occurred while provisioning your stack: AvailableDynamoDbTable
- Available already exists.
答案 0 :(得分:2)
无法使用Serverless@1.6.1。
我刚刚在github上发布了一个问题:https://github.com/serverless/serverless/issues/3183
请所有需要此功能的人加入此讨论。
我将在此处更新新闻。
答案 1 :(得分:2)
这个问题已经很老了,但仍然出现在Google的前5个结果中,因此有一些见解:
将无服务器堆栈拆分成多个服务是个好主意,每个服务都有自己的serverless.yml
文件。一种用于API和lambda,另一种用于DynamoDB。这样,您可以单独处理它们并更新lambda,而无需接触数据库。
这是一个很好的指南:
答案 2 :(得分:1)
为此苦苦挣扎了两个星期,并遇到了其他部署问题
现在我要说-表存在或队列不存在且类似 关于您正试图违反堆栈“安全性”的全部信息:
由于我从头开始重新部署了所有数据库并恢复了数据库,所以我几乎总是在稳定的部署中进行资源更改,直到有同事 手动做某事)
因此不存在此类问题会更好:
答案 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.
我通过备份储罐表,然后将其删除来解决了该问题。
删除后,必须等待五分钟,因为缓存会定期(而不是立即)清理。
之后,我尝试了serverless deploy
并成功了。
之后,您将需要还原备份的数据库。
答案 5 :(得分:0)
如果测试环境,您可以转到AWS控制台删除已存在的表,因此,如果要创建多个lambda函数共享一些表,则应创建一个仅处理Dynamodb的无服务器,而其余服务不包含任何Dynamodb配置。
如果您希望所有lambda都使用相同的API网关,则可以在提供者下方添加apiGateway
,如下所示
例如:
无服务器A:DynamoDB和公共端点/
,API网关具有
restApiId:xxxxx
,restApiRootResourceId:yyyyyy
无服务器B:用户服务和公共端点/users
无服务器C:车辆服务和公共端点/vehicle
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: "*"
答案 6 :(得分:-1)
检查以确保您没有意外创建CloudFormation堆栈的新实例,也许使用了不同的名称。如果要使用与已经存在的堆栈相同的名称进行部署,则应该只更新所有内容。
但是,如果由于名称更改而无意中创建了新堆栈,例如“ my-app-prod”与“ my-app-production”,则可能会发生此故障,因为您的“ my-app-prod”已经存在创建了这些表,“ my-app-production”正试图重新创建那些表,因为它们已经存在,因此将失败。