입문4분 분량

Docker를 사용하여 DynamoDB Local을 실행하는 방법 — 전체 가이드

DynamoDB Local은 단일 프로세스에서 다운로드 가능한 AWS의 DynamoDB 에뮬레이션입니다. 동일한 API, AWS 계정 없음, 네트워크 없음, 요청별 청구서 없음. 로컬용으로 사용하세요 개발 및 통합 테스트를 수행한 후 클라우드에서 동일한 코드를 지정합니다. 생산. 프로비저닝된 처리량을 무시하고 제한하지 않으므로 부하 또는 한계 테스트를 대신합니다.

Docker를 사용하여 DynamoDB Local을 실행하려면 어떻게 해야 합니까?

공식 이미지를 시작하려면 docker run -p 8000:8000 amazon/dynamodb-local를 실행하고, 이는 http://localhost:8000에 DynamoDB 엔진을 노출합니다. AWS SDK를 가리키십시오 또는 더미 자격 증명을 사용하여 해당 엔드포인트에서 CLI를 사용한 다음 테이블을 생성하고 실행합니다. 클라우드에 대해 요청하는 것과 똑같이 요청합니다. -sharedDb를 추가하고 마운트된 다시 시작해도 데이터를 유지하는 -dbPath 볼륨.

컨테이너 시작

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

그러면 엔진이 http://localhost:8000에 노출됩니다.

도커 작성

대부분의 프로젝트는 이를 docker-compose.yml에 고정하여 팀 전체가 동일한 결과를 얻습니다. 끝점:

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

이미지는 루트가 아닌 사용자로 실행됩니다. 루트 소유의 명명된 볼륨 내의 데이터베이스 파일 — user: root 없이 SQLiteException [14] unable to open database file 모든 통화가 중단됩니다.

지속성

기본적으로 DynamoDB Local은 인메모리입니다. 모든 테이블은 다음과 같은 경우 사라집니다. 컨테이너가 정지합니다. 두 개의 플래그로 인해 내구성이 향상됩니다.

  • -sharedDb 모든 클라이언트를 하나의 공유 데이터베이스 파일에 유지합니다(이 파일이 없으면 각 클라이언트는 자격 증명/지역 집합은 자체 격리된 DB를 갖습니다. 테이블로 갈까?" 깜짝).
  • -dbPath /data + 마운트된 볼륨은 해당 파일을 디스크에 기록하므로 데이터 docker compose down까지 살아남습니다.

SDK를 가리키세요

엔드포인트만 변경됩니다. 자격 증명은 임의의 더미 값일 수 있습니다.

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

이와 같은 single-table PK/SK 스키마는 좋은 것입니다. 기본값. 픽스처를 로드할 때 다음을 사용하여 일반 JSON을 와이어 형식으로 변환하세요. DynamoDB-JSON converter.

컨테이너가 작동되고 테이블이 착륙했는지 확인합니다.

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

GUI로 탐색

CLI 호출이 너무 빨리 지루해집니다. 일반적인 옵션은 오픈 소스 dynamodb-admin입니다. 웹 UI 또는 데스크톱 클라이언트. DynoTable는 다음과 직선으로 연결됩니다. localhost:8000(또는 모든 LocalStack 엔드포인트 — 참조 connecting to DynamoDB Local & LocalStack) 을 사용하여 검색하고, 쿼리하고, 로컬 테이블을 편집할 수 있습니다. 클라우드 테이블에 사용하는 것과 동일한 UI — CLI 왕복이 없습니다.

로컬이 에뮬레이트하지 않는 것

로컬을 용량 시뮬레이터가 아닌 API 호환성 계층으로 취급합니다. 무시한다 프로비저닝된 처리량, 반환되지 않음 ProvisionedThroughputExceededException, 주문형 버스트 동작을 모델링하지 않습니다. 로컬에 대한 부하 테스트를 통해 알 수 있습니다. AWS의 파티션 제한이나 적응 용량에 관한 내용은 없습니다.

계획하지 않은 경우 통합 테스트에 다른 격차가 나타납니다.

행동DynamoDB 로컬AWS 다이나모DB
청구/RCU/WCU없음요청당 측정됨
조절절대예, 테이블/인덱스 제한에서
TTL 삭제 시기SLA에 구속되지 않는 최선의 노력AWS 일정에 따른 백그라운드 스윕
DynamoDB 스트림 전달단순화전체 스트림 의미론 + Lambda 연결
테이블 간 트랜잭션최근 빌드에서 지원됨문서화된 제한이 있는 전체 ACID
전역 테이블/PITR사용할 수 없음생산 기능

테스트에서 조절, TTL 만료(초 내) 또는 스트림 팬아웃을 주장하는 경우 일회용 클라우드 테이블 또는 LocalStack에 대해 하나 이상의 제품군을 실행합니다. 활성화해야 하는 기능.

실용적인 로컬 워크플로우

대부분의 팀은 로컬을 세 가지 레이어로 연결합니다.

  1. 단위 테스트 — CI에서 컨테이너를 띄우고, beforeAll에 테이블을 생성하고, 찢습니다. afterAll에 내려요. 설비를 작게 유지하십시오. 다음을 통해 일반 JSON을 마샬링합니다. DynamoDB JSON converter 테스트 붙여넣기 시 속성 맵을 직접 작성합니다.
  2. 통합 테스트 — 앱에서 사용하는 것과 동일한 SDK 클라이언트 팩토리를 실행합니다. endpoint 및 자격 증명만 교환합니다. 항목 모양에 대한 어설션 및 소비된 용량이 아닌 조건부 쓰기(로컬은 반환하지 않음) 예산 책정에 의미 있는 ConsumedCapacity).
  3. 수동 탐색 — DynoTable을 로컬 프로필과 연결하고, 스테이지 편집, 스키마 변경 사항을 배포하기 전에 PartiQL 또는 키 조건 쿼리를 실행하세요.

