serverless.yml 未在本地创建 dynamodb 表

Joh*_*ike 3 amazon-dynamodb docker docker-compose serverless

我有一个 docker 设置,可以在 docker 中运行 serverless 和 dynamodb 。在我的 serverless.yml 中,我定义了创建表的指令,但当我运行它时,docker compose up它并没有创建表(我已经通过运行查询列出表进行了检查。

serverless.yml

...
provider:
  name: aws
  runtime: nodejs8.10
  stage: dev
  region: eu-west-1

plugins:
  - serverless-dynamodb-local
  - serverless-offline

custom:
  dynamodb:
    inMemory: true
    port: 8000
    migrate: true # create tables on start
    onStart: true
  serverless-offline:
    babelOptions:
      presets: ["es2015"]

resources:
  Resources:
    UserTable:
      Type: "AWS::DynamoDB::Table"
      Properties:
        TableName: UserTable
        AttributeDefinitions:
          - AttributeName: userId
            AttributeType: S
          - AttributeName: fullname
            AttributeType: S
        KeySchema:
          - AttributeName: userId
            KeyType: HASH
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1

Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: "3"

services:
  serverless:
    build: .
    restart: always
    privileged: true
    working_dir: /home/node-app
    environment:
      - NODE_ENV=development
      - DYNAMO_ENDPOINT=http://dynamodb:8000
      - AWS_ACCESS_KEY_ID='dev-key-id'
      - AWS_SECRET_ACCESS_KEY='dev-key'
      - AWS_REGION='eu-west-1'
    links:
      - "dynamodb:dynamodb"
    command: npm run start
  ....
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8000:8000"
    environment:
      - AWS_ACCESS_KEY_ID='dev-key-id'
      - AWS_SECRET_ACCESS_KEY='dev-key'
Run Code Online (Sandbox Code Playgroud)

npm run start只是运行sls offline。一旦我运行 docker compose,一切都会正常启动,但UserTable不会创建。

在此输入图像描述

小智 5

如果您使用 Docker 来管理 DynamoDB 服务,则需要指示插件serverless-dynamodb-local为您创建表。

您可以通过运行以下命令来完成此操作:

serverless dynamodb migrate
Run Code Online (Sandbox Code Playgroud)

Docker 版本的 DynamoDB local 的一个常见问题是,这些表仅对使用用于创建表的相同 AWS 访问密钥 ID 的客户端可见,例如运行时list-tables不会显示任何表,即使您已成功创建了一个表。

$ aws dynamodb list-tables --endpoint "http://localhost:8000"
{
    "TableNames": []
}
Run Code Online (Sandbox Code Playgroud)

最简单的解决方案可能是将选项传递-sharedDb给 DynamoDB:

docker run -p 8000:8000 -d amazon/dynamodb-local -jar DynamoDBLocal.jar -sharedDb
Run Code Online (Sandbox Code Playgroud)

(GitHub 来源)

运行后会产生预期的输出serverless dynamodb migrate

aws dynamodb list-tables --endpoint "http://localhost:8000"
{
    "TableNames": [
        "SampleDynamoTable-local"
    ]
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。这帮助我解决了同样的问题。从 sls 创建的表在 docker 端不可见。`-sharedDb` 选项有帮助。 (2认同)