AWS 用cloudformation配置自动扩容挺复杂的,久了不用又得翻文档,所以记录一下。
配置DynamoDB 及自动扩容需要以下权限:
iam role Policy
参考文档:
https://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/Welcome.html
https://docs.aws.amazon.com/zh_cn/autoscaling/application/APIReference/API_ScalableTarget.html
这里涉及到三个资源AWS::DynamoDB::Table
AWS::IAM::Role
AWS::ApplicationAutoScaling::ScalableTarget
AWS::ApplicationAutoScaling::ScalingPolicy
- Table:DynamoDB表
- Role :用于创建执行自动扩容的角色身份(执行自动扩容需要一定权限所以要创建一个身份去执行)
- ScalableTarget:扩容目标规则 如资源可调节的上下限及要自动扩容的资源类型
- ScalingPolicy:扩容策略 如扩容标准
及扩容速度
因为配置过长,本文仅以写容量扩容举例
1 DynamoDB表配置
Resources message即配置了一个叫messages_test表,并创建了一个message_index的全局二级索引。索引和表读取写入容量均为3.
2 Role
Resources ScalingRole即配置AutoScaling角色,AWS 每一个操作均需要相应的权限,而一系列权限的集合体就是角色。因为自动扩容涉及到DynamoDB表更新,cloud watch等操作,所以我们需要创建相应的角色,去作为自动扩容权限的身份主题。其中Action就是相应赋予该角色的权限。
3 ScalableTarget
WriteCapacityScalableTarget 我们定义了一个扩容规则:
MaxCapacity:100 为最大读写入容量
MinCapacity:3 最小写入容量
ResourceId:该规则对应资源
这里涉及到Formation的操作符:
Fn::Join 将一组值附加到单值中,中间用特定分隔符隔开,使用操作符构造ResourceId资源。
Ref: 返回指定 参数 或 资源 的值。
Fn::GetAtt:内部函数返回模板中的资源的属性值。
ScalableDimension:自动扩容的资源类型
ServiceNamespace:服务名称空间
对于索引的扩容规则与表的配置一致
4 ScalingPolicy
WriteTableIndexScalingPolicy 定义扩容策略(行为)
PolicyType:策略类型,DynamoDB只支持TargetTrackingScaling型
ScalingTargetId:扩容规则资源 即我们定义的扩容规则
TargetTrackingScalingPolicyConfiguration:具体行为
TargetValue:自动扩容的目标值。自动扩容会将使用率一致控制在该值附近
ScaleInCooldown:自动收缩冷却时间,即一次收缩与下一次收缩的间隔时间
ScaleOutCooldown:自动扩容的冷却时间,即一次扩容与下一次扩容的冷却时间
还有个比较重要的参数:使用 DependsOn 属性可以指定特定资源紧跟着另一个资源创建。
Code:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
"message": {
"Type": "AWS::DynamoDB::Table",
"Properties" : {
"AttributeDefinitions": [
{
"AttributeName": "userid",
"AttributeType": "S" },
{
"AttributeName": "_id",
"AttributeType": "S" }
],
"TableName": "messages_test",
"KeySchema": [
{
"AttributeName": "userid",
"KeyType": "HASH" }
],
"GlobalSecondaryIndexes": [
{
"IndexName": "message_index",
"KeySchema": [ { "AttributeName": "_id", "KeyType": "HASH" } ],
"Projection": { "ProjectionType": "ALL" },
"ProvisionedThroughput": { "ReadCapacityUnits": 3, "WriteCapacityUnits": 3 } }
],
"ProvisionedThroughput": {
"ReadCapacityUnits": 3,
"WriteCapacityUnits": 3 }
}
},
"ScalingRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [ { "Effect": "Allow", "Principal": { "Service": [ "application-autoscaling.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] } ] },
"Path": "/",
"Policies": [
{
"PolicyName": "root",
"PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:DescribeTable", "dynamodb:UpdateTable", "cloudwatch:PutMetricAlarm", "cloudwatch:DescribeAlarms", "cloudwatch:GetMetricStatistics", "cloudwatch:SetAlarmState", "cloudwatch:DeleteAlarms" ], "Resource": "*" } ] } }
]
}
},
"WriteCapacityScalableTarget": {
"Type": "AWS::ApplicationAutoScaling::ScalableTarget",
"Properties": {
"MaxCapacity": 100,
"MinCapacity": 3,
"ResourceId": { "Fn::Join": [ "/", [ "table", { "Ref": "message" } ] ] },
"RoleARN": {
"Fn::GetAtt": ["ScalingRole", "Arn"] },
"ScalableDimension": "dynamodb:table:WriteCapacityUnits",
"ServiceNamespace": "dynamodb"
}
},
"WriteTableIndexCapacityScalableTarget": {
"Type": "AWS::ApplicationAutoScaling::ScalableTarget",
"Properties": {
"MaxCapacity": 100,
"MinCapacity": 3,
"ResourceId": { "Fn::Join": [ "/", [ "table", { "Ref": "message" }, "index", "message_index" ] ] },
"RoleARN": {
"Fn::GetAtt": ["ScalingRole", "Arn"] },
"ScalableDimension": "dynamodb:index:WriteCapacityUnits",
"ServiceNamespace": "dynamodb"
}
},
"WriteScalingPolicy": {
"Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
"Properties": {
"PolicyName": "WriteAutoScalingPolicy",
"PolicyType": "TargetTrackingScaling",
"ScalingTargetId": {
"Ref": "WriteCapacityScalableTarget" },
"TargetTrackingScalingPolicyConfiguration": {
"TargetValue": 70,
"ScaleInCooldown": 0,
"ScaleOutCooldown": 2,
"PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" } }
}
},
"WriteTableIndexScalingPolicy": {
"Type": "AWS::ApplicationAutoScaling::ScalingPolicy",
"Properties": {
"PolicyName": "WriteAutoScalingPolicy",
"PolicyType": "TargetTrackingScaling",
"ScalingTargetId": {
"Ref": "WriteTableIndexCapacityScalableTarget" },
"TargetTrackingScalingPolicyConfiguration": {
"TargetValue": 70,
"ScaleInCooldown": 0,
"ScaleOutCooldown": 2,
"PredefinedMetricSpecification": { "PredefinedMetricType": "DynamoDBWriteCapacityUtilization" } }
}
}
}
}