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..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,12 +6,16 @@ Object { "Mappings": Object { "StageVariables": Object { "CODE": Object { - "TableReadCapacity": 1, - "TableWriteCapacity": 1, + "TableReadMaxCapacity": 10, + "TableReadMinCapacity": 1, + "TableWriteMaxCapacity": 10, + "TableWriteMinCapacity": 1, }, "PROD": Object { - "TableReadCapacity": 200, - "TableWriteCapacity": 125, + "TableReadMaxCapacity": 400, + "TableReadMinCapacity": 50, + "TableWriteMaxCapacity": 400, + "TableWriteMinCapacity": 50, }, }, }, @@ -572,7 +576,7 @@ Object { Object { "Ref": "Stage", }, - "TableReadCapacity", + "TableReadMinCapacity", ], }, "WriteCapacityUnits": Object { @@ -581,7 +585,7 @@ Object { Object { "Ref": "Stage", }, - "TableWriteCapacity", + "TableWriteMinCapacity", ], }, }, @@ -609,6 +613,104 @@ 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 { + "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", @@ -1079,12 +1181,16 @@ Object { "Mappings": Object { "StageVariables": Object { "CODE": Object { - "TableReadCapacity": 1, - "TableWriteCapacity": 1, + "TableReadMaxCapacity": 10, + "TableReadMinCapacity": 1, + "TableWriteMaxCapacity": 10, + "TableWriteMinCapacity": 1, }, "PROD": Object { - "TableReadCapacity": 200, - "TableWriteCapacity": 125, + "TableReadMaxCapacity": 400, + "TableReadMinCapacity": 50, + "TableWriteMaxCapacity": 400, + "TableWriteMinCapacity": 50, }, }, }, @@ -1718,7 +1824,7 @@ Object { Object { "Ref": "Stage", }, - "TableReadCapacity", + "TableReadMinCapacity", ], }, "WriteCapacityUnits": Object { @@ -1727,7 +1833,7 @@ Object { Object { "Ref": "Stage", }, - "TableWriteCapacity", + "TableWriteMinCapacity", ], }, }, @@ -1755,6 +1861,104 @@ 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 { + "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", diff --git a/mobile-save-for-later/conf/cfn.yaml b/mobile-save-for-later/conf/cfn.yaml index 5a7f03df..86d3f9bd 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,78 @@ Parameters: AllowedValues: - CODE - PROD + Mappings: StageVariables: CODE: - TableReadCapacity: 1 - TableWriteCapacity: 1 + TableReadMinCapacity: 1 + TableReadMaxCapacity: 10 + TableWriteMinCapacity: 1 + TableWriteMaxCapacity: 10 PROD: - TableReadCapacity: 200 - TableWriteCapacity: 125 + TableReadMinCapacity: 50 + TableReadMaxCapacity: 400 + TableWriteMinCapacity: 50 + 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, TableReadMinCapacity ] # Initial value, autoscaled with below resources + + 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 # Target percentage of consumed throughput + ScaleInCooldown: 60 # seconds + ScaleOutCooldown: 10 # seconds + 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 # Target percentage of consumed throughput + ScaleInCooldown: 60 # seconds + ScaleOutCooldown: 10 # seconds + PredefinedMetricSpecification: + PredefinedMetricType: DynamoDBReadCapacityUtilization