リソースがすでに存在する場合でも、展開(または強制)を続行します。
Atm私はこのエラーを受け取りました:
Serverless Error ---------------------------------------
An error occurred while provisioning your stack: AvailableDynamoDbTable
- Available already exists.
この質問はかなり古いですが、それでもGoogleの上位5件の結果に表示されるので、ここで少し洞察を示します。サーバーレススタックを複数のサービスに分割し、それぞれに独自のserverless.yml
ファイル。 1つはAPIとラムダ用、もう1つはDynamoDB用です。このようにして、それらを個別に処理し、DBに触れることなくラムダを更新できます。ここにその素晴らしいガイドがあります:
[email protected]では不可能です。
私はgithubで問題を開くだけです: https://github.com/serverless/serverless/issues/318
この機能を必要とするすべての人が、このディスカッションに参加してください。
ここでニュースを更新します。
CloudFormationスタックの新しいインスタンスを誤って、おそらく別の名前で作成していないことを確認してください。すでに存在するスタックと同じ名前を使用してデプロイする場合は、単にすべてを更新する必要があります。
ただし、「my-app-prod」と「my-app-production」のように名前が変更されたために誤って新しいスタックを作成している場合、「my-app-prod」がすでにテーブルを作成しているため、このエラーが発生する可能性があります。 「my-app-production」は、すでに存在するために失敗する同じテーブルを再作成しようとしています。
テスト環境の場合、AWSコンソールに移動して既存のテーブルを削除できます。したがって、複数のラムダ関数を作成していくつかのテーブルを共有する場合は、1つのサーバーレスを作成してDynamodbのみを処理し、残りのサービスにはDynamodb構成を含めないでください。
すべてのラムダ同じAPIゲートウェイが必要な場合は、以下の例のようにプロバイダーの下にapiGateway
を追加できます
例えば:
サーバーレスA:DynamoDBとパブリックエンドポイント/
、API Gatewayには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: "*"
同じ問題があり、Dynamodbに既に存在するserverless.yml
のxxxDynamoDbTable
を削除すると機能する可能性があります。もう一度Resources
する必要はありません。 :D
テーブルをバックアップして削除します。展開したら復元します。
サーバーレスプロジェクトの名前を変更してデプロイしようとしたときにも、同じ問題が発生しました。再び使用されていたテーブル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テーブルのバックアップを作成してから削除することで解決しました。
削除後、キャッシュはすぐにではなく定期的に消去されるため、5分待つ必要があります。その後、serverless deploy
そしてそれは働いた。この後、バックアップしたデータベースを復元する必要があります。