Amazon DynamoDB의 내부 서버 오류 문제 해결 - Amazon DynamoDB

Amazon DynamoDB의 내부 서버 오류 문제 해결

DynamoDB에서 내부 서버 오류(500 오류)는 서비스가 요청을 처리할 수 없음을 나타냅니다. 이러한 오류는 플릿의 일시적인 네트워크 문제, 인프라 문제, 스토리지 노드 관련 문제 등 다양한 이유로 발생할 수 있습니다.

DynamoDB 테이블의 수명 주기 동안 일부 내부 서버 오류가 발생할 수 있습니다. 이는 서비스의 분산 특성 때문에 발생할 수 있으며 일반적으로 걱정할 필요는 없습니다. DynamoDB는 사용자 개입 없이 서비스와 관련된 모든 일시적인 문제를 실시간으로 자동 복구하고 해결합니다. 하지만 테이블에 대한 요청에서 내부 서버 오류가 지속적으로 많은 것으로 관찰되면(SystemErrors 지표에서 확인할 수 있음) 더 자세히 조사해야 합니다.

내부 서버 오류 조사

DynamoDB 테이블에서 내부 서버 오류가 발생하는 경우 다음 옵션을 고려해 보세요.

  1. AWS Health Dashboard 확인.

    문제를 식별하기 위한 첫 번째 단계는 AWS Service Health Dashboard와 AWS Account Health Dashboard를 확인하는 것입니다. 이 대시보드는 모든 서비스 전반의 문제, 영향을 받는 테이블, 지속되는 문제 및 문제가 해결된 후의 근본 원인에 대한 중요한 정보를 제공합니다.

    이 대시보드의 세부 정보를 검토하면 사용 중인 AWS 서비스의 현재 상태와 계정에 영향을 줄 수 있는 잠재적 문제를 더 잘 이해할 수 있습니다. 이 정보는 문제를 해결하고 운영 중단을 최소화하기 위한 다음 단계를 결정하는 데 도움이 될 수 있습니다.

  2. AWS Support에 문의.

    요청에서 장기간 지속적으로 오류가 발생하는 경우 서비스에 문제가 있는 것일 수 있습니다. 일반적으로 지난 15분 동안 전체 실패율이 1% 이상이면 AWS Support 팀에 문제를 에스컬레이션하는 것이 좋습니다. 자세한 내용은 DynamoDB 서비스 수준 계약을 참조하세요.

    AWS Support 팀에 사례를 개설할 때 문제 해결 프로세스를 신속하게 진행할 수 있도록 다음 세부 정보를 제공하세요.

    • 영향을 받는 DDB, 테이블 또는 보조 인덱스

    • 오류가 관찰된 기간

    • DynamoDB 요청 ID(예: 4KBNVRGD25RG1KEO9UT4V3FQDJVV4KQNSO5AEMVJF66Q9ASUAAJG, 애플리케이션 로그에서 찾을 수 있음)

    지원 사례에 이러한 세부 정보를 포함하면 AWS 팀에서 문제를 이해하고 더 빠르게 해결하는 데 도움이 됩니다. 요청 ID가 없는 경우에도 사용 가능한 다른 세부 정보를 사용하여 사례를 기록해야 합니다.

내부 서버 오류로 인한 영향 최소화

DynamoDB 서비스에서 내부 서버 오류가 발생하는 경우 애플리케이션에 미치는 영향을 최소화하려면 다음 모범 사례를 고려하세요.

  • 백오프 및 재시도 사용 – DynamoDB의 기본 SDK 동작은 백오프 및 재시도 전략 측면에서 대부분의 애플리케이션에 적합한 균형을 찾도록 설계되었습니다. 하지만 애플리케이션의 가동 중지 시간 허용 한도 및 성능 요구 사항에 따라 이러한 설정을 조정할 수 있습니다. 이러한 재시도 설정을 미세 조정할 수 있는 방법을 파악하려면 백오프 및 재시도에 대해 자세히 알아보세요.

  • 최종적으로 일관된 읽기 사용: 애플리케이션에서 강력히 일관된 읽기를 요구하지 않는 경우 최종적으로 일관된 읽기를 사용하는 것이 좋습니다. 이러한 읽기는 사용 가능한 모든 스토리지 노드에서 처리되므로 비용이 적게 들고 내부 서버 오류로 인한 일시적인 문제가 발생할 가능성이 적습니다. 자세한 내용은 DynamoDB 읽기 일관성 단원을 참조하십시오.

운영 상황 파악 개선