단일 프로세스(여러 서비스, S3 트리거 또는 IAM 스타일)가 초과되는 경우 라우팅 — LocalStack로 졸업하거나 개발자 계정. 로컬은 "내 액세스 패턴이 컴파일됩니까?"에 대한 가장 빠른 루프를 유지합니다.

손으로 마샬링하지 않은 시드 데이터

모든 고정 항목에 태그를 지정하지 않으면 JSON 파일에서 10개의 고정 항목을 로드하는 것이 더 빠릅니다. 자신을 소중히 여기십시오. 배열을 DynamoDB JSON converter, 마샬링된 내용을 복사합니다. 출력 및 --endpoint-url에 대해 BatchWriteItem을 사용하여 일괄 쓰기 http://localhost:8000. 업데이트가 많은 설비의 경우 UpdateExpression에서 DynamoDB expression builder를 붙여넣습니다. 생성된 속성은 테스트 하네스에 매핑됩니다.

DynoTable의 항목 편집기는 커밋 시 동일한 마샬링을 수행합니다. 테스트 실패로 인해 CLI에서 원시 10개 Blob을 바라보게 됩니다.

로컬을 떠나야 할 때

AWS 자체에서 측정된 다음 중 하나가 필요한 경우 실제 테이블로 배송하십시오.

  • 용량 계획 — 초당 1,000번 쿼리되는 1KB 항목이 소비됩니다. 온디맨드 청구 시 초당 약 250개의 최종 일관성 RCU; 지역 0을 보고합니다. 이를 모델로 삼아 pricing calculator 사이즈를 사용하여 item-size calculator.
  • 인덱스 전파 지연 — GSI 읽기는 프로덕션에서 최종적으로 일관됩니다. 로컬은 오래된 읽기 버그가 배포될 때까지 숨겨질 만큼 신속하게 인덱스 행을 반환합니다.
  • 교차 계정 IAM — 리소스 범위 역할 및 조건 키는 클라우드.

스키마 및 표현식 구문에 대한 빠른 피드백을 위해 로컬을 유지하세요. 비용을 검증하고 프로덕션 트래픽 이전의 스테이징 테이블에 대한 일관성 가정.

스크립팅할 가치가 있는 함정

  • Forgotten -sharedDb — 각 고유 자격 증명 쌍은 격리된 자격 증명을 얻습니다. 데이터베이스; CI와 노트북은 서로 다른 우주처럼 보입니다.
  • user: root이 없는 루트 소유 볼륨 — SQLite 백엔드가 자동으로 실패합니다. 위 섹션에서 작성 재정의를 추가할 때까지.
  • 스트림 패리티 가정 — 스트림 지원 Lambda에는 클라우드 또는 LocalStack이 필요합니다. 목표; 로컬만으로는 팬아웃이 실행되지 않습니다.
  • 빈 문자열 키 — 2020년부터 키가 아닌 속성에 허용되지만 여전히 거부됨 키에; AWS에서와 동일한 방식으로 설비를 검증합니다.

Download DynoTable, http://localhost:8000를 가리키는 프로파일을 추가하고, 방금 생성한 테이블(동일한 그리드, 필터 빌더 및 SQL)을 찾아보세요. 루프에 AWS 비용을 전혀 지출하지 않고 프로덕션에서 사용하는 워크벤치입니다.

업데이트됨