{DynamoDB}DynamoDB Auto Scaling によるスループット容量の自動管理

-- ステップ 0: クライアントEC2(Amazon Linux2)にPython3.8をインストール

amazon-linux-extras list | grep python
sudo amazon-linux-extras install -y python3.8
python3.8 -V

sudo pip3.8 install boto3


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

aws dynamodb create-table \
--table-name tab1 \
--attribute-definitions \
AttributeName=col1,AttributeType=N \
AttributeName=col2,AttributeType=N \
--key-schema \
AttributeName=col1,KeyType=HASH \
AttributeName=col2,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5

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


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

aws application-autoscaling register-scalable-target \
--service-namespace dynamodb \
--resource-id "table/tab1" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--min-capacity 5 \
--max-capacity 10

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


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

vim a.json
{
"PredefinedMetricSpecification": {
"PredefinedMetricType": "DynamoDBWriteCapacityUtilization"
},
"ScaleOutCooldown": 60,
"ScaleInCooldown": 60,
"TargetValue": 50.0
}


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


aws application-autoscaling describe-scaling-policies \
--service-namespace dynamodb \
--resource-id "table/tab1" \
--policy-name "policy01"

-- ステップ 4: 書き込みトラフィックを tab1 にドライブする

vim a.py

import boto3
dynamodb = boto3.resource('dynamodb')

table = dynamodb.Table("tab1")

col3 = "x" * 100000

i = 0
while (i < 10):
j = 0
while (j < 10):
print (i, j)

table.put_item(
Item={
'col1':i,
'col2':j,
'col3':col3
}
)
j += 1
i += 1


python3.8 a.py


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

while true;do aws application-autoscaling describe-scaling-activities --service-namespace dynamodb; sleep 5; done


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


-- ステップ 6: クリーンアップする

-- スケーリングポリシー一覧
aws application-autoscaling describe-scaling-policies --service-namespace dynamodb


-- スケーリングポリシー削除
aws application-autoscaling delete-scaling-policy \
--service-namespace dynamodb \
--resource-id "table/tab1" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits" \
--policy-name "policy01"

-- スケーリングターゲット一覧
aws application-autoscaling describe-scalable-targets --service-namespace dynamodb


-- スケーリングターゲット削除
aws application-autoscaling deregister-scalable-target \
--service-namespace dynamodb \
--resource-id "table/tab1" \
--scalable-dimension "dynamodb:table:WriteCapacityUnits"

-- テーブル一覧
aws dynamodb list-tables

-- テーブル削除
aws dynamodb delete-table --table-name tab1