DynamoDB LimitExceededException

TL;DR — 한 번에 너무 많은 제어 영역 작업을 실행했습니다(또는 테이블/계정 제한에 도달했습니다). 계정 전체에서 한 번에 최대 500개의 테이블과 인덱스가 CREATING/UPDATING/DELETING 상태일 수 있습니다. 테이블 작업을 직렬화하고 ACTIVE 동안 기다린 후 백오프로 다시 시도하세요.

무엇을 의미하는가

LimitExceededException: Too many operations for a given subscriber.

이는 제어판 오류입니다. 이는 GetItem/PutItem/Query가 아닌 CreateTable, UpdateTable, DeleteTable, 인덱스 생성, 복원 및 유사한 호출에서 발생합니다. DynamoDB에서는 동시성 또는 계정 제한을 초과했다고 알려줍니다. HTTP 400이며 AWS는 이를 재시도 가능으로 표시합니다. 진행 중인 작업이 완료되면 조건이 지워집니다.

왜 발생하는가

  • 동시 테이블/인덱스 작업이 너무 많음CREATING, DELETING 또는 UPDATING 상태의 테이블 및 인덱스의 누적 수는 계정/리전당 500개를 초과할 수 없습니다. (계정당 최대 500개의 동시 테이블 작업이 허용됩니다 — CreateTable, UpdateTable, DeleteTable, UpdateTimeToLive, RestoreTableFromBackup, RestoreTableToPointInTime — 보조 인덱스가 있는 테이블을 생성할 경우 동시 요청은 최대 250개입니다.)
  • 대량 스택 배포 — CloudFormation/CDK/Terraform에서 많은 테이블(또는 여러 GSI)을 동시에 생성하거나 해체하면 동시성 예산이 초과됩니다.
  • 계정 리소스 할당량 — 계정/리전당 테이블 2,500개의 소프트 할당량 또는 50개의 동시 가져오기 작업 제한에 도달합니다.
  • DynamoDB 스트림 오용 — 1000보다 큰 LimitGetRecords를 호출하거나 동일한 스트림 샤드에서 동시에 읽는 2개 이상의 프로세스.
  • 참고: 동일한 테이블이 여전히 ResourceInUseException와 같은 UPDATING 표면인 동안 두 번째 UpdateTable가 발행되었습니다. 이 오류는 아니지만 둘 다 "먼저 ACTIVE를 기다리십시오"를 의미합니다.

어떻게 해결하는가

  1. 제어 플레인 작업 직렬화 — 테이블(및 각 GSI)이 ACTIVE이 될 때까지 기다린 후 테이블에 다음 변경 사항을 적용합니다. DescribeTable을 폴링하고 TableStatus === 'ACTIVE'를 게이트로 연결합니다.
  2. 지수 백오프로 재시도 — 제한은 일시적입니다. 백오프된 재시도는 일반적으로 진행 중인 작업이 소모되면 성공합니다.
  3. 스로틀 대량 배포 — 수백 개의 테이블/GSI를 한 번에 생성하지 않도록 대규모 스택을 분할하거나 모두 함께 실행되지 않도록 명시적인 DependsOn 순서를 추가합니다.
  4. 서비스 할당량을 확인하세요 — 계정당 테이블 수 제한에 근접한 경우 영원히 재시도하는 대신 서비스 할당량의 할당량 증가를 요청하세요.
  5. 한 번에 하나씩 GSI 추가UpdateTable 작업당 하나의 글로벌 보조 인덱스만 생성하거나 삭제할 수 있으므로 인덱스 변경 사항을 직렬화하고 각 백필을 기다립니다.

FAQ

DynamoDB에서 LimitExceededException을 어떻게 수정합니까? 제어 영역 작업(CreateTable/UpdateTable/DeleteTable/인덱스 변경) 실행을 병렬로 중지합니다. 다음 변경 전에 각 테이블과 인덱스가 ACTIVE에 도달할 때까지 기다리고, CREATING/UPDATING/DELETING 중인 테이블 수를 계정 한도 이하로 유지하고 지수 백오프로 다시 시도하세요.

LimitExceededException은 조절 오류인가요? 이는 데이터 평면 제한이 아니라 제어 평면 동시성/제한 오류입니다. 대신 데이터부 제한 표면은 ProvisionedThroughputExceededException, ThrottlingException 또는 RequestLimitExceeded로 표시됩니다.

DynoTable을 Local에 연결

DynoTable은 데이터 플레인 클라이언트입니다. — GetItem, QueryScan는 소비하지 않습니다. 제어 평면 동시성 예산은 이 오류를 방지합니다. 배포 스크립트가 히트하는 경우 LimitExceededException 테이블을 생성하는 동안 DynoTable을 사용하여 테이블을 찾아보세요. 이미 ACTIVE에 도달했고 테이블 설정으로 스키마를 검증하는 동안 IaC가 재시도합니다. 로컬 스택의 경우 -sharedDb로 DynamoDB Local을 실행하고 로컬 프로필(Running DynamoDB Local)을 통해 연결하므로 AWS에서 모든 GSI가 완료될 때까지 기다리지 않고 부분 배포를 검사할 수 있습니다. single-table design planner는 스케치에 도움이 됩니다. 바쁜 계정에서 또 다른 CreateTable를 실행하기 전에 테이블 모양을 만드세요.

관련 오류

출처

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.