mirror of
https://github.com/ebosas/microservices.git
synced 2025-02-16 18:34:37 +02:00
238 lines
7.2 KiB
YAML
238 lines
7.2 KiB
YAML
AWSTemplateFormatVersion: '2010-09-09'
|
|
Description: Deploy a service into an ECS cluster behind a public load balancer.
|
|
Parameters:
|
|
EnvironmentName:
|
|
Type: String
|
|
Default: production
|
|
Description: The name of the environment to add this service to
|
|
ServiceName:
|
|
Type: String
|
|
Default: cache
|
|
Description: A name for the service
|
|
ImageUrl:
|
|
Type: String
|
|
Description: The url of a docker image that contains the application process that
|
|
will handle the traffic for this service
|
|
ContainerCpu:
|
|
Type: Number
|
|
Default: 256
|
|
Description: How much CPU to give the container. 1024 is 1 CPU
|
|
ContainerMemory:
|
|
Type: Number
|
|
Default: 230
|
|
Description: How much memory in megabytes to give the container
|
|
DesiredCount:
|
|
Type: Number
|
|
Default: 1
|
|
Description: How many copies of the service task to run
|
|
Role:
|
|
Type: String
|
|
Default: ""
|
|
Description: (Optional) An IAM role to give the service's containers if the code within needs to
|
|
access other AWS resources like S3 buckets, DynamoDB tables, etc
|
|
|
|
Conditions:
|
|
HasCustomRole: !Not [ !Equals [!Ref 'Role', ''] ]
|
|
|
|
Resources:
|
|
# A log group for storing the stdout logs from this service's containers
|
|
LogGroup:
|
|
Type: AWS::Logs::LogGroup
|
|
Properties:
|
|
LogGroupName: !Sub ${EnvironmentName}-service-${ServiceName}
|
|
|
|
# The task definition. This is a simple metadata description of what
|
|
# container to run, and what resource requirements it has.
|
|
TaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'ServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'ServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
# Image: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/microservices/${ServiceName}:latest
|
|
Image: !Ref ImageUrl
|
|
LogConfiguration:
|
|
LogDriver: 'awslogs'
|
|
Options:
|
|
awslogs-group: !Sub ${EnvironmentName}-service-${ServiceName}
|
|
awslogs-region: !Ref 'AWS::Region'
|
|
awslogs-stream-prefix: !Ref 'ServiceName'
|
|
Environment:
|
|
- Name: RABBIT_URL
|
|
Value: '{{resolve:ssm:/Microservices/RabbitUrl}}'
|
|
- Name: REDIS_URL
|
|
Value: '{{resolve:ssm:/Microservices/RedisUrl}}'
|
|
|
|
# The service. The service is a resource which allows you to run multiple
|
|
# copies of a type of task, and gather up their logs and metrics, as well
|
|
# as monitor the number of running tasks and replace any that have crashed
|
|
Service:
|
|
Type: AWS::ECS::Service
|
|
Properties:
|
|
ServiceName: !Ref 'ServiceName'
|
|
Cluster:
|
|
Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
DeploymentConfiguration:
|
|
MaximumPercent: 200
|
|
MinimumHealthyPercent: 75
|
|
DesiredCount: !Ref 'DesiredCount'
|
|
TaskDefinition: !Ref 'TaskDefinition'
|
|
PlacementStrategies:
|
|
- Field: memory
|
|
Type: binpack
|
|
|
|
# Enable autoscaling for this service
|
|
ScalableTarget:
|
|
Type: AWS::ApplicationAutoScaling::ScalableTarget
|
|
DependsOn: Service
|
|
Properties:
|
|
ServiceNamespace: 'ecs'
|
|
ScalableDimension: 'ecs:service:DesiredCount'
|
|
ResourceId:
|
|
Fn::Join:
|
|
- '/'
|
|
- - service
|
|
- Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
- !Ref 'ServiceName'
|
|
MinCapacity: 1
|
|
MaxCapacity: 10
|
|
RoleARN:
|
|
Fn::ImportValue: !Sub ${EnvironmentName}:AutoscalingRole
|
|
|
|
# Create scaling policies for the service
|
|
ScaleDownPolicy:
|
|
Type: AWS::ApplicationAutoScaling::ScalingPolicy
|
|
DependsOn: ScalableTarget
|
|
Properties:
|
|
PolicyName:
|
|
Fn::Join:
|
|
- '/'
|
|
- - scale
|
|
- !Ref 'EnvironmentName'
|
|
- !Ref 'ServiceName'
|
|
- down
|
|
PolicyType: StepScaling
|
|
ResourceId:
|
|
Fn::Join:
|
|
- '/'
|
|
- - service
|
|
- Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
- !Ref 'ServiceName'
|
|
ScalableDimension: 'ecs:service:DesiredCount'
|
|
ServiceNamespace: 'ecs'
|
|
StepScalingPolicyConfiguration:
|
|
AdjustmentType: 'ChangeInCapacity'
|
|
StepAdjustments:
|
|
- MetricIntervalUpperBound: 0
|
|
ScalingAdjustment: -1
|
|
MetricAggregationType: 'Average'
|
|
Cooldown: 60
|
|
|
|
ScaleUpPolicy:
|
|
Type: AWS::ApplicationAutoScaling::ScalingPolicy
|
|
DependsOn: ScalableTarget
|
|
Properties:
|
|
PolicyName:
|
|
Fn::Join:
|
|
- '/'
|
|
- - scale
|
|
- !Ref 'EnvironmentName'
|
|
- !Ref 'ServiceName'
|
|
- up
|
|
PolicyType: StepScaling
|
|
ResourceId:
|
|
Fn::Join:
|
|
- '/'
|
|
- - service
|
|
- Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
- !Ref 'ServiceName'
|
|
ScalableDimension: 'ecs:service:DesiredCount'
|
|
ServiceNamespace: 'ecs'
|
|
StepScalingPolicyConfiguration:
|
|
AdjustmentType: 'ChangeInCapacity'
|
|
StepAdjustments:
|
|
- MetricIntervalLowerBound: 0
|
|
MetricIntervalUpperBound: 15
|
|
ScalingAdjustment: 1
|
|
- MetricIntervalLowerBound: 15
|
|
MetricIntervalUpperBound: 25
|
|
ScalingAdjustment: 2
|
|
- MetricIntervalLowerBound: 25
|
|
ScalingAdjustment: 3
|
|
MetricAggregationType: 'Average'
|
|
Cooldown: 60
|
|
|
|
# Create alarms to trigger these policies
|
|
LowCpuUsageAlarm:
|
|
Type: AWS::CloudWatch::Alarm
|
|
Properties:
|
|
AlarmName:
|
|
Fn::Join:
|
|
- '-'
|
|
- - low-cpu
|
|
- !Ref 'EnvironmentName'
|
|
- !Ref 'ServiceName'
|
|
AlarmDescription:
|
|
Fn::Join:
|
|
- ' '
|
|
- - "Low CPU utilization for service"
|
|
- !Ref 'ServiceName'
|
|
- "in environment"
|
|
- !Ref 'EnvironmentName'
|
|
MetricName: CPUUtilization
|
|
Namespace: AWS/ECS
|
|
Dimensions:
|
|
- Name: ServiceName
|
|
Value: !Ref 'ServiceName'
|
|
- Name: ClusterName
|
|
Value:
|
|
Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
Statistic: Average
|
|
Period: 60
|
|
EvaluationPeriods: 1
|
|
Threshold: 20
|
|
ComparisonOperator: LessThanOrEqualToThreshold
|
|
AlarmActions:
|
|
- !Ref ScaleDownPolicy
|
|
|
|
HighCpuUsageAlarm:
|
|
Type: AWS::CloudWatch::Alarm
|
|
Properties:
|
|
AlarmName:
|
|
Fn::Join:
|
|
- '-'
|
|
- - high-cpu
|
|
- !Ref 'EnvironmentName'
|
|
- !Ref 'ServiceName'
|
|
AlarmDescription:
|
|
Fn::Join:
|
|
- ' '
|
|
- - "High CPU utilization for service"
|
|
- !Ref 'ServiceName'
|
|
- "in environment"
|
|
- !Ref 'EnvironmentName'
|
|
MetricName: CPUUtilization
|
|
Namespace: AWS/ECS
|
|
Dimensions:
|
|
- Name: ServiceName
|
|
Value: !Ref 'ServiceName'
|
|
- Name: ClusterName
|
|
Value:
|
|
Fn::ImportValue: !Sub ${EnvironmentName}:ClusterName
|
|
Statistic: Average
|
|
Period: 60
|
|
EvaluationPeriods: 1
|
|
Threshold: 70
|
|
ComparisonOperator: GreaterThanOrEqualToThreshold
|
|
AlarmActions:
|
|
- !Ref ScaleUpPolicy
|