入门阅读约 1 分钟

用 Docker 运行 DynamoDB Local

DynamoDB Local 是运行在单一进程中的真正 DynamoDB 引擎 —— 无需 AWS 账户、无需网络、没有按请求计费。用它进行本地开发和集成测试,然后在生产环境中把同一套代码指向云端。

启动容器

docker run -p 8000:8000 amazon/dynamodb-local

这会在 http://localhost:8000 上暴露该引擎。

docker-compose

大多数项目会在 docker-compose.yml 中固定它,好让整个团队使用同一个 endpoint:

services:
  dynamodb:
    image: amazon/dynamodb-local
    command: '-jar DynamoDBLocal.jar -sharedDb -dbPath /data'
    ports:
      - '8000:8000'
    volumes:
      - dynamodb-data:/data
volumes:
  dynamodb-data:

持久化

默认情况下 DynamoDB Local 是内存中运行的 —— 容器一停止,每张表都会消失。有两个标志可以让它持久化:

  • -sharedDb 让所有客户端使用同一个共享数据库文件(不加它,每组凭据/区域都会得到各自独立的 DB —— 一个常见的“我的表去哪了?”意外)。
  • -dbPath /data 加上一个挂载的卷,会把该文件写入磁盘,从而让数据在 docker compose down 之后依然存在。

将 SDK 指向它

只需更改 endpoint —— 凭据可以是任意的占位值:

import {DynamoDBClient} from '@aws-sdk/client-dynamodb';

const client = new DynamoDBClient({
  endpoint: 'http://localhost:8000',
  region: 'local',
  credentials: {accessKeyId: 'x', secretAccessKey: 'x'}
});

创建一张表

aws dynamodb create-table \
  --endpoint-url http://localhost:8000 \
  --table-name AppData \
  --attribute-definitions AttributeName=PK,AttributeType=S AttributeName=SK,AttributeType=S \
  --key-schema AttributeName=PK,KeyType=HASH AttributeName=SK,KeyType=RANGE \
  --billing-mode PAY_PER_REQUEST

像这样的单表 PK/SK schema 是一个不错的默认选择。加载固定数据时,用 DynamoDB-JSON 转换器把纯 JSON 转换为传输格式。

验证容器已启动且表已就位:

aws dynamodb list-tables --endpoint-url http://localhost:8000

用 GUI 浏览它

CLI 调用很快就会变得繁琐。常见的选择是开源的 dynamodb-admin 网页 UI 或一个桌面客户端。DynoTable 直接连接到 localhost:8000(或任意 LocalStack endpoint —— 参见连接 DynamoDB Local 与 LocalStack),让你用与处理云端表完全相同的 UI 来浏览、用 SQL Workbench 查询并编辑本地表 —— 无需 aws CLI 来回往返。

更新于