AWSTemplateFormatVersion: '2010-09-09' Description: catsndogs.lol workshop lab2. Deploys ECS Tasks and services to the cluster. Parameters: LabSetupStackName: Type: String Description: "Name of the stack created at the very start of the workshop" Default: catsndogssetup ECSCluster: Type: String Description: "Name of the ECS cluster you created earlier" Default: catsndogsECScluster DogTag: Type: String Description: "DO NOT CHANGE. Image tag for the dogs container" Default: v1 ImageRepo: Type: String Description: "DO NOT CHANGE. URI of the central catsndogs ECR repo. This is used in later labs" Default: 205094881157.dkr.ecr.us-west-2.amazonaws.com Resources: CatsTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: 'cats' ContainerDefinitions: - Name: 'cats' Cpu: '50' Image: 205094881157.dkr.ecr.us-west-2.amazonaws.com/cats:v1 Memory: 1024 MemoryReservation: 384 Essential: true PortMappings: - ContainerPort: 80 Environment: - Name: Tag Value: 'v1' DogsTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: 'dogs' ContainerDefinitions: - Name: 'dogs' Cpu: '50' Image: !Sub ${ImageRepo}/dogs:${DogTag} Memory: 1024 MemoryReservation: 384 Essential: true PortMappings: - ContainerPort: 80 Environment: - Name: Tag Value: 'v1' SimpleHomePageTaskDefinition: Type: AWS::ECS::TaskDefinition Properties: Family: 'simplehomepage' ContainerDefinitions: - Name: 'simplehomepage' Cpu: '50' Image: 205094881157.dkr.ecr.us-west-2.amazonaws.com/simplehomepage:latest Memory: 300 MemoryReservation: 256 Essential: true PortMappings: - ContainerPort: 80 Environment: - Name: Tag Value: 'latest' CatsServiceDefinition: Type: AWS::ECS::Service DependsOn: CatsListenerRule Properties: Cluster: !Ref ECSCluster Role: Fn::ImportValue: !Sub "${LabSetupStackName}-ECSServiceRole" DesiredCount: 2 TaskDefinition: !Ref CatsTaskDefinition LoadBalancers: - ContainerName: 'cats' ContainerPort: 80 TargetGroupArn: !Ref CatsALBTargetGroup DogsServiceDefinition: DependsOn: DogsListenerRule Type: AWS::ECS::Service Properties: Cluster: !Ref ECSCluster Role: Fn::ImportValue: !Sub "${LabSetupStackName}-ECSServiceRole" DesiredCount: 2 TaskDefinition: !Ref DogsTaskDefinition LoadBalancers: - ContainerName: 'dogs' ContainerPort: 80 TargetGroupArn: !Ref DogsALBTargetGroup SimpleHomePageServiceDefinition: Type: AWS::ECS::Service DependsOn: LoadBalancerListener Properties: Cluster: !Ref ECSCluster Role: Fn::ImportValue: !Sub "${LabSetupStackName}-ECSServiceRole" DesiredCount: 2 TaskDefinition: !Ref SimpleHomePageTaskDefinition LoadBalancers: - ContainerName: 'simplehomepage' ContainerPort: 80 TargetGroupArn: !Ref SimpleHomePageALBTargetGroup CatsScaleDownAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: Scale in containers if ALB RequestCount SUM metric < 100 MetricName: RequestCount Namespace: AWS/ApplicationELB EvaluationPeriods: '2' Period: '60' Statistic: Sum Threshold: '1000' ComparisonOperator: LessThanOrEqualToThreshold Dimensions: - Name: LoadBalancer Value: Fn::ImportValue: !Sub "${LabSetupStackName}-ALBFullName" - Name: TargetGroup Value: !GetAtt [CatsALBTargetGroup, TargetGroupFullName] DogsScaleDownAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: Scale in containers if ALB RequestCount SUM metric < 100 MetricName: RequestCount Namespace: AWS/ApplicationELB EvaluationPeriods: '2' Period: '60' Statistic: Sum Threshold: '1000' ComparisonOperator: LessThanOrEqualToThreshold Dimensions: - Name: LoadBalancer Value: Fn::ImportValue: !Sub "${LabSetupStackName}-ALBFullName" - Name: TargetGroup Value: !GetAtt [DogsALBTargetGroup, TargetGroupFullName] CatsScaleUpAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: Scale out containers if ALB RequestCount SUM metric > 1000 MetricName: RequestCount Namespace: AWS/ApplicationELB EvaluationPeriods: '2' Period: '60' Statistic: Sum Threshold: '1000' ComparisonOperator: GreaterThanOrEqualToThreshold Dimensions: - Name: LoadBalancer Value: Fn::ImportValue: !Sub "${LabSetupStackName}-ALBFullName" - Name: TargetGroup Value: !GetAtt [CatsALBTargetGroup, TargetGroupFullName] DogsScaleUpAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmDescription: Scale out containers if ALB RequestCount SUM metric > 1000 MetricName: RequestCount Namespace: AWS/ApplicationELB EvaluationPeriods: '2' Period: '60' Statistic: Sum Threshold: '1000' ComparisonOperator: GreaterThanOrEqualToThreshold Dimensions: - Name: LoadBalancer Value: Fn::ImportValue: !Sub "${LabSetupStackName}-ALBFullName" - Name: TargetGroup Value: !GetAtt [DogsALBTargetGroup, TargetGroupFullName] CatsALBTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: VpcId: Fn::ImportValue: !Sub "${LabSetupStackName}-Vpc" Port: 80 Protocol: HTTP Matcher: HttpCode: 200-299 HealthCheckIntervalSeconds: 10 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetGroupAttributes: - Key: deregistration_delay.timeout_seconds Value: 30 DogsALBTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: VpcId: Fn::ImportValue: !Sub "${LabSetupStackName}-Vpc" Port: 80 Protocol: HTTP Matcher: HttpCode: 200-299 HealthCheckIntervalSeconds: 10 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetGroupAttributes: - Key: deregistration_delay.timeout_seconds Value: 30 SimpleHomePageALBTargetGroup: Type: AWS::ElasticLoadBalancingV2::TargetGroup Properties: VpcId: Fn::ImportValue: !Sub "${LabSetupStackName}-Vpc" Port: 80 Protocol: HTTP Matcher: HttpCode: 200-299 HealthCheckIntervalSeconds: 10 HealthCheckPath: / HealthCheckProtocol: HTTP HealthCheckTimeoutSeconds: 5 HealthyThresholdCount: 2 TargetGroupAttributes: - Key: deregistration_delay.timeout_seconds Value: 30 CatsListenerRule: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: ListenerArn: !Ref LoadBalancerListener Priority: 1 Conditions: - Field: path-pattern Values: - /cats* Actions: - TargetGroupArn: !Ref CatsALBTargetGroup Type: forward DogsListenerRule: Type: AWS::ElasticLoadBalancingV2::ListenerRule Properties: ListenerArn: !Ref LoadBalancerListener Priority: 2 Conditions: - Field: path-pattern Values: - /dogs* Actions: - TargetGroupArn: !Ref DogsALBTargetGroup Type: forward LoadBalancerListener: Type: AWS::ElasticLoadBalancingV2::Listener Properties: LoadBalancerArn: Fn::ImportValue: !Sub "${LabSetupStackName}-ALBARN" Port: 80 Protocol: HTTP DefaultActions: - Type: forward TargetGroupArn: !Ref SimpleHomePageALBTargetGroup