Skip to content

Commit

Permalink
Merge pull request #30 from cfln123/patch-2
Browse files Browse the repository at this point in the history
Auto scaling replica
  • Loading branch information
aaronwalker authored Jun 12, 2024
2 parents de391df + 9a5db6c commit ee3ff73
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 1 deletion.
5 changes: 5 additions & 0 deletions aurora-mysql.cfhighlander.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
CfhighlanderTemplate do
Name 'aurora-mysql'
DependsOn 'vpc'
DependsOn 'lib-iam'

Parameters do
ComponentParam 'EnvironmentName', 'dev', isGlobal: true
Expand All @@ -9,6 +10,8 @@
ComponentParam 'NetworkPrefix', '10', isGlobal: true
ComponentParam 'DnsDomain'
ComponentParam 'SnapshotID'
ComponentParam 'ScalableTargetMinCapacity'
ComponentParam 'ScalableTargetMaxCapacity'

if engine_mode == 'provisioned'
ComponentParam 'WriterInstanceType'
Expand All @@ -30,5 +33,7 @@
ComponentParam 'PerformanceInsightsRetentionPeriod', defined?(performance_insights) && defined?(insights_retention) ? insights_retention.to_i : 7

ComponentParam 'NamespaceId' if defined? service_discovery

ComponentParam 'EnableReplicaAutoScaling', 'false', isGlobal: true
end
end
75 changes: 74 additions & 1 deletion aurora-mysql.cfndsl.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
Condition("UseUsernameAndPassword", FnEquals(Ref(:SnapshotID), ''))
Condition("UseSnapshotID", FnNot(FnEquals(Ref(:SnapshotID), '')))
Condition("EnablePerformanceInsights", FnEquals(Ref(:EnablePerformanceInsights), 'true'))

Condition("EnableReplicaAutoScaling", FnAnd([FnEquals(Ref(:EnableReplicaAutoScaling), 'true'), FnEquals(Ref(:EnableReader), 'true')]))

tags = []
tags << { Key: 'Environment', Value: Ref(:EnvironmentName) }
Expand Down Expand Up @@ -195,4 +195,77 @@
Export FnSub("${EnvironmentName}-#{external_parameters[:component_name]}-dbcluster-id")
}

IAM_Role(:RDSReplicaAutoScaleRole) do
DependsOn [:DBCluster,:DBClusterInstanceReader]
Condition 'EnableReplicaAutoScaling'
AssumeRolePolicyDocument service_assume_role_policy('application-autoscaling')
Path '/'
Policies ([
PolicyName: FnSub("${EnvironmentName}-rds-replica-scaling"),
PolicyDocument: {
Statement: [
{
Effect: "Allow",
Action: "iam:CreateServiceLinkedRole",
Resource: FnSub("arn:aws:iam::${AWS::AccountId}:role/aws-service-role/rds.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_RDSCluster"),
Condition: ({
StringLike: {
"iam:AWSServiceName":"rds.application-autoscaling.amazonaws.com"
}
})
},
{
Effect: "Allow",
Action: ['cloudwatch:DescribeAlarms','cloudwatch:PutMetricAlarm','cloudwatch:DeleteAlarms'],
Resource: "*"
}
]
}])
end

scaling_policy = external_parameters.fetch(:scaling_policy, {})

if scaling_policy['up'].kind_of?(Hash)
scaling_policy['up'] = [scaling_policy['up']]
end

if scaling_policy['down'].kind_of?(Hash)
scaling_policy['down'] = [scaling_policy['down']]
end

if scaling_policy['target'].kind_of?(Hash)
scaling_policy['target'] = [scaling_policy['target']]
end

ApplicationAutoScaling_ScalableTarget(:ServiceScalingTarget) do
DependsOn 'RDSReplicaAutoScaleRole'
Condition 'EnableReplicaAutoScaling'
MaxCapacity Ref(:ScalableTargetMaxCapacity)
MinCapacity Ref(:ScalableTargetMinCapacity)
ResourceId FnJoin(':',["cluster",Ref(:DBCluster)])
RoleARN FnGetAtt(:RDSReplicaAutoScaleRole,:Arn)
ScalableDimension "rds:cluster:ReadReplicaCount"
ServiceNamespace "rds"
end

scaling_policy['target'].each_with_index do |scale_target_policy, i|
logical_scaling_policy_name = "ServiceTargetTrackingPolicy" + (i > 0 ? "#{i+1}" : "")
policy_name = "target-tracking-policy" + (i > 0 ? "-#{i+1}" : "")
ApplicationAutoScaling_ScalingPolicy(logical_scaling_policy_name) do
DependsOn 'ServiceScalingTarget'
Condition 'EnableReplicaAutoScaling'
PolicyName FnJoin('-', [ Ref('EnvironmentName'), component_name, policy_name])
PolicyType 'TargetTrackingScaling'
ScalingTargetId Ref(:ServiceScalingTarget)
TargetTrackingScalingPolicyConfiguration({
TargetValue: scale_target_policy['target_value'],
ScaleInCooldown: scale_target_policy['scale_in_cooldown'].to_s,
ScaleOutCooldown: scale_target_policy['scale_out_cooldown'].to_s,
PredefinedMetricSpecification: {
PredefinedMetricType: scale_target_policy['metric_type'] || 'RDSReaderAverageCPUUtilization'
}
})
end
end unless scaling_policy['target'].nil?

end
15 changes: 15 additions & 0 deletions tests/replica-scaling.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
test_metadata:
type: config
name: replica scaling
description: replica scaling

scaling_policy:
target:
- metric_type: RDSReaderAverageCPUUtilization
scale_in_cooldown: 180
scale_out_cooldown: 60
target_value: 70
- metric_type: RDSReaderAverageDatabaseConnections
scale_in_cooldown: 180
scale_out_cooldown: 60
target_value: 500

0 comments on commit ee3ff73

Please sign in to comment.