449 lines
13 KiB
YAML
449 lines
13 KiB
YAML
AWSTemplateFormatVersion: '2010-09-09'
|
|
Description: Deploy robot shop services to a given ECS cluster
|
|
Parameters:
|
|
StackName:
|
|
Type: String
|
|
Default: ecs-ec2-robotshop
|
|
Description: The name of the parent cluster stack that you created. Necessary
|
|
to locate and reference resources created by that stack.
|
|
WebServiceName:
|
|
Type: String
|
|
Default: web
|
|
Description: The web service name
|
|
MongoDbServiceName:
|
|
Type: String
|
|
Default: mongodb
|
|
Description: The mongodb service name
|
|
RedisServiceName:
|
|
Type: String
|
|
Default: redis
|
|
Description: The redis service name
|
|
RabbitMqServiceName:
|
|
Type: String
|
|
Default: rabbitmq
|
|
Description: The rabbitmq service name
|
|
CatalogueServiceName:
|
|
Type: String
|
|
Default: catalogue
|
|
Description: The catalogue service name
|
|
UserServiceName:
|
|
Type: String
|
|
Default: user
|
|
Description: The user service name
|
|
CartServiceName:
|
|
Type: String
|
|
Default: cart
|
|
Description: The cart service name
|
|
MySqlServiceName:
|
|
Type: String
|
|
Default: mysql
|
|
Description: The cart service name
|
|
ShippingServiceName:
|
|
Type: String
|
|
Default: shipping
|
|
Description: The cart service name
|
|
ImageUrl:
|
|
Type: String
|
|
Default: nginx
|
|
Description: The url of a docker image that contains the application process that
|
|
will handle the traffic for this service
|
|
ContainerPort:
|
|
Type: Number
|
|
Default: 8080
|
|
Description: What port number the application inside the docker container is binding to
|
|
MongoDbContainerPort:
|
|
Type: Number
|
|
Default: 27017
|
|
Description: What port number the application inside the docker container is binding to
|
|
RedisContainerPort:
|
|
Type: Number
|
|
Default: 6379
|
|
Description: What port number the application inside the docker container is binding to
|
|
RabbitMqContainerPort:
|
|
Type: Number
|
|
Default: 5672
|
|
Description: What port number the application inside the docker container is binding to
|
|
CatalogueContainerPort:
|
|
Type: Number
|
|
Default: 8080
|
|
Description: What port number the application inside the docker container is binding to
|
|
UserContainerPort:
|
|
Type: Number
|
|
Default: 8080
|
|
Description: What port number the application inside the docker container is binding to
|
|
CartContainerPort:
|
|
Type: Number
|
|
Default: 8080
|
|
Description: What port number the application inside the docker container is binding to
|
|
MySqlContainerPort:
|
|
Type: Number
|
|
Default: 3306
|
|
Description: What port number the application inside the docker container is binding to
|
|
ShippingContainerPort:
|
|
Type: Number
|
|
Default: 8080
|
|
Description: What port number the application inside the docker container is binding to
|
|
ContainerCpu:
|
|
Type: Number
|
|
Default: 256
|
|
Description: How much CPU to give the container. 1024 is 1 CPU
|
|
ContainerMemory:
|
|
Type: Number
|
|
Default: 512
|
|
Description: How much memory in megabytes to give the container
|
|
Path:
|
|
Type: String
|
|
Default: "*"
|
|
Description: A path on the public load balancer that this service
|
|
should be connected to. Use * to send all load balancer
|
|
traffic to this service.
|
|
Priority:
|
|
Type: Number
|
|
Default: 1
|
|
Description: The priority for the routing rule added to the load balancer.
|
|
This only applies if your have multiple services which have been
|
|
assigned to different paths on the load balancer.
|
|
DesiredCount:
|
|
Type: Number
|
|
Default: 2
|
|
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:
|
|
# MongoDB service
|
|
MongoDbTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'MongoDbServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'MongoDbServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-mongodb
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'MongoDbContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
MongoDbService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'MongoDbServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'MongoDbTaskDefinition'
|
|
|
|
# Redis service
|
|
RedisTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'RedisServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'RedisServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: redis:4.0.6
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'RedisContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
RedisService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'RedisServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'RedisTaskDefinition'
|
|
|
|
# rabbitmq service
|
|
RabbitMqTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'RabbitMqServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'RabbitMqServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: rabbitmq:3.7-management-alpine
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'RabbitMqContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
RabbitMqService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'RabbitMqServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'RabbitMqTaskDefinition'
|
|
|
|
# catalogue service
|
|
CatalogueTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
DependsOn: ['MongoDbService']
|
|
Properties:
|
|
Family: !Ref 'CatalogueServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'CatalogueServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-catalogue
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'CatalogueContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
CatalogueService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'CatalogueServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'CatalogueTaskDefinition'
|
|
|
|
# user service
|
|
UserTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
DependsOn: ['MongoDbService', 'RedisService']
|
|
Properties:
|
|
Family: !Ref 'UserServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'UserServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-user
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'UserContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
UserService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'UserServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'UserTaskDefinition'
|
|
|
|
# cart service
|
|
CartTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
DependsOn: ['RedisService']
|
|
Properties:
|
|
Family: !Ref 'CartServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'CartServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-cart
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'CartContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
CartService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'CartServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'CartTaskDefinition'
|
|
|
|
# mysql service
|
|
MySqlTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'MySqlServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'MySqlServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
LinuxParameters:
|
|
Capabilities:
|
|
Add:
|
|
- NET_ADMIN
|
|
Image: robotshop/rs-mysql-db
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'MySqlContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
MySqlService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'MySqlServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'MySqlTaskDefinition'
|
|
|
|
# shipping service
|
|
ShippingTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
DependsOn: ['MySqlService']
|
|
Properties:
|
|
Family: !Ref 'ShippingServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'ShippingServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-shipping
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'ShippingContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
ShippingService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'ShippingServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DesiredCount: 1
|
|
TaskDefinition: !Ref 'ShippingTaskDefinition'
|
|
|
|
WebTaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'WebServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
TaskRoleArn:
|
|
Fn::If:
|
|
- 'HasCustomRole'
|
|
- !Ref 'Role'
|
|
- !Ref "AWS::NoValue"
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'WebServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: robotshop/rs-web
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'ContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: json-file
|
|
WebService:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'WebServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'ClusterName']]
|
|
DeploymentConfiguration:
|
|
MaximumPercent: 200
|
|
MinimumHealthyPercent: 75
|
|
DesiredCount: !Ref 'DesiredCount'
|
|
TaskDefinition: !Ref 'WebTaskDefinition'
|
|
LoadBalancers:
|
|
- ContainerName: !Ref 'WebServiceName'
|
|
ContainerPort: !Ref 'ContainerPort'
|
|
TargetGroupArn: !Ref 'WebTargetGroup'
|
|
WebTargetGroup:
|
|
Type: AWS::ElasticLoadBalancingV2::TargetGroup
|
|
Properties:
|
|
HealthCheckIntervalSeconds: 6
|
|
HealthCheckPath: /
|
|
HealthCheckProtocol: HTTP
|
|
HealthCheckTimeoutSeconds: 5
|
|
HealthyThresholdCount: 2
|
|
Name: !Ref 'WebServiceName'
|
|
Port: 8080
|
|
Protocol: HTTP
|
|
UnhealthyThresholdCount: 2
|
|
VpcId:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'VPCId']]
|
|
LoadBalancerRule:
|
|
Type: AWS::ElasticLoadBalancingV2::ListenerRule
|
|
Properties:
|
|
Actions:
|
|
- TargetGroupArn: !Ref 'WebTargetGroup'
|
|
Type: 'forward'
|
|
Conditions:
|
|
- Field: path-pattern
|
|
Values: [!Ref 'Path']
|
|
ListenerArn:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'StackName', 'PrivateListener']]
|
|
Priority: !Ref 'Priority'
|