メニュー
Amazon DynamoDB
開発者ガイド (API Version 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 プログラムを実行する必要があります (「ステップ 5: TestTable に書き込みトラフィックを送る」を参照)。まだ Python をインストールしていない場合は、次のリンクを使用してダウンロードできます。https://www.python.org/downloads

ステップ 1: アプリケーションの Auto Scaling のサービスロールを作成する

アプリケーションの Auto Scaling を使用する前に、そのサービスロールを作成する必要があります。サービスロールは、ユーザーに代わって AWS のサービスを承認する IAM ロールです。サービスロールを使用すると、アプリケーションの Auto Scaling で DynamoDB リソースのプロビジョニングされたスループットの設定を、ユーザーが自ら変更しているかのように変更できます。

このステップでは、IAM ポリシーを作成し、そのポリシーを IAM ロールにアタッチします。そのロールを アプリケーションの Auto Scaling に割り当てることで、ユーザーの代わりに DynamoDB オペレーションを実行させることができます。

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

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "application-autoscaling.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. サービスロールを作成します。

    Copy
    aws iam create-role \ --role-name MyIAMAutoscalingServiceRole \ --assume-role-policy-document file://trust-relationship.json
  3. 次の内容で、service-role-policy.json というファイルを作成します。

    Copy
    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:UpdateTable", "cloudwatch:PutMetricAlarm", "cloudwatch:DescribeAlarms", "cloudwatch:DeleteAlarms" ], "Resource": "*" } ] }
  4. サービスロールの IAM ポリシーを作成します。

    Copy
    aws iam create-policy \ --policy-name MyIAMAutoscalingServicePolicy \ --policy-document file://service-role-policy.json

    出力で、作成したポリシーの Amazon リソースネーム (ARN) を書き留めます。以下に例を示します。arn:aws:iam::111122223333:policy/MyIAMAutoscalingServicePolicy

  5. ポリシーをサービスロールにアタッチします。

    Copy
    aws iam attach-role-policy \ --role-name MyIAMAutoscalingServiceRole \ --policy-arn arn

    arn を、前のステップで書き留めた実際のポリシー ARN に置き換えます。

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

このステップでは、AWS CLI を使用して TestTable を作成します。プライマリキーは、pk (パーティションキー) と sk (ソートキー) で構成されます。これらの属性は両方とも数値型になります。初期スループット設定は、読み込みキャパシティーユニット数が 5、書き込みキャパシティーユニット数が 5 です。

  1. 次の AWS CLI コマンドを使用してテーブルを作成します。

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

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

    テーブルは、ステータスが ACTIVE である場合に使用できます。

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

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

  1. スケーラブルなターゲットを登録するときには、「ステップ 1: アプリケーションの Auto Scaling のサービスロールを作成する」で作成した MyIAMAutoscalingServiceRole の ARN を指定します。このロール ARN を取得するには、次のコマンドを入力します。

    Copy
    aws iam get-role \ --role-name MyIAMAutoscalingServiceRole \ --query "Role.Arn"

    次に、次のコマンドを入力してスケーラブルなターゲットを登録します (roleARNMyIAMAutoscalingServiceRole の ARN に置き換えます)。

    Copy
    aws application-autoscaling register-scalable-target \ --service-namespace dynamodb \ --resource-id "table/TestTable" \ --scalable-dimension "dynamodb:table:WriteCapacityUnits" \ --min-capacity 5 \ --max-capacity 10 \ --role-arn roleARN
  2. 登録を確認するには、次のコマンドを使用します。

    Copy
    aws application-autoscaling describe-scalable-targets \ --service-namespace dynamodb \ --resource-id "table/TestTable"

ステップ 4: スケーリングポリシーを作成する

このステップでは、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 により、このテーブルのプロビジョニングされたスループットが 5~10 キャパシティーユニットの範囲で調整されて (「ステップ 3: スケーラブルなターゲットを登録する」を参照)、プロビジョニングされたキャパシティーに対する消費されたキャパシティーの割合が 50% にできるだけ近い値に維持されます。ScaleOutCooldownScaleInCooldown の値は 60 秒に設定します。

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

    Copy
    { "PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" }, "ScaleOutCooldown": 60, "ScaleInCooldown": 60, "TargetValue": 50.0 }
  2. 次の AWS CLI コマンドを使用してポリシーを作成します。

    Copy
    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 コマンドを使用して、スケーリングポリシーの詳細を表示します。

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

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

TestTable にデータを書き込んでスケーリングポリシーをテストできるようになりました。これを行うには、Python プログラムを実行します。

  1. 次の内容で、bulk-load-test-table.py というファイルを作成します。

    Copy
    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 書き込みキャパシティーユニット)、書き込み調整のためにプログラムがときどき停止します。これは想定される動作です。

    プログラムを実行したまま次のステップに進みます。

ステップ 6: アプリケーションの Auto Scaling のアクションを表示する

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

  1. 次のコマンドを入力して、アプリケーションの Auto Scaling のアクションを表示します。

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

    Python プログラムが実行されている間、このコマンドをときどき再実行します (スケーリングポリシーが呼び出されるまでに数分かかります)。最終的に次のような出力が表示されます。

    Copy
    ... { "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 がテーブルの書き込みキャパシティーを増やしたことを確認します。

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

    WriteCapacityUnits5 から 10 にスケールされているはずです。

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

このチュートリアルでは複数のリソースを作成しました。これらのリソースは、不要になったら削除できます。

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

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

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

    Copy
    aws dynamodb delete-table --table-name TestTable
  4. IAM ポリシーを削除するには、先にその ARN を確認する必要があります。

    Copy
    aws iam list-policies --scope Local

    出力で、MyIAMAutoscalingServicePolicy の ARN を書き留めます。以下に例を示します。arn:aws:iam::111122223333:policy/MyIAMAutoscalingServicePolicy

  5. ポリシーをサービスロールからデタッチします。

    Copy
    aws iam detach-role-policy \ --role-name MyIAMAutoscalingServiceRole \ --policy-arn arn

    arn を、前のステップで書き留めた実際のポリシー ARN に置き換えます。

    これでポリシーを削除できるようになりました。

    Copy
    aws iam delete-policy \ --policy-arn arn

    最後にサービスロールを削除します。

    Copy
    aws iam delete-role \ --role-name MyIAMAutoscalingServiceRole