

# AWS CLI を使用した DynamoDB Auto Scaling の管理
<a name="AutoScaling.CLI"></a>

AWS マネジメントコンソール を使用する代わりに、AWS Command Line Interface (AWS CLI) を使用して、Amazon DynamoDB Auto Scaling を管理できます。このセクションのチュートリアルでは、DynamoDB Auto Scaling を管理するために AWS CLI をインストールして設定する方法を示します。このチュートリアルでは、以下の作業を行います。
+ `TestTable` という DynamoDB テーブルの作成 初期スループット設定では、読み込み容量単位数が 5、書き込み容量単位が 5 です。
+ `TestTable` 用アプリケーションの 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 をダウンロード](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 では、ユーザーに代わって 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 が 2 つの 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
   ```