

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

# 評估您的 DynamoDB 資料表自動擴展設定
<a name="CostOptimization_AutoScalingSettings"></a>

本節概述如何評估 DynamoDB 資料表上的自動擴展設定。[Amazon DynamoDB 自動擴展](AutoScaling.md)是一款功能，可根據應用程式流量和目標使用率指標，管理資料表和全域次要索引 (GSI) 輸送量。如此可確保您的資料表或 GSI 具有應用程式模式所需的容量。

 AWS 自動擴展服務將監控您目前的資料表使用率，並將其與目標使用率值進行比較：`TargetValue`。若需增加或減少分配的容量，您會收到通知。

**Topics**
+ [了解您的自動擴展設定](#CostOptimization_AutoScalingSettings_UnderProvisionedTables)
+ [如何識別目標使用率低的資料表 (<=50%)](#CostOptimization_AutoScalingSettings_IdentifyLowUtilization)
+ [如何處理具有季節性差異的工作負載](#CostOptimization_AutoScalingSettings_SeasonalVariance)
+ [如何處理具有未知模式的尖峰工作負載](#CostOptimization_AutoScalingSettings_UnknownPatterns)
+ [如何處理具有連結應用程式的工作負載](#CostOptimization_AutoScalingSettings_BetweenRanges)

## 了解您的自動擴展設定
<a name="CostOptimization_AutoScalingSettings_UnderProvisionedTables"></a>

您的營運團隊需定義目標使用率的正確值、初始步驟和最終值。這可讓您根據歷史應用程式使用情況來定義值，用來觸發 AWS 自動擴展政策。使用率目標是套用自動擴展規則之前的一段時間內，需要達成的總容量百分比。

當您設定**高使用率目標 (目標約 90%)** 時，表示您的流量須在一段時間內高於 90%，才會啟用自動擴展。除非您的應用程式狀態穩定，且不會接收到流量尖峰，否則不應使用高使用率目標。

當您設定非常**低使用率 (目標小於 50%)** 時，表示您的應用程式須達到佈建容量的 50%，才會觸發自動擴展政策。除非您的應用程式流量成長快速，否則這通常會變成未使用容量和資源浪費。

## 如何識別目標使用率低的資料表 (<=50%)
<a name="CostOptimization_AutoScalingSettings_IdentifyLowUtilization"></a>

您可以使用 AWS CLI 或 AWS 管理主控台 來監控和識別 DynamoDB 資源中自動擴展政策`TargetValues`的 ：

------
#### [ AWS CLI ]

1. 執行下列命令，傳回完整的資源清單：

   ```
   aws application-autoscaling describe-scaling-policies --service-namespace dynamodb
   ```

   此命令將傳回發給所有 DynamoDB 資源的自動擴展政策完整清單。若您只想從特定資料表擷取資源，您可以新增 `–resource-id parameter`。例如：

   ```
   aws application-autoscaling describe-scaling-policies --service-namespace dynamodb --resource-id "table/<table-name>”
   ```

1. 執行下列命令，僅傳回特定 GSI 的自動擴展政策

   ```
   aws application-autoscaling describe-scaling-policies --service-namespace dynamodb --resource-id "table/<table-name>/index/<gsi-name>”
   ```

   我們對自動擴展政策感興趣的值於下面強調顯示。我們希望確保目標值大於 50%，以避免過度佈建。您應該會獲得類似以下的結果：

   ```
   {
       "ScalingPolicies": [
           {
               "PolicyARN": "arn:aws:autoscaling:<region>:<account-id>:scalingPolicy:<uuid>:resource/dynamodb/table/<table-name>/index/<index-name>:policyName/$<full-gsi-name>-scaling-policy",
               "PolicyName": $<full-gsi-name>”,
               "ServiceNamespace": "dynamodb",
               "ResourceId": "table/<table-name>/index/<index-name>",
               "ScalableDimension": "dynamodb:index:WriteCapacityUnits",
               "PolicyType": "TargetTrackingScaling",
               "TargetTrackingScalingPolicyConfiguration": {
                   "TargetValue": 70.0,
                   "PredefinedMetricSpecification": {
                       "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
                   }
               },
               "Alarms": [
                   ...
               ],
               "CreationTime": "2022-03-04T16:23:48.641000+10:00"
           },
           {
               "PolicyARN": "arn:aws:autoscaling:<region>:<account-id>:scalingPolicy:<uuid>:resource/dynamodb/table/<table-name>/index/<index-name>:policyName/$<full-gsi-name>-scaling-policy",
               "PolicyName":$<full-gsi-name>”,
               "ServiceNamespace": "dynamodb",
               "ResourceId": "table/<table-name>/index/<index-name>",
               "ScalableDimension": "dynamodb:index:ReadCapacityUnits",
               "PolicyType": "TargetTrackingScaling",
               "TargetTrackingScalingPolicyConfiguration": {
                   "TargetValue": 70.0,
                   "PredefinedMetricSpecification": {
                       "PredefinedMetricType": "DynamoDBReadCapacityUtilization"
                   }
               },
               "Alarms": [
                   ...
               ],
               "CreationTime": "2022-03-04T16:23:47.820000+10:00"
           }
       ]
   }
   ```

------
#### [ AWS 管理主控台 ]

1. 登入 AWS 管理主控台 ，並在 https：//[https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/) 開啟 DynamoDB 主控台。

    AWS 區域 如有必要，請選取適當的 。

1. 在左側導覽列中，選取 **Tables** (資料表)。在 **Tables** (資料表) 頁面上，選取資料表 **Name** (名稱)。

1. 在*資料表詳細資訊*，選取**其他設定**，然後檢閱資料表的自動擴展設定。  
![\[含自動擴展設定的 DynamoDB 資料表詳細資訊頁面。檢視佈建容量使用率，並依需要進行調整。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/AutoScalingSettings1.png)

   對於索引，展開**索引容量**區段以檢視索引的自動擴展設定。  
![\[DynamoDB 主控台的索引容量區段。檢視並管理索引的自動擴展設定。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/AutoScalingSettings2.png)

------

若您的目標使用率值小於或等於 50%，您應探索資料表使用率指標，查看指標是否[佈建不足或過度佈建](CostOptimization_RightSizedProvisioning.md)。

## 如何處理具有季節性差異的工作負載
<a name="CostOptimization_AutoScalingSettings_SeasonalVariance"></a>

請考慮下列情況：您的應用程式大部分時間都以最小平均值運作，但使用率目標很低，因此應用程式可以快速回應特定時間發生的事件，且您擁有足夠容量避免受到限流。應用程式在正常辦公時間 (上午 9 點至下午 5 點) 非常忙碌，但下班時間僅在基礎層級運作時，這種情況就很常見。由於部分使用者在上午 9 點前開始連線，因此應用程式會使用此低閾值快速提升，以便在尖峰時段達到*所需*容量。

此情況可能如下所示：
+ 下午 5 點至上午 9 點之間，`ConsumedWriteCapacity` 單位停留在 90 和 100 之間
+ 使用者在上午 9 點前開始連線到應用程式，且容量單位大幅增加 (您看到的最大值為 1500 WCU)
+ 平均而言，在工作期間，應用程式使用量介於 800 到 1200

若上一個情況適用於您，請考慮使用[排程的自動擴展](https://docs.aws.amazon.com/autoscaling/application/userguide/examples-scheduled-actions.html)，您的資料表仍可設定應用程式自動擴展規則，但因目標使用率較低，只會在您需要的特定間隔佈建額外容量。

您可以使用 AWS CLI 來執行下列步驟，以建立排程的自動擴展規則，該規則將根據一天中的時間和一週中的一天執行。

1. 將您的 DynamoDB 資料表或 GSI 向 Application Auto Scaling註冊為可擴展的目標。可擴展的目標是 Application Auto Scaling 可橫向擴充和縮減的資源。

   ```
   aws application-autoscaling register-scalable-target \
       --service-namespace dynamodb \
       --scalable-dimension dynamodb:table:WriteCapacityUnits \
       --resource-id table/<table-name> \
       --min-capacity 90 \
       --max-capacity 1500
   ```

1. 根據您的需求設定排定的動作。

   我們需要兩個規則來處理此情況：一個用於向上擴展，另一個用於縮減規模。第一個規則向上擴展排程的動作：

   ```
   aws application-autoscaling put-scheduled-action \
       --service-namespace dynamodb \
       --scalable-dimension dynamodb:table:WriteCapacityUnits \
       --resource-id table/<table-name> \
       --scheduled-action-name my-8-5-scheduled-action \
       --scalable-target-action MinCapacity=800,MaxCapacity=1500 \
       --schedule "cron(45 8 ? * MON-FRI *)" \
       --timezone "Australia/Brisbane"
   ```

   第二個規則縮減規模排程的動作：

   ```
   aws application-autoscaling put-scheduled-action \
       --service-namespace dynamodb \
       --scalable-dimension dynamodb:table:WriteCapacityUnits \
       --resource-id table/<table-name> \
       --scheduled-action-name my-5-8-scheduled-down-action \
       --scalable-target-action MinCapacity=90,MaxCapacity=1500 \
       --schedule "cron(15 17 ? * MON-FRI *)" \
       --timezone "Australia/Brisbane"
   ```

1. 執行以下命令，驗證這兩個規則皆已啟用。

   ```
   aws application-autoscaling describe-scheduled-actions --service-namespace dynamodb
   ```

   您應該會取得如下結果：

   ```
   {
       "ScheduledActions": [
           {
               "ScheduledActionName": "my-5-8-scheduled-down-action",
               "ScheduledActionARN": "arn:aws:autoscaling:<region>:<account>:scheduledAction:<uuid>:resource/dynamodb/table/<table-name>:scheduledActionName/my-5-8-scheduled-down-action",
               "ServiceNamespace": "dynamodb",
               "Schedule": "cron(15 17 ? * MON-FRI *)",
               "Timezone": "Australia/Brisbane",
               "ResourceId": "table/<table-name>",
               "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
               "ScalableTargetAction": {
                   "MinCapacity": 90,
                   "MaxCapacity": 1500
               },
               "CreationTime": "2022-03-15T17:30:25.100000+10:00"
           },
           {
               "ScheduledActionName": "my-8-5-scheduled-action",
               "ScheduledActionARN": "arn:aws:autoscaling:<region>:<account>:scheduledAction:<uuid>:resource/dynamodb/table/<table-name>:scheduledActionName/my-8-5-scheduled-action",
               "ServiceNamespace": "dynamodb",
               "Schedule": "cron(45 8 ? * MON-FRI *)",
               "Timezone": "Australia/Brisbane",
               "ResourceId": "table/<table-name>",
               "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
               "ScalableTargetAction": {
                   "MinCapacity": 800,
                   "MaxCapacity": 1500
               },
               "CreationTime": "2022-03-15T17:28:57.816000+10:00"
           }
       ]
   }
   ```

下圖顯示一律保持 70% 目標使用率的範例工作負載。請注意持續套用自動擴展規則的方式，同時輸送量不會降低。

![\[即使自動擴展規則正在調整容量，資料表仍維持在 70% 目標使用率的輸送量。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/AutoScalingSettings3.png)


放大觀察可見應用程式出現尖峰，觸發了 70% 的自動擴展閾值，促使系統啟動自動擴展機制，以提供資料表所需的額外容量。排程的自動擴展動作會影響最大值與最小值，您須設定這些值。

![\[當 DynamoDB 資料表的輸送量出現峰值時，會啟動自動擴展以提供所需的額外容量。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/AutoScalingSettings4.png)


![\[DynamoDB 資料表的自動擴展設定：目標使用率、最小容量與最大容量值。\]](http://docs.aws.amazon.com/zh_tw/amazondynamodb/latest/developerguide/images/CostOptimization/AutoScalingSettings5.png)


## 如何處理具有未知模式的尖峰工作負載
<a name="CostOptimization_AutoScalingSettings_UnknownPatterns"></a>

在此情況中，應用程式會使用非常低的使用率目標，因為您仍不確定應用程式模式，同時要確保工作負載不受限流。

請考慮改用[隨需容量模式](capacity-mode.md#capacity-mode-on-demand)。隨需資料表非常適合流量模式不明的尖峰工作負載。使用隨需容量模式，您可以按請求支付應用程式在資料表上執行的資料讀取和寫入費用。您不需要指定預期應用程式執行的讀取和寫入輸送量，因為 DynamoDB 會立即因應工作負載的升降。

## 如何處理具有連結應用程式的工作負載
<a name="CostOptimization_AutoScalingSettings_BetweenRanges"></a>

在此情況中，應用程式會依賴其他系統，像是在批次處理的情況，您可能會根據應用程式邏輯中的事件，遇到流量出現大峰值。

請考慮開發自訂自動擴展邏輯，以回應這些事件，讓您可以根據特定需要，提升資料表容量與 `TargetValues`。您可以受益於 Lambda Amazon EventBridge 和 Step Functions 等 AWS 服務，並使用其組合來回應您的特定應用程式需求。