오늘날의 디지털 환경에서는 애플리케이션의 고가용성과 신뢰성을 유지하는 것이 매우 중요합니다. 한 가지 중요한 측면은 DynamoDB 테이블 및 글로벌 보조 인덱스(GSI)의 내부 서버 오류(ISE)를 사전에 모니터링하는 것입니다. CloudWatch 경보를 생성하여 이러한 오류를 모니터링하면 운영 상황을 더 잘 파악하고 최종 사용자에게 영향을 미치기 전에 잠재적 문제에 대해 알림을 받을 수 있습니다. 이 접근 방식은 AWS Well-Architected 프레임워크의 운영 우수성 요소와 연계되어 DynamoDB 워크로드가 성능, 보안 및 신뢰성을 위해 최적화되도록 합니다.

CloudWatch 경보 생성

지표를 수동으로 관찰하는 대신 지속적으로 많은 수의 내부 서버 오류에 대한 알림을 수신하도록 DynamoDB 테이블에 CloudWatch 경보를 설정해야 합니다. 이는 AWS의 모든 워크로드에 대한 Well-Architected 프레임워크의 운영 우수성 요소와 연계됩니다. DynamoDB 테이블을 잘 설계하는 방법에 대한 자세한 내용은 DynamoDB Well-Architected 렌즈를 사용하여 DynamoDB 워크로드 최적화 섹션을 참조하세요.

이러한 경보는 사용자 지정 지표 수학을 사용하여 5분 동안 요청 실패 비율을 계산합니다. 권장되는 모범 사례는 연속된 3개의 데이터 포인트가 1% 임계값을 위반할 때(즉, 15분 내에 전체 요청의 1%가 실패) ALARM 상태에 들어가도록 경보를 구성하는 것입니다.

아래 샘플은 테이블에 CloudWatch 경보를 생성하고 테이블에 GSI를 생성하는 데 도움이 되는 AWS CloudFormation 템플릿입니다.

AWSTemplateFormatVersion: "2010-09-09" Description: Sample template for monitoring DynamoDB Parameters: DynamoDBProvisionedTableName: Description: Name of DynamoDB Provisioned Table to create Type: String MinLength: 3 MaxLength: 255 ConstraintDescription : https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html#limits-naming-rules DynamoDBSNSEmail: Description : Email Address subscribed to newly created SNS Topic Type: String AllowedPattern: "^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$" MinLength: 1 MaxLength: 255 Resources: DynamoDBMonitoringSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: DynamoDB Monitoring SNS Topic Subscription: - Endpoint: !Ref DynamoDBSNSEmail Protocol: email TopicName: dynamodb-monitoring DynamoDBTableSystemErrorAlarm: Type: 'AWS::CloudWatch::Alarm' Properties: AlarmName: 'DynamoDBTableSystemErrorAlarm' AlarmDescription: 'Alarm when system errors exceed 1% of total number of requests for 15 minutes' AlarmActions: - !Ref DynamoDBMonitoringSNSTopic Metrics: - Id: 'e1' Expression: 'm1/(m1+m2+m3)' Label: SystemErrorsOverTotalRequests - Id: 'm1' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'SystemErrors' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm2' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedReadCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm3' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedWriteCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False EvaluationPeriods: 3 Threshold: 1.0 ComparisonOperator: 'GreaterThanThreshold' DynamoDBGSISystemErrorAlarm: Type: 'AWS::CloudWatch::Alarm' Properties: AlarmName: 'DynamoDBGSISystemErrorAlarm' AlarmDescription: 'Alarm when GSI system errors exceed 2% of total number of requests for 15 minutes' AlarmActions: - !Ref DynamoDBMonitoringSNSTopic Metrics: - Id: 'e1' Expression: 'm1/(m1+m2+m3)' Label: GSISystemErrorsOverTotalRequests - Id: 'm1' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'SystemErrors' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm2' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedReadCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False - Id: 'm3' MetricStat: Metric: Namespace: 'AWS/DynamoDB' MetricName: 'ConsumedWriteCapacityUnits' Dimensions: - Name: 'TableName' Value: !Ref DynamoDBProvisionedTableName - Name: 'GlobalSecondaryIndexName' Value: !Join [ '-', [!Ref DynamoDBProvisionedTableName, 'gsi1'] ] Period: 300 Stat: 'SampleCount' Unit: 'Count' ReturnData: False EvaluationPeriods: 3 Threshold: 1.0 ComparisonOperator: 'GreaterThanThreshold'