web-dev-qa-db-ja.com

DynamoDbテーブルがすでに存在する場合にデプロイを続行する方法

リソースがすでに存在する場合でも、展開(または強制)を続行します。

Atm私はこのエラーを受け取りました:

Serverless Error ---------------------------------------

     An error occurred while provisioning your stack: AvailableDynamoDbTable
     - Available already exists.
14
Marckaraujo

この質問はかなり古いですが、それでもGoogleの上位5件の結果に表示されるので、ここで少し洞察を示します。サーバーレススタックを複数のサービスに分割し、それぞれに独自のserverless.ymlファイル。 1つはAPIとラムダ用、もう1つはDynamoDB用です。このようにして、それらを個別に処理し、DBに触れることなくラムダを更新できます。ここにその素晴らしいガイドがあります:

  1. https://serverless-stack.com/chapters/organizing-serverless-projects.html
  2. https://serverless-stack.com/chapters/dynamodb-as-a-serverless-service.html
  3. https://serverless-stack.com/chapters/deploying-multiple-services-in-serverless.html
2
Gábor Pintér

[email protected]では不可能です。

私はgithubで問題を開くだけです: https://github.com/serverless/serverless/issues/318

この機能を必要とするすべての人が、このディスカッションに参加してください。

ここでニュースを更新します。

2
Marckaraujo

CloudFormationスタックの新しいインスタンスを誤って、おそらく別の名前で作成していないことを確認してください。すでに存在するスタックと同じ名前を使用してデプロイする場合は、単にすべてを更新する必要があります。

ただし、「my-app-prod」と「my-app-production」のように名前が変更されたために誤って新しいスタックを作成している場合、「my-app-prod」がすでにテーブルを作成しているため、このエラーが発生する可能性があります。 「my-app-production」は、すでに存在するために失敗する同じテーブルを再作成しようとしています。

0
Sators

テスト環境の場合、AWSコンソールに移動して既存のテーブルを削除できます。したがって、複数のラムダ関数を作成していくつかのテーブルを共有する場合は、1つのサーバーレスを作成してDynamodbのみを処理し、残りのサービスにはDynamodb構成を含めないでください。

すべてのラムダ同じAPIゲートウェイが必要な場合は、以下の例のようにプロバイダーの下にapiGatewayを追加できます

例えば:

  • サーバーレスA:DynamoDBとパブリックエンドポイント/、API GatewayにはrestApiId:xxxxxrestApiRootResourceId:yyyyyy

  • サーバーレスB:ユーザーサービスとパブリックエンドポイント/users

  • サーバーレスC:車両サービスとパブリックエンドポイント/vehicle

serverless.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サーバーレス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サーバーレス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: "*"
0
Tan Nguyen

同じ問題があり、Dynamodbに既に存在するserverless.ymlxxxDynamoDbTableを削除すると機能する可能性があります。もう一度Resourcesする必要はありません。 :D

0
EthanChou

テーブルをバックアップして削除します。展開したら復元します。

サーバーレスプロジェクトの名前を変更してデプロイしようとしたときにも、同じ問題が発生しました。再び使用されていたテーブル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テーブルのバックアップを作成してから削除することで解決しました。

  1. コンソール> DynamoDB
  2. 左側で[バックアップ]を選択します
  3. バックアップを作成>ドロップダウンからテーブルを選択して名前を付けます>作成
  4. 左側で[テーブル]を選択します
  5. タンクをチェック>削除

削除後、キャッシュはすぐにではなく定期的に消去されるため、5分待つ必要があります。その後、serverless deployそしてそれは働いた。この後、バックアップしたデータベースを復元する必要があります。

  1. 左側で[バックアップ]を選択します
  2. バックアップされたテーブルを確認>復元
  3. 新しいテーブル名として、以前と同じ名前をテーブルに入力します。
  4. テーブルの復元復元されたデータベースが表示されるまでには時間がかかるため、おそらく5分以上かかる場合があります。
0
Vishal Desai