From 35dbec482985ca7df9b8bcd6d9dd4abc3508a2a7 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Tue, 21 Nov 2023 13:44:55 +0000 Subject: [PATCH 1/5] Define S4L articles table auto scaling policy --- mobile-save-for-later/conf/cfn.yaml | 67 +++++++++++++++++++---------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/mobile-save-for-later/conf/cfn.yaml b/mobile-save-for-later/conf/cfn.yaml index 5a7f03df..cef8304f 100644 --- a/mobile-save-for-later/conf/cfn.yaml +++ b/mobile-save-for-later/conf/cfn.yaml @@ -1,24 +1,3 @@ -Resources: - SaveForLaterDynamoTable: - DeletionPolicy: Retain - Type: 'AWS::DynamoDB::Table' - Properties: - KeySchema: - - KeyType: HASH - AttributeName: userId - TableName: !Sub '${App}-${Stage}-articles' - AttributeDefinitions: - - AttributeName: userId - AttributeType: S - ProvisionedThroughput: - WriteCapacityUnits: !FindInMap - - StageVariables - - !Ref Stage - - TableWriteCapacity - ReadCapacityUnits: !FindInMap - - StageVariables - - !Ref Stage - - TableReadCapacity Description: Implements save for later for mobile Parameters: DynamoNotificationTopic: @@ -34,11 +13,53 @@ Parameters: AllowedValues: - CODE - PROD + Mappings: StageVariables: CODE: TableReadCapacity: 1 - TableWriteCapacity: 1 + TableWriteMinCapacity: 1 + TableWriteMaxCapacity: 10 PROD: TableReadCapacity: 200 - TableWriteCapacity: 125 + TableWriteMinCapacity: 75 + TableWriteMaxCapacity: 400 + +Resources: + SaveForLaterDynamoTable: + DeletionPolicy: Retain + Type: 'AWS::DynamoDB::Table' + Properties: + KeySchema: + - KeyType: HASH + AttributeName: userId + TableName: !Sub '${App}-${Stage}-articles' + AttributeDefinitions: + - AttributeName: userId + AttributeType: S + ProvisionedThroughput: + WriteCapacityUnits: !FindInMap [ StageVariables, !Ref Stage, TableWriteMinCapacity ] # Initial value, autoscaled with below resources + ReadCapacityUnits: !FindInMap [ StageVariables, !Ref Stage, TableReadCapacity ] + + SaveForLaterWritesScalableTarget: + Type: AWS::ApplicationAutoScaling::ScalableTarget + Properties: + MaxCapacity: !FindInMap [StageVariables, !Ref Stage, TableWriteMaxCapacity] + MinCapacity: !FindInMap [StageVariables, !Ref Stage, TableWriteMinCapacity] + ResourceId: !Sub "table/${App}-${Stage}-articles" + RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable + ScalableDimension: dynamodb:table:WriteCapacityUnits + ServiceNamespace: dynamodb + + SaveForLaterWritesScalingPolicy: + Type: AWS::ApplicationAutoScaling::ScalingPolicy + Properties: + PolicyName: SaveForLaterWritesScalingPolicy + PolicyType: TargetTrackingScaling + ScalingTargetId: !Ref SaveForLaterWritesScalableTarget + TargetTrackingScalingPolicyConfiguration: + TargetValue: 70.0 + ScaleInCooldown: 60 + ScaleOutCooldown: 10 + PredefinedMetricSpecification: + PredefinedMetricType: DynamoDBWriteCapacityUtilization From 46491e66d214890c84d21f164dfbb78f3e1ec561 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Tue, 21 Nov 2023 13:59:27 +0000 Subject: [PATCH 2/5] Updated Snapshots --- .../mobile-save-for-later.test.ts.snap | 114 +++++++++++++++++- 1 file changed, 108 insertions(+), 6 deletions(-) diff --git a/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap b/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap index 3472132f..72a72d38 100644 --- a/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap +++ b/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap @@ -7,11 +7,13 @@ Object { "StageVariables": Object { "CODE": Object { "TableReadCapacity": 1, - "TableWriteCapacity": 1, + "TableWriteMaxCapacity": 10, + "TableWriteMinCapacity": 1, }, "PROD": Object { "TableReadCapacity": 200, - "TableWriteCapacity": 125, + "TableWriteMaxCapacity": 400, + "TableWriteMinCapacity": 75, }, }, }, @@ -581,7 +583,7 @@ Object { Object { "Ref": "Stage", }, - "TableWriteCapacity", + "TableWriteMinCapacity", ], }, }, @@ -609,6 +611,55 @@ Object { }, "Type": "AWS::DynamoDB::Table", }, + "SaveForLaterWritesScalableTarget": Object { + "Properties": Object { + "MaxCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableWriteMaxCapacity", + ], + }, + "MinCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableWriteMinCapacity", + ], + }, + "ResourceId": Object { + "Fn::Sub": "table/\${App}-\${Stage}-articles", + }, + "RoleARN": Object { + "Fn::Sub": "arn:aws:iam::\${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable", + }, + "ScalableDimension": "dynamodb:table:WriteCapacityUnits", + "ServiceNamespace": "dynamodb", + }, + "Type": "AWS::ApplicationAutoScaling::ScalableTarget", + }, + "SaveForLaterWritesScalingPolicy": Object { + "Properties": Object { + "PolicyName": "SaveForLaterWritesScalingPolicy", + "PolicyType": "TargetTrackingScaling", + "ScalingTargetId": Object { + "Ref": "SaveForLaterWritesScalableTarget", + }, + "TargetTrackingScalingPolicyConfiguration": Object { + "PredefinedMetricSpecification": Object { + "PredefinedMetricType": "DynamoDBWriteCapacityUtilization", + }, + "ScaleInCooldown": 60, + "ScaleOutCooldown": 10, + "TargetValue": 70, + }, + }, + "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", + }, "fetcharticleslambda4E2BF026": Object { "DependsOn": Array [ "fetcharticleslambdaServiceRoleDefaultPolicy4A85964A", @@ -1080,11 +1131,13 @@ Object { "StageVariables": Object { "CODE": Object { "TableReadCapacity": 1, - "TableWriteCapacity": 1, + "TableWriteMaxCapacity": 10, + "TableWriteMinCapacity": 1, }, "PROD": Object { "TableReadCapacity": 200, - "TableWriteCapacity": 125, + "TableWriteMaxCapacity": 400, + "TableWriteMinCapacity": 75, }, }, }, @@ -1727,7 +1780,7 @@ Object { Object { "Ref": "Stage", }, - "TableWriteCapacity", + "TableWriteMinCapacity", ], }, }, @@ -1755,6 +1808,55 @@ Object { }, "Type": "AWS::DynamoDB::Table", }, + "SaveForLaterWritesScalableTarget": Object { + "Properties": Object { + "MaxCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableWriteMaxCapacity", + ], + }, + "MinCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableWriteMinCapacity", + ], + }, + "ResourceId": Object { + "Fn::Sub": "table/\${App}-\${Stage}-articles", + }, + "RoleARN": Object { + "Fn::Sub": "arn:aws:iam::\${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable", + }, + "ScalableDimension": "dynamodb:table:WriteCapacityUnits", + "ServiceNamespace": "dynamodb", + }, + "Type": "AWS::ApplicationAutoScaling::ScalableTarget", + }, + "SaveForLaterWritesScalingPolicy": Object { + "Properties": Object { + "PolicyName": "SaveForLaterWritesScalingPolicy", + "PolicyType": "TargetTrackingScaling", + "ScalingTargetId": Object { + "Ref": "SaveForLaterWritesScalableTarget", + }, + "TargetTrackingScalingPolicyConfiguration": Object { + "PredefinedMetricSpecification": Object { + "PredefinedMetricType": "DynamoDBWriteCapacityUtilization", + }, + "ScaleInCooldown": 60, + "ScaleOutCooldown": 10, + "TargetValue": 70, + }, + }, + "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", + }, "fetcharticleslambda4E2BF026": Object { "DependsOn": Array [ "fetcharticleslambdaServiceRoleDefaultPolicy4A85964A", From 6fe0b1e20408fdc066898dabd8a5997db13b0d4f Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Tue, 21 Nov 2023 17:08:17 +0000 Subject: [PATCH 3/5] Also scale read capacity and update snapshots --- .../mobile-save-for-later.test.ts.snap | 118 ++++++++++++++++-- mobile-save-for-later/conf/cfn.yaml | 33 ++++- 2 files changed, 139 insertions(+), 12 deletions(-) diff --git a/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap b/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap index 72a72d38..93db7095 100644 --- a/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap +++ b/cdk/lib/__snapshots__/mobile-save-for-later.test.ts.snap @@ -6,14 +6,16 @@ Object { "Mappings": Object { "StageVariables": Object { "CODE": Object { - "TableReadCapacity": 1, + "TableReadMaxCapacity": 10, + "TableReadMinCapacity": 1, "TableWriteMaxCapacity": 10, "TableWriteMinCapacity": 1, }, "PROD": Object { - "TableReadCapacity": 200, + "TableReadMaxCapacity": 400, + "TableReadMinCapacity": 50, "TableWriteMaxCapacity": 400, - "TableWriteMinCapacity": 75, + "TableWriteMinCapacity": 50, }, }, }, @@ -574,7 +576,7 @@ Object { Object { "Ref": "Stage", }, - "TableReadCapacity", + "TableReadMinCapacity", ], }, "WriteCapacityUnits": Object { @@ -611,6 +613,55 @@ Object { }, "Type": "AWS::DynamoDB::Table", }, + "SaveForLaterReadsScalableTarget": Object { + "Properties": Object { + "MaxCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableReadMaxCapacity", + ], + }, + "MinCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableReadMinCapacity", + ], + }, + "ResourceId": Object { + "Fn::Sub": "table/\${App}-\${Stage}-articles", + }, + "RoleARN": Object { + "Fn::Sub": "arn:aws:iam::\${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable", + }, + "ScalableDimension": "dynamodb:table:ReadCapacityUnits", + "ServiceNamespace": "dynamodb", + }, + "Type": "AWS::ApplicationAutoScaling::ScalableTarget", + }, + "SaveForLaterReadsScalingPolicy": Object { + "Properties": Object { + "PolicyName": "SaveForLaterReadsScalingPolicy", + "PolicyType": "TargetTrackingScaling", + "ScalingTargetId": Object { + "Ref": "SaveForLaterReadsScalableTarget", + }, + "TargetTrackingScalingPolicyConfiguration": Object { + "PredefinedMetricSpecification": Object { + "PredefinedMetricType": "DynamoDBReadCapacityUtilization", + }, + "ScaleInCooldown": 60, + "ScaleOutCooldown": 10, + "TargetValue": 70, + }, + }, + "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", + }, "SaveForLaterWritesScalableTarget": Object { "Properties": Object { "MaxCapacity": Object { @@ -1130,14 +1181,16 @@ Object { "Mappings": Object { "StageVariables": Object { "CODE": Object { - "TableReadCapacity": 1, + "TableReadMaxCapacity": 10, + "TableReadMinCapacity": 1, "TableWriteMaxCapacity": 10, "TableWriteMinCapacity": 1, }, "PROD": Object { - "TableReadCapacity": 200, + "TableReadMaxCapacity": 400, + "TableReadMinCapacity": 50, "TableWriteMaxCapacity": 400, - "TableWriteMinCapacity": 75, + "TableWriteMinCapacity": 50, }, }, }, @@ -1771,7 +1824,7 @@ Object { Object { "Ref": "Stage", }, - "TableReadCapacity", + "TableReadMinCapacity", ], }, "WriteCapacityUnits": Object { @@ -1808,6 +1861,55 @@ Object { }, "Type": "AWS::DynamoDB::Table", }, + "SaveForLaterReadsScalableTarget": Object { + "Properties": Object { + "MaxCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableReadMaxCapacity", + ], + }, + "MinCapacity": Object { + "Fn::FindInMap": Array [ + "StageVariables", + Object { + "Ref": "Stage", + }, + "TableReadMinCapacity", + ], + }, + "ResourceId": Object { + "Fn::Sub": "table/\${App}-\${Stage}-articles", + }, + "RoleARN": Object { + "Fn::Sub": "arn:aws:iam::\${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable", + }, + "ScalableDimension": "dynamodb:table:ReadCapacityUnits", + "ServiceNamespace": "dynamodb", + }, + "Type": "AWS::ApplicationAutoScaling::ScalableTarget", + }, + "SaveForLaterReadsScalingPolicy": Object { + "Properties": Object { + "PolicyName": "SaveForLaterReadsScalingPolicy", + "PolicyType": "TargetTrackingScaling", + "ScalingTargetId": Object { + "Ref": "SaveForLaterReadsScalableTarget", + }, + "TargetTrackingScalingPolicyConfiguration": Object { + "PredefinedMetricSpecification": Object { + "PredefinedMetricType": "DynamoDBReadCapacityUtilization", + }, + "ScaleInCooldown": 60, + "ScaleOutCooldown": 10, + "TargetValue": 70, + }, + }, + "Type": "AWS::ApplicationAutoScaling::ScalingPolicy", + }, "SaveForLaterWritesScalableTarget": Object { "Properties": Object { "MaxCapacity": Object { diff --git a/mobile-save-for-later/conf/cfn.yaml b/mobile-save-for-later/conf/cfn.yaml index cef8304f..e19935d2 100644 --- a/mobile-save-for-later/conf/cfn.yaml +++ b/mobile-save-for-later/conf/cfn.yaml @@ -17,12 +17,14 @@ Parameters: Mappings: StageVariables: CODE: - TableReadCapacity: 1 + TableReadMinCapacity: 1 + TableReadMaxCapacity: 10 TableWriteMinCapacity: 1 TableWriteMaxCapacity: 10 PROD: - TableReadCapacity: 200 - TableWriteMinCapacity: 75 + TableReadMinCapacity: 50 + TableReadMaxCapacity: 400 + TableWriteMinCapacity: 50 TableWriteMaxCapacity: 400 Resources: @@ -39,7 +41,7 @@ Resources: AttributeType: S ProvisionedThroughput: WriteCapacityUnits: !FindInMap [ StageVariables, !Ref Stage, TableWriteMinCapacity ] # Initial value, autoscaled with below resources - ReadCapacityUnits: !FindInMap [ StageVariables, !Ref Stage, TableReadCapacity ] + ReadCapacityUnits: !FindInMap [ StageVariables, !Ref Stage, TableReadMinCapacity ] # Initial value, autoscaled with below resources SaveForLaterWritesScalableTarget: Type: AWS::ApplicationAutoScaling::ScalableTarget @@ -63,3 +65,26 @@ Resources: ScaleOutCooldown: 10 PredefinedMetricSpecification: PredefinedMetricType: DynamoDBWriteCapacityUtilization + + SaveForLaterReadsScalableTarget: + Type: AWS::ApplicationAutoScaling::ScalableTarget + Properties: + MaxCapacity: !FindInMap [StageVariables, !Ref Stage, TableReadMaxCapacity] + MinCapacity: !FindInMap [StageVariables, !Ref Stage, TableReadMinCapacity] + ResourceId: !Sub "table/${App}-${Stage}-articles" + RoleARN: !Sub arn:aws:iam::${AWS::AccountId}:role/aws-service-role/dynamodb.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_DynamoDBTable + ScalableDimension: dynamodb:table:ReadCapacityUnits + ServiceNamespace: dynamodb + + SaveForLaterReadsScalingPolicy: + Type: AWS::ApplicationAutoScaling::ScalingPolicy + Properties: + PolicyName: SaveForLaterReadsScalingPolicy + PolicyType: TargetTrackingScaling + ScalingTargetId: !Ref SaveForLaterReadsScalableTarget + TargetTrackingScalingPolicyConfiguration: + TargetValue: 70.0 + ScaleInCooldown: 60 + ScaleOutCooldown: 10 + PredefinedMetricSpecification: + PredefinedMetricType: DynamoDBReadCapacityUtilization From 8e9563ba730d42420921bfb4ba6a02a95fb2f656 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Thu, 23 Nov 2023 11:01:38 +0000 Subject: [PATCH 4/5] Add comment to add clarity around the units for scale in/out cooldown --- mobile-save-for-later/conf/cfn.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mobile-save-for-later/conf/cfn.yaml b/mobile-save-for-later/conf/cfn.yaml index e19935d2..9764bcce 100644 --- a/mobile-save-for-later/conf/cfn.yaml +++ b/mobile-save-for-later/conf/cfn.yaml @@ -61,8 +61,8 @@ Resources: ScalingTargetId: !Ref SaveForLaterWritesScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 70.0 - ScaleInCooldown: 60 - ScaleOutCooldown: 10 + ScaleInCooldown: 60 # seconds + ScaleOutCooldown: 10 # seconds PredefinedMetricSpecification: PredefinedMetricType: DynamoDBWriteCapacityUtilization @@ -84,7 +84,7 @@ Resources: ScalingTargetId: !Ref SaveForLaterReadsScalableTarget TargetTrackingScalingPolicyConfiguration: TargetValue: 70.0 - ScaleInCooldown: 60 - ScaleOutCooldown: 10 + ScaleInCooldown: 60 # seconds + ScaleOutCooldown: 10 # seconds PredefinedMetricSpecification: PredefinedMetricType: DynamoDBReadCapacityUtilization From cf70a8eb85c5e3bd475549fce0a53540e4c2e380 Mon Sep 17 00:00:00 2001 From: Michael Davis Date: Thu, 23 Nov 2023 11:08:35 +0000 Subject: [PATCH 5/5] Second comment to explain target percentage of consumed throughput --- mobile-save-for-later/conf/cfn.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile-save-for-later/conf/cfn.yaml b/mobile-save-for-later/conf/cfn.yaml index 9764bcce..86d3f9bd 100644 --- a/mobile-save-for-later/conf/cfn.yaml +++ b/mobile-save-for-later/conf/cfn.yaml @@ -60,7 +60,7 @@ Resources: PolicyType: TargetTrackingScaling ScalingTargetId: !Ref SaveForLaterWritesScalableTarget TargetTrackingScalingPolicyConfiguration: - TargetValue: 70.0 + TargetValue: 70.0 # Target percentage of consumed throughput ScaleInCooldown: 60 # seconds ScaleOutCooldown: 10 # seconds PredefinedMetricSpecification: @@ -83,7 +83,7 @@ Resources: PolicyType: TargetTrackingScaling ScalingTargetId: !Ref SaveForLaterReadsScalableTarget TargetTrackingScalingPolicyConfiguration: - TargetValue: 70.0 + TargetValue: 70.0 # Target percentage of consumed throughput ScaleInCooldown: 60 # seconds ScaleOutCooldown: 10 # seconds PredefinedMetricSpecification: