Lambda 如果DynamoDb表已经存在,如何继续部署
即使资源已经存在,我也希望继续部署(或强制部署) 我犯了这个错误:Lambda 如果DynamoDb表已经存在,如何继续部署,lambda,amazon-dynamodb,serverless-framework,Lambda,Amazon Dynamodb,Serverless Framework,即使资源已经存在,我也希望继续部署(或强制部署) 我犯了这个错误: Serverless Error --------------------------------------- An error occurred while provisioning your stack: AvailableDynamoDbTable - Available already exists. 用自动取款机是不可能的Serverless@1.6.1. 我刚刚在github上打开了一个问题
Serverless Error ---------------------------------------
An error occurred while provisioning your stack: AvailableDynamoDbTable
- Available already exists.
用自动取款机是不可能的Serverless@1.6.1. 我刚刚在github上打开了一个问题: 所有需要此功能的人,请加入此讨论
我将在这里更新新闻。我遇到了同样的问题,并删除了
serverless.yml
中的xxxdynamodtable
,您的Dynamodb中已经存在的项可以工作。您不必再次使用Resources
D这个问题已经很老了,但仍然出现在谷歌排名前五的搜索结果中,因此这里有一点见解:
将无服务器堆栈拆分为多个服务是一个好主意,每个服务都有自己的serverless.yml
文件。一个用于API和lambdas,一个用于DynamoDB。通过这种方式,您可以单独处理它们,并在不接触数据库的情况下更新lambda。
以下是关于这方面的一个很好的指南:
备份该表并将其删除。部署后立即恢复。 当我重命名我的无服务器项目并尝试部署时,我也遇到了同样的问题。我有一个表
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表,然后删除它,解决了这个问题
无服务器部署
,它成功了。
在此之后,您将需要恢复备份的数据库
如果测试环境,您可以转到AWS控制台删除已有的表,所以如果您想创建多个lambda函数共享一些表,您应该创建一个仅处理Dynamodb的serverless,其余服务不包含任何Dynamodb配置 如果希望所有lambda都使用相同的API网关,可以在提供程序下方添加
apiGateway
,如下例所示
例如:
- 无服务器A:DynamoDB和公共端点
,API网关/
,restApiId:xxxxx
restApiRootResourceId:yyyyy
- 无服务器B:用户服务和公共端点
/users
- 无服务器C:车辆服务和公共端点
/Vehicle
检查以确保您没有意外地创建CloudFormation堆栈的新实例,可能使用了不同的名称。如果您使用与已存在的堆栈相同的名称进行部署,那么它应该只是更新所有内容
但是,如果由于名称更改而无意中创建了新堆栈,例如“my app prod”与“my app production”,则可能会发生此故障,因为您的“my app prod”已经创建了表和“my app production”正在尝试重新创建那些可能会失败的表,因为它们已经存在。与其他部署问题一起挣扎了2周 现在我想说-表alredy存在或队列不存在,并且类似 都是因为您试图违反堆栈“安全性”:
- 无服务器应用程序依赖于CloudFormation
- 如果您的无服务器部署尝试管理资源,但 属于它-你将“已经存在…”(但不是你的)李>
- 手动添加、删除、修改资源的步骤
- 命名它们以避免重叠(如dev表/prod表)
- 将资源用作外部资源,以使用ARN堆叠资源(或使用无服务器输出的导出TAME)李>
- 将资源(资源组)导入堆栈
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: "*"