vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

DynamoDB Auto Scaling 関連リソース

AWSマネジメントコンソールで新規テーブルを作成すると、デフォルトで Auto Scaling が有効な状態で作成されるようになっているそうです。(変わっていないAWSアカウントもありましたので、既存環境はIAM Role等々を用意しないと切り替わらないのかもしれません。)

  • デフォルトで Auto Scaling 有効

f:id:htnosm:20170714184101p:plain

  • デフォルトで Auto Scaling 無効(既存)

f:id:htnosm:20170714184102p:plain

以下、既存テーブルへ適用しようとした際に調査した内容です。

DynamoDB Auto Scaling 設定値

設定できる最小/最大値は以下の通りです。

  • Provisioned capacity
    • Auto Scaling を有効化した場合は設定不可
  • Auto Scaling
    • Target utilization (%)
      • 20 〜 80
    • Minimum provisioned capacity
      • 1 〜 5
    • Maximum provisioned capacity
      • 5 〜 10000
    • IAM Role
      • AWSマネジメントコンソール上でのデフォルトは DynamoDBAutoscaleRole

DynamoDB Auto Scaling 有効化で作成されるリソース

IAM Role

規定では DynamoDBAutoscaleRole です。 後述のポリシー(DynamoDBAutoscalePolicy)、Trust Relationshipが付与されます。

DynamoDBAutoscalePolicy

"Document": {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "dynamodb:DescribeTable",
                "dynamodb:UpdateTable",
                "cloudwatch:PutMetricAlarm",
                "cloudwatch:DescribeAlarms",
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:SetAlarmState",
                "cloudwatch:DeleteAlarms"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

Trust Relationship

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "application-autoscaling.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

Application Auto Scaling

スケーリングは DynamoDB での管理ではなく、 Application Auto Scaling での管理となります。

ScalableTarget

テーブル単位で ReadCapacityUnits と WriteCapacityUnits がそれぞれ作成されます。

"ScalableTargets": [
    {
        "ScalableDimension": "dynamodb:table:ReadCapacityUnits",
        "ResourceId": "table/dummy-table",
        "RoleARN": "arn:aws:iam::999999999999:role/service-role/DynamoDBAutoscaleRole",
        "CreationTime": 9999999999.99,
        "MinCapacity": 1,
        "ServiceNamespace": "dynamodb",
        "MaxCapacity": 5
    },
    {
        "ScalableDimension": "dynamodb:table:WriteCapacityUnits",
        "ResourceId": "table/dummy-table",
        "RoleARN": "arn:aws:iam::999999999999:role/service-role/DynamoDBAutoscaleRole",
        "CreationTime": 9999999999.99,
        "MinCapacity": 1,
        "ServiceNamespace": "dynamodb",
        "MaxCapacity": 5
    }
]

ScalingPolicy

テーブル単位で ReadCapacityUnits と WriteCapacityUnits がそれぞれ作成されます。
加えて、スケーリング判断用の CloudWatch Alarm が4つ付随します。

"ScalingPolicies": [
    {
        "PolicyName": "DynamoDBReadCapacityUtilization:table/dummy-table",
        "ScalableDimension": "dynamodb:table:ReadCapacityUnits",
        "ResourceId": "table/dummy-table",
        "CreationTime": 9999999999.999,
        "PolicyARN": "arn:aws:autoscaling:ap-northeast-1:999999999999:scalingPolicy:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:resource/dynamodb/table/dummy-table:policyName/DynamoDBReadCapacityUtilization:table/dummy-table",
        "PolicyType": "TargetTrackingScaling",
        "TargetTrackingScalingPolicyConfiguration": {
            "TargetValue": 70.0,
            "PredefinedMetricSpecification": {
                "PredefinedMetricType": "DynamoDBReadCapacityUtilization"
            }
        },
        "Alarms": [
            {
                "AlarmName": "TargetTracking-table/dummy-table-AlarmHigh-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:999999999999:alarm:TargetTracking-table/dummy-table-AlarmHigh-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            },
            {
                "AlarmName": "TargetTracking-table/dummy-table-AlarmLow-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:999999999999:alarm:TargetTracking-table/dummy-table-AlarmLow-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            },
            {
                "AlarmName": "TargetTracking-table/dummy-table-ProvisionedCapacityHigh-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:999999999999:alarm:TargetTracking-table/dummy-table-ProvisionedCapacityHigh-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            },
            {
                "AlarmName": "TargetTracking-table/dummy-table-ProvisionedCapacityLow-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:999999999999:alarm:TargetTracking-table/dummy-table-ProvisionedCapacityLow-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
            }
        ],
        "ServiceNamespace": "dynamodb"
    },
・・・略
]

CloudWatch Alarm

AlarmHigh のみ 5分間、その他は 15分間での設定になっています。 Description に DO NOT EDIT OR DELETE と有り、閾値時間変更は推奨されないようです。

  • AlarmLow
  • AlarmHigh
  • ProvisionedCapacityLow
  • ProvisionedCapacityHigh

AWS CLI チュートリアル

CLI を使用したチュートリアルが公開されていますので、一通り実行してみるとイメージを掴みやすいかと思います。

Using the AWS CLI to Manage DynamoDB Auto Scaling - Amazon DynamoDB

チュートリアル実施時の注意点としては下記のような感じでしょうか。

DynamoDB Auto Scaling 設定は、aws dynamodb ではなく、aws application-autoscaling です。

マネジメントコンソールから作成すると、ScaleOutCooldown/ScaleInCooldown はデフォルト0で作成されます。 マネジメントコンソール上からの変更方法は現時点では提供されていないようです。