

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 疑難排解 Amazon DynamoDB 中的內部伺服器錯誤
<a name="TroubleshootingInternalServerErrors"></a>

在 DynamoDB 中，內部伺服器錯誤 (500 錯誤) 表示服務無法處理請求。這些錯誤可能由多種原因導致，例如機群中的暫時性網路問題、基礎設施異常或儲存節點相關問題等。

在 DynamoDB 資料表的生命週期中，您可能會遇到部分內部伺服器錯誤。由於服務的分散式架構，這屬於預期行為，通常無需特別關注。DynamoDB 會即時自動修復服務的任何暫時性問題，無需使用者介入。不過，如果您在對資料表的請求中觀察到持續高比例的內部伺服器錯誤 (如 [SystemErrors](metrics-dimensions.md#SystemErrors) 指標所示)，建議進一步調查。

**Topics**
+ [調查內部伺服器錯誤](#ServerErrors-investigating)
+ [將內部伺服器錯誤的影響降至最低](#ServerErrors-minimizing-impact)
+ [提升營運覺察](#ServerErrors-improving-operational-awareness)

## 調查內部伺服器錯誤
<a name="ServerErrors-investigating"></a>

若您在 DynamoDB 資料表中發生內部伺服器錯誤，請考慮以下作法：

1. **檢查 AWS 運作狀態儀表板。**

   若要識別問題，第一個步驟是檢查[AWS 服務運作狀態儀表板](https://health.aws.amazon.com/health/status)和 AWS 您的帳戶運作狀態儀表板。這些儀表板會提供服務層級問題、受影響的資料表、持續性問題，以及問題解決後的根本原因等重要資訊。

   檢閱這些儀表板中的詳細資訊，可讓您更深入了解 AWS 服務 正在使用的 的目前狀態，以及影響您帳戶的任何潛在問題。此資訊可協助您決定後續行動，以解決問題並將營運中斷降至最低。

1. **請聯絡 支援。**

   如果您在請求中觀察到長時間持續的錯誤，可能代表服務出現問題。一般而言，如果您在過去 15 分鐘內看到整體故障率為 1% 或更高，則適合將問題呈報至 AWS 支援團隊。如需更多資訊，請參閱 [DynamoDB 服務水準協議](https://aws.amazon.com/dynamodb/sla/)。

   向 AWS 支援團隊開立案例時，請提供下列詳細資訊，以協助加速疑難排解程序：
   + 受影響的 DDB：資料表或次要索引
   + 錯誤發生的觀察時間範圍
   + DynamoDB 請求 ID (例如 `4KBNVRGD25RG1KEO9UT4V3FQDJVV4KQNSO5AEMVJF66Q9ASUAAJG`)，可在應用程式日誌中找到。

   在支援案例中包含這些詳細資訊，將有助於 AWS 團隊了解問題並提供更快的解決方法。即使沒有請求 ID，也應使用其他可用資訊建立支援案例。

## 將內部伺服器錯誤的影響降至最低
<a name="ServerErrors-minimizing-impact"></a>

若在使用 DynamoDB 時發生內部伺服器錯誤，請採取以下最佳實務，以將對應用程式的影響降至最低：
+ 使用退避與重試機制 – DynamoDB 的預設 SDK 行為設計旨在為大多數應用程式在退避與重試策略間取得最佳平衡。不過，您可根據應用程式對停機時間的容忍度與效能需求調整這些設定。進一步了解退避與重試機制，以掌握如何微調重試設定。
+ 使用最終一致讀取 – 若應用程式不需高度一致性讀取，建議採用最終一致讀取。此類讀取成本較低，且較不易因內部伺服器錯誤而遭遇暫時性問題，因其可由任一可用儲存節點提供。如需詳細資訊，請參閱[DynamoDB 讀取一致性](HowItWorks.ReadConsistency.md)。

## 提升營運覺察
<a name="ServerErrors-improving-operational-awareness"></a>

在現今數位環境中，維持應用程式的高可用性與可靠性至關重要。其中一個關鍵作法是主動監控 DynamoDB 資料表與全域次要索引 (GSI) 中的內部伺服器錯誤 (ISE)。透過建立 CloudWatch 警示監控這些錯誤，您可提升營運覺察，並在潛在問題影響最終使用者前收到通知。此方法符合 AWS Well-Architected Framework 的卓越營運支柱，確保您的 DynamoDB 工作負載已針對效能、安全性和可靠性進行最佳化。

**建立 CloudWatch 警示**

應在 DynamoDB 資料表上設定 CloudWatch 警示，以接收持續高比例內部伺服器錯誤的通知，而非手動監控指標。這與適用於任何工作負載的 Well-Architected 架構的卓越營運支柱有關 AWS。如需進一步了解如何依 Well-Architecting 原則設計您的 DynamoDB 資料表，請參閱 [使用 DynamoDB Well-Architected Lens 來最佳化您的 DynamoDB 工作負載](bp-wal.md)。

這些警示使用自訂指標運算，以計算 5 分鐘區間內的失敗請求比例。建議的最佳實務是將警示設定為當連續三個資料點超過 1% 閾值時進入 `ALARM` 狀態，代表在 15 分鐘內約有 1% 的請求失敗。

以下範例是 CloudFormation 範本，可協助您在資料表上建立 CloudWatch 警示，並在資料表上建立 GSI。

```
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'
```