AWSCLIコマンドを利用してDynamoDBのScale設定をしてみた

どうもごきげんまるです。
相変わらずの1か月ぶりのブログです。
前回のAnsible勉強会のブログをアップしたら普段アクセス数が地を這うレベルだったのに突然すごい勢いで上昇し、ビビッて腰が引けてしまいブログを書けなかったと言い訳をしています。

ということで、今日はDynamoDBのScaling設定をAWSCLIでやってみたという内容です。

実はこの内容ですが、仕事でミスしまして。。。実際には設定がされず関係各所に壮大な迷惑をかけてしまった件です。
仕事としてはミスで終了(リカバリは別の方にやっていただくというダメっぷり…)だったのですが、このままでは何にもならないということで、どうすれば良かったのかを調べてブログに書きます。
ちなみにミスったところは、DynamoDBのTableのキャパシティータグでAutoScalingの「読み込みキャパシティー」と「書き込みキャパシティー」にチェックが入ってなかった箇所です。
f:id:gokigenmaru:20190527095017p:plain

チェックを入れると入れた設定が反映されているように見えてしまったことで、チェックが無くても問題ないと判断をしてしまいした。。。
f:id:gokigenmaru:20190527095316p:plain

自分のミスを時間をおいて改めて見直すと、ほんとなんでこんなミスをって…。自分の心が乱れますね。。。ブログ書くって怖いっす><

AWSCLIのDynanoDB Scaling設定コマンド

DynanoDBのScaling設定をするやり方は以下のAWSのサイトに載っています。
docs.aws.amazon.com
ここで書かれている通りにやれば問題は無かった…。

気を付けるのは、Scaling設定の場合は「aws dynamodb ~」や「aws dynamodbstreams ~」ではなく、「aws application-autoscaling register-scalable-target --service-namespace dynamodb ~」となることです。
余談ですが、これはDynaomDBに限らずECSなどでもそうなのですが、AWS CLIでScale系の設定をするときには「aws application-autoscaling ~」となることが多いです。自分は最初の頃Scaling設定が見つけられずにコマンドリファレンスを彷徨いまくったことがあります。
少し分かりにくいところですね。

このブログをみて試される方は、まずは適当なDynamoDBのテーブルを作ってください。
そして、まずはmin-capacityとmax-capacityを設定します。

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

設定をすると、DynamoDBのTableの「プロビジョニングされたキャパシティ」の書き込みキャパシティーユニットの値が「15」になります。
こんな感じ。
f:id:gokigenmaru:20190527100441p:plain

デフォルトは「5」なので、上記コマンドを実行したことで書き込みキャパシティーユニットの値が「5」から「15」に変わったことが分かります。
そして、書き込みキャパシティーのチェックを入れてみると、以下のようになります。
f:id:gokigenmaru:20190527100626p:plain
これを見てもらうとわかりますが、先ほど設定するときに利用したコマンドの

--min-capacity : プロビジョニングされたキャパシティ」の書き込みキャパシティーユニットの値 と 「Auto Scaling」のプロビジョニングされた最小キャパシティーの値
--max-capacity  : 「Auto Scaling」のプロビジョニングされた最小キャパシティーの値

となります。

自分のミスは、これで希望の設定が出来てしまっていたことで、上記サイトでここまでの設定で終わらせてしまい、以降のコマンドを実行しなかった。。。
ターゲット使用率はデフォルトの70%でよかったので、これで設定完了と思い込んでしまった。。。

ということで、皆さんは以降の設定を必ず実施してくださいね。
言われなくてもすると思いますが。

ここでAuto Scaling設定がある程度できています。
次にTargetValueを設定していきます。
まずはjsonファイルを以下の内容で作成します。
ファイル名:scaling-policy.json

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

作成後、以下のコマンドで上記jsonの設定を反映させます。

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

設定をすると「ターゲット使用率」が「50」になります。
また、書き込みキャパシティーにチェックが入ります。
f:id:gokigenmaru:20190527103038p:plain

ここまでやればDynamoDBのAutoScaling設定が完了です。
読み込みキャパシティーユニットを変更する場合は以下を変更してください。

min-capacityとmax-capacity設定で、

aws application-autoscaling register-scalable-target \
    --service-namespace dynamodb \
    --resource-id "table/TestTable" \
    --scalable-dimension "dynamodb:table:ReadCapacityUnits" \
    --min-capacity 15 \
    --max-capacity 20

jsonファイルで
ファイル名:scaling-policy.json

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

json設定反映で

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





教訓:しっかりと検証・確認してから作業は実施しましょう。(当たり前