Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

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

AWS マネジメントコンソール の代わりに AWS Command Line Interface (AWS CLI) を使用して DynamoDB Auto Scaling を管理できます。このセクションのチュートリアルでは、DynamoDB Auto Scaling を管理するために AWS CLI をインストールして設定する方法を示します。このチュートリアルでは、以下の作業を行います。

  • TestTable という名前の DynamoDB テーブルを作成します。初期スループット設定は、読み込みキャパシティーユニット数が 5、書き込みキャパシティーユニット数が 5 です。

  • TestTable の アプリケーションの Auto Scaling ポリシーを作成します。このポリシーでは、プロビジョニングされた書き込みキャパシティーに対する消費された書き込みキャパシティーの割合を 50% に維持することを目指します。このメトリックスの範囲は 5 ~ 10 書き込みキャパシティーユニットです (アプリケーションの Auto Scaling でこの範囲を超えてスループットを調整することはできません)。

  • TestTable に書き込みトラフィックを送る Python プログラムを実行します。50% のターゲット使用率を超えた状態が続くと、ターゲット使用率を維持できるように TestTable のスループットを上方修正するよう アプリケーションの Auto Scaling から DynamoDB に通知が送られます。

  • TestTable のプロビジョニングされた書き込みキャパシティーが DynamoDB によって正常に調整されたことを確認します。

開始する前に

このチュートリアルを開始する前に、次のタスクを完了しておく必要があります。

AWS CLI をインストールする

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

Python のインストール

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

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

このステップでは、AWS CLI を使用して TestTable を作成します。プライマリキーは、pk (パーティションキー) と sk (ソートキー) で構成されます。これらの属性は両方とも数値型になります。初期スループット設定は、読み込みキャパシティーユニット数が 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: スケーラブルなターゲットを登録する

次に、テーブルの書き込みキャパシティーをスケーラブルなターゲットとして アプリケーションの Auto Scaling に登録します。これにより、TestTable のプロビジョニングされた書き込みキャパシティーを アプリケーションの Auto Scaling が 5 ~ 10 キャパシティーユニットの範囲内で調整できるようになります。

注記

DynamoDB Auto Scaling では、ユーザーの代わりに Auto Scaling アクションを実行するサービスにリンクされたロール (AWSServiceRoleForApplicationAutoScaling_DynamoDBTable) が必要です。このロールは自動的に作成されます。詳細については、「アプリケーションの 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"

    注記

    GSI に対してスケーラブルなターゲットを登録することもできます。たとえば、GSI ("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 のスケーリングポリシーを作成します。このポリシーでは、アプリケーションの Auto Scaling でテーブルのプロビジョニングされたスループットを調整する際の詳細と、実行するアクションを定義します。このポリシーを、前のステップで定義したスケーラブルなターゲット (TestTable テーブルの書き込みキャパシティーユニット) に関連付けます。

このポリシーには次の要素が含まれます。

  • PredefinedMetricSpecification — アプリケーションの Auto Scaling で調整できるメトリックス。DynamoDB で有効な PredefinedMetricType の値は次のとおりです。

    • DynamoDBReadCapacityUtilization

    • DynamoDBWriteCapacityUtilization

  • ScaleOutCooldown — プロビジョニングされたスループットを増やす アプリケーションの Auto Scaling イベント間の最小時間 (秒)。これにより、アプリケーションの Auto Scaling でスループットを、実際のワークロードに応じて継続的 (かつ適度) に増やすことができます。ScaleOutCooldown のデフォルトの設定は 0 です。

  • ScaleInCooldown — プロビジョニングされたスループットを減らす アプリケーションの Auto Scaling イベント間の最小時間 (秒)。これにより、アプリケーションの Auto Scaling でスループットを、予想の範囲内で徐々に減らすことができます。ScaleInCooldown のデフォルトの設定は 0 です。

  • TargetValue — アプリケーションの Auto Scaling により、プロビジョニングされたキャパシティーに対する消費されたキャパシティーの割合が、この値またはこれに近い値に維持されます。TargetValue は割合 (%) として定義します。

注記

TargetValue の仕組みについて理解を深めるために、プロビジョニングされたスループットが 200 書き込みキャパシティーユニットに設定されているテーブルについて考えてみましょう。このテーブルのスケーリングポリシーを、TargetValue を 70% に設定して作成します。

ここで、実際の書き込みスループットが 150 キャパシティーユニットになるようにテーブルに書き込みトラフィックを送ったとします。これにより、プロビジョニングされたキャパシティーに対する消費されたキャパシティーの割合が 75% (150 / 200) になります。この値は目標値を超えているため、アプリケーションの Auto Scaling は、プロビジョニングされた書き込みキャパシティーを 215 に増やします。これにより、プロビジョニングされたキャパシティーに対する消費されたキャパシティーの割合は 69.77% (150/215) になります。つまり、この割合は、TargetValue を超えない範囲で、できるだけ近い値に維持されます。

TestTable に対しては、TargetValue を 50% に設定します。アプリケーションの Auto Scaling により、このテーブルのプロビジョニングされたスループットが 50 ~ 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. 出力で、アプリケーションの Auto Scaling によって 2 つの 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: アプリケーションの Auto Scaling のアクションを表示する

このステップでは、ユーザーの代わりに開始される アプリケーションの Auto Scaling のアクションを表示します。また、アプリケーションの Auto Scaling によって TestTable のプロビジョニングされた書き込みキャパシティーが更新されたことを確認します。

  1. 次のコマンドを入力して、アプリケーションの 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" }, ...

    これは、アプリケーションの 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