AWS CLI を使用した DynamoDB Auto Scaling の管理 - Amazon DynamoDB

AWS CLI を使用した DynamoDB Auto Scaling の管理

AWS Management Console を使用する代わりに、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 のスケーリングを特定の時間に実行するようにスケジュールすることもできます。基本的な手順については、こちらを参照してください。

開始する前に

チュートリアルを開始する前に、以下のタスクを完了します。

AWS CLI をインストールする

まだ AWS CLI をインストールして設定していない場合は、インストールして設定する必要があります。これを行うには、AWS Command Line Interface のユーザーガイドの手順に従います。

Python のインストール

このチュートリアルの一部では、Python プログラムを実行する必要があります (ステップ 4: 書き込みトラフィックを TestTable に送る を参照)。まだインスタンスしていない場合は、Python をダウンロードできます。

ステップ 1: DynamoDB テーブルを作成する

このステップでは、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
  2. テーブルのステータスを確認するには、次のコマンドを使用します。

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

    ステータスが ACTIVE になったら、テーブルは使用できる状態になります。

ステップ 2: スケーラブルなターゲットを登録する

次に、Application Auto Scaling を使用して、テーブルの書き込み容量をスケーラブルなターゲットとして登録します。これにより、Application Auto Scaling は、TestTable にプロビジョンされた書き込み容量を調整できますが、容量単位は 5~10 の範囲内に限られます。

注記

DynamoDB Auto Scaling では、ユーザーに代わって Auto Scaling アクションを実行する、サービスリンクロール (AWSServiceRoleForApplicationAutoScaling_DynamoDBTable) の存在を必要とします。このロールは自動的に作成されます。詳細については、「Application Auto Scaling ユーザーガイド」の「Application Auto Scaling 用のサービスリンクロール」を参照してください。

  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
  2. 次のコマンドを使用して登録を確認します。

    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: スケーリングポリシーを作成する

このステップでは、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: スケーラブルなターゲットを登録する を参照)、プロビジョンされた消費量とプロビジョンされた比率が 50% またはそれに近いままになるようにします。ScaleOutCooldownScaleInCooldown の値を 60 秒に設定します。

  1. 次の内容で、scaling-policy.json というファイルを作成します。

    { "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" }, "ScaleOutCooldown": 60, "ScaleInCooldown": 60, "TargetValue": 50.0 }
  2. 次の 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
  3. 出力では、Application Auto Scaling が 2 つの Amazon CloudWatch アラームを作成したことに注意してください。スケーリング目標範囲の上限と下限に対応します。

  4. 以下の AWS CLI コマンドを使用して、スケーリングポリシーの詳細を表示します。

    aws application-autoscaling describe-scaling-policies \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --policy-name "MyScalingPolicy"
  5. 出力で、ポリシー設定が ステップ 2: スケーラブルなターゲットを登録する と ステップ 3: スケーリングポリシーを作成する からの仕様と一致することを確認します。

ステップ 4: 書き込みトラフィックを TestTable に送る

これで、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
  2. プログラムを実行するには、次のコマンドを入力します。

    python bulk-load-test-table.py

    TestTable のプロビジョンされた書き込み容量は非常に低いため (5 書き込み容量単位)、書き込みスロットリングが原因でプログラムが停止することがあります。これは想定される動作です。

    次のステップに進む間、プログラムを実行し続けます。

ステップ 5: Application Auto Scaling アクションを表示する

このステップでは、ユーザーに代わって開始された 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 リクエストを発行したことを示しています。

  2. DynamoDB がテーブルの書き込み容量を増やしたことを確認するには、次のコマンドを入力します。

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

    WriteCapacityUnits5 から 10 にスケーリングされている必要があります。

(オプション) ステップ 6: クリーンアップする

このチュートリアルでは、いくつかのリソースを作成しました。これらのリソースが不要になった場合は、削除できます。

  1. TestTable のスケーリングポリシーを削除します。

    aws application-autoscaling delete-scaling-policy \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits" \ --policy-name "MyScalingPolicy"
  2. スケーラブルなターゲットを登録解除します。

    aws application-autoscaling deregister-scalable-target \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits"
  3. TestTable テーブルを削除します。

    aws dynamodb delete-table --table-name TestTable