AWS Formation 配置DynamoDB及自动扩容

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" } }
              }
          }
    }   
}

猜你喜欢

转载自blog.csdn.net/m0_37263637/article/details/80833257
AWS