

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

# 使用 AWS CLI 管理 DynamoDB 自動擴展
<a name="AutoScaling.CLI"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 管理 Amazon DynamoDB 自動擴展 AWS 管理主控台，而不是使用 。本節中的教學課程會示範如何安裝和設定 AWS CLI 來管理 DynamoDB Auto Scaling 功能。在此教學課程中，您將執行下列操作：
+ 建立名為 `TestTable` 的 DynamoDB 資料表。初始輸送量設定是 5 個讀取容量單位和 5 個寫入容量單位。
+ 為 `TestTable` 建立 Application Auto Scaling 政策。該政策會設法將使用寫入容量與佈建寫入容量之間的目標比率保持在 50%。此指標範圍介於 5 到 10 個寫入容量單位之間。(Application Auto Scaling 無法調整超出此範圍的輸送量。)
+ 運行 Python 程式來將寫入流量推送至 `TestTable`。當目標比率持續超過 50% 時，Application Auto Scaling 會通知 DynamoDB 提高 `TestTable` 的輸送量，以便維持 50% 的目標使用率。
+ 確認 DynamoDB 已成功調整 `TestTable` 的佈建寫入容量。

**注意**  
您也可以設定 DynamoDB 擴展的排程，使其在特定時間執行。[在此](https://docs.aws.amazon.com/autoscaling/application/userguide/get-started-exercise.html)了解基本步驟。

**Topics**
+ [開始之前](#AutoScaling.CLI.BeforeYouBegin)
+ [步驟 1：建立 DynamoDB 資料表](#AutoScaling.CLI.CreateTable)
+ [步驟 2：註冊可擴展的目標](#AutoScaling.CLI.RegisterScalableTarget)
+ [步驟 3：建立擴展政策](#AutoScaling.CLI.CreateScalingPolicy)
+ [步驟 4：將寫入流量導向 TestTable](#AutoScaling.CLI.DriveTraffic)
+ [步驟 5：檢視 Application Auto Scaling 動作](#AutoScaling.CLI.ViewCWAlarms)
+ [(選用) 步驟 6：清除](#AutoScaling.CLI.CleanUp)

## 開始之前
<a name="AutoScaling.CLI.BeforeYouBegin"></a>

開始這些教學課程之前，請完成以下任務。

### 安裝 AWS CLI
<a name="AutoScaling.CLI.BeforeYouBegin.InstallCLI"></a>

若您尚未執行此作業，您必須安裝及設定 AWS CLI。若要執行此作業，請遵循《*AWS Command Line Interface 使用者指南*》中的這些說明：
+ [安裝 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/installing.html)
+ [設定 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html)

### 安裝 Python
<a name="AutoScaling.CLI.BeforeYouBegin.InstallPython"></a>

本教學課程的一部分會要求您執行 Python 程式 (請參閱 [步驟 4：將寫入流量導向 TestTable](#AutoScaling.CLI.DriveTraffic))。如果您還沒有安裝 Python 程式，則可以[下載 Python](https://www.python.org/downloads)。

## 步驟 1：建立 DynamoDB 資料表
<a name="AutoScaling.CLI.CreateTable"></a>

在此步驟中，您會使用 AWS CLI 來建立 `TestTable`。主索引鍵包含 `pk` (分割區索引鍵) 和 `sk` (排序索引鍵)。這些屬性的類型皆為 `Number`。初始輸送量設定是 5 個讀取容量單位和 5 個寫入容量單位。

1. 使用下列 AWS CLI 命令來建立資料表。

   ```
   aws dynamodb create-table \
       --table-name TestTable \
       --attribute-definitions \
           AttributeName=pk,AttributeType=N \
           AttributeName=sk,AttributeType=N \
       --key-schema \
           AttributeName=pk,KeyType=HASH \
           AttributeName=sk,KeyType=RANGE \
       --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
   ```

1. 若要檢查資料表的狀態，請使用以下命令。

   ```
   aws dynamodb describe-table \
       --table-name TestTable \
       --query "Table.[TableName,TableStatus,ProvisionedThroughput]"
   ```

   當資料表狀態為 `ACTIVE` 時，即可供使用。

## 步驟 2：註冊可擴展的目標
<a name="AutoScaling.CLI.RegisterScalableTarget"></a>

接下來，您可以使用 Application Auto Scaling 將資料表寫入容量註冊為可擴展的目標。這可讓 Application Auto Scaling 調整 *TestTable* 的佈建寫入容量，但僅在 5 至 10 個容量單位的範圍內。

**注意**  
DynamoDB Auto Scaling 需要有服務連結角色 (`AWSServiceRoleForApplicationAutoScaling_DynamoDBTable`)，其會代表您執行自動擴展動作。系統會自動建立此角色。如需詳細資訊，請參閱《*Application Auto Scaling 使用者指南*》中的[適用於 Application Auto Scaling 的服務連結角色](https://docs.aws.amazon.com/autoscaling/application/userguide/application-auto-scaling-service-linked-roles.html)。

1. 輸入下列命令來註冊可擴展的目標。

   ```
   aws application-autoscaling register-scalable-target \
       --service-namespace dynamodb \
       --resource-id "table/TestTable" \
       --scalable-dimension "dynamodb:table:WriteCapacityUnits" \
       --min-capacity 5 \
       --max-capacity 10
   ```

1. 若要確認註冊，請使用下列命令。

   ```
   aws application-autoscaling describe-scalable-targets \
       --service-namespace dynamodb \
       --resource-id "table/TestTable"
   ```
**注意**  
 您也可以針對全域次要索引註冊可擴展的目標。例如，對於全域次要索引 (test-index)，資源 ID 和可擴展的維度引數會適當地更新。  

   ```
   aws application-autoscaling register-scalable-target \
       --service-namespace dynamodb \
       --resource-id "table/TestTable/index/test-index" \
       --scalable-dimension "dynamodb:index:WriteCapacityUnits" \
       --min-capacity 5 \
       --max-capacity 10
   ```

## 步驟 3：建立擴展政策
<a name="AutoScaling.CLI.CreateScalingPolicy"></a>

在此步驟中，您會建立 `TestTable` 的擴展政策。此政策會定義 Application Auto Scaling 可在哪些詳細資訊下調整資料表的佈建輸送量，以及在執行此動作時要採取的動作。您可以將此政策與您在上一個步驟中定義的可擴展目標建立關聯 (`TestTable` 資料表的寫入容量單位)。

該政策包含下列元素：
+ `PredefinedMetricSpecification`：允許 Application Auto Scaling 調整的指標。對於 DynamoDB，下列值是 `PredefinedMetricType` 的有效值：
  + `DynamoDBReadCapacityUtilization`
  + `DynamoDBWriteCapacityUtilization`
+ `ScaleOutCooldown`：提高佈建輸送量的每個 Application Auto Scaling 事件之間的最短時間 (以秒為單位)。此參數可讓 Application Auto Scaling 持續 (但不積極) 增加輸送量，以便回應真實的工作負載。`ScaleOutCooldown` 的預設設定為 0。
+ `ScaleInCooldown`：減少佈建輸送量的每個 Application Auto Scaling 事件之間的最短時間 (以秒為單位)。此參數可讓 Application Auto Scaling 以逐漸且可預測的方式降低輸送量。`ScaleInCooldown` 的預設設定為 0。
+ `TargetValue`：Application Auto Scaling 可確保將耗用容量與佈建容量的比率保持在此值或接近此數值。您能以百分比的形式定義 `TargetValue`。

**注意**  
為了進一步了解 `TargetValue` 如何運作，請假設您資料表的佈建輸送量設定為 200 個寫入容量單位。您決定為此資料表建立擴展政策，並將 `TargetValue` 設為 70 %。  
現在，假設您開始將寫入流量導向該資料表，那實際的寫入輸送量就會是 150 個容量單位。耗用與佈建比率現在為 (150/200)，也就是 75%。此比率超過您的目標，因此 Application Auto Scaling 會將佈建的寫入容量提高至 215，使得比率成為 (150/215) (也就是 69.77 百分比)；盡可能靠近但不超過 `TargetValue`。

對於 `TestTable`，您將 `TargetValue` 設為 50%。Application Auto Scaling 將資料表佈建的輸送量調整在 5–10 個容量單位的範圍內 (請參閱 [步驟 2：註冊可擴展的目標](#AutoScaling.CLI.RegisterScalableTarget))，使耗用與佈建的比率維持在或接近 50%。您可以將 `ScaleOutCooldown` 和 `ScaleInCooldown` 的數值設為 60 秒。

1. 使用下列內容建立名為 `scaling-policy.json` 的檔案。

   ```
   {
       "PredefinedMetricSpecification": {
           "PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
       },
       "ScaleOutCooldown": 60,
       "ScaleInCooldown": 60,
       "TargetValue": 50.0
   }
   ```

1. 使用下列 AWS CLI 命令來建立政策。

   ```
   aws application-autoscaling put-scaling-policy \
       --service-namespace dynamodb \
       --resource-id "table/TestTable" \
       --scalable-dimension "dynamodb:table:WriteCapacityUnits" \
       --policy-name "MyScalingPolicy" \
       --policy-type "TargetTrackingScaling" \
       --target-tracking-scaling-policy-configuration file://scaling-policy.json
   ```

1. 請注意，在輸出中，Application Auto Scaling 已建立兩個 Amazon CloudWatch 警示：擴展目標範圍的上限和下限各一個警示。

1. 使用下列 AWS CLI 命令來檢視擴展政策的詳細資訊。

   ```
   aws application-autoscaling describe-scaling-policies \
       --service-namespace dynamodb \
       --resource-id "table/TestTable" \
       --policy-name "MyScalingPolicy"
   ```

1. 在輸出中，確認政策設定符合 [步驟 2：註冊可擴展的目標](#AutoScaling.CLI.RegisterScalableTarget) 和 [步驟 3：建立擴展政策](#AutoScaling.CLI.CreateScalingPolicy) 中的規格。

## 步驟 4：將寫入流量導向 TestTable
<a name="AutoScaling.CLI.DriveTraffic"></a>

現在，您可以將資料寫入 `TestTable` 來測試擴展政策。為此，您須執行 Python 程式。

1. 使用下列內容建立名為 `bulk-load-test-table.py` 的檔案。

   ```
   import boto3
   dynamodb = boto3.resource('dynamodb')
   
   table = dynamodb.Table("TestTable")
   
   filler = "x" * 100000
   
   i = 0
   while (i < 10):
       j = 0
       while (j < 10):
           print (i, j)
           
           table.put_item(
               Item={
                   'pk':i,
                   'sk':j,
                   'filler':{"S":filler}
               }
           )
           j += 1
       i += 1
   ```

1. 請輸入下列命令來執行程式。

   `python bulk-load-test-table.py`

   `TestTable` 的佈建寫入容量非常低 (5 個寫入容量單位)，因此程式偶爾會因寫入限流而停滯。這是預期的行為。

   讓程式繼續執行，您則繼續下一個步驟。

## 步驟 5：檢視 Application Auto Scaling 動作
<a name="AutoScaling.CLI.ViewCWAlarms"></a>

 在此步驟中，您可以檢視代表您啟動的 Application Auto Scaling 動作。您也可以確認 Application Auto Scaling 已更新 `TestTable` 的佈建寫入容量。

1. 輸入下列命令來檢視 Application Auto Scaling 動作。

   ```
   aws application-autoscaling describe-scaling-activities \
       --service-namespace dynamodb
   ```

   在 Python 程式執行時，偶爾重新執行此命令。(調用擴展政策需要幾分鐘的時間。) 您最終應該會看到下列輸出。

   ```
   ...
   {
       "ScalableDimension": "dynamodb:table:WriteCapacityUnits", 
       "Description": "Setting write capacity units to 10.", 
       "ResourceId": "table/TestTable", 
       "ActivityId": "0cc6fb03-2a7c-4b51-b67f-217224c6b656", 
       "StartTime": 1489088210.175, 
       "ServiceNamespace": "dynamodb", 
       "EndTime": 1489088246.85, 
       "Cause": "monitor alarm AutoScaling-table/TestTable-AlarmHigh-1bb3c8db-1b97-4353-baf1-4def76f4e1b9 in state ALARM triggered policy MyScalingPolicy", 
       "StatusMessage": "Successfully set write capacity units to 10. Change successfully fulfilled by dynamodb.", 
       "StatusCode": "Successful"
   }, 
   ...
   ```

   這表示 Application Auto Scaling 已對 DynamoDB 發出 `UpdateTable` 請求。

1. 輸入下列命令，確認 DynamoDB 已增加資料表的寫入容量。

   ```
   aws dynamodb describe-table \
       --table-name TestTable \
       --query "Table.[TableName,TableStatus,ProvisionedThroughput]"
   ```

   `WriteCapacityUnits` 應該從 `5` 擴展至 `10`。

## (選用) 步驟 6：清除
<a name="AutoScaling.CLI.CleanUp"></a>

在此教學課程中，您已建立數個資源。如果不再需要這些資源，就可以將其刪除。

1. 刪除 `TestTable` 的擴展政策。

   ```
   aws application-autoscaling delete-scaling-policy \
       --service-namespace dynamodb \
       --resource-id "table/TestTable" \
       --scalable-dimension "dynamodb:table:WriteCapacityUnits" \
       --policy-name "MyScalingPolicy"
   ```

1. 取消註冊可擴展的目標。

   ```
   aws application-autoscaling deregister-scalable-target \
       --service-namespace dynamodb \
       --resource-id "table/TestTable" \
       --scalable-dimension "dynamodb:table:WriteCapacityUnits"
   ```

1. 刪除 `TestTable` 資料表。

   ```
   aws dynamodb delete-table --table-name TestTable
   ```