165 lines
5.4 KiB
YAML
165 lines
5.4 KiB
YAML
AWSTemplateFormatVersion: '2010-09-09'
|
|
Description: Deploy a service on AWS Fargate, hosted in two public subnets and accessible via a public load balancer.
|
|
Derived from a template at https://github.com/nathanpeck/aws-cloudformation-fargate.
|
|
Parameters:
|
|
NetworkStackName:
|
|
Type: String
|
|
Description: The name of the networking stack that
|
|
these resources are put into.
|
|
DatabaseStackName:
|
|
Type: String
|
|
Description: The name of the database stack with the database this service should connect to.
|
|
ServiceName:
|
|
Type: String
|
|
Description: A human-readable name for the service.
|
|
HealthCheckPath:
|
|
Type: String
|
|
Default: /health
|
|
Description: Path to perform the healthcheck on each instance.
|
|
HealthCheckIntervalSeconds:
|
|
Type: Number
|
|
Default: 5
|
|
Description: Number of seconds to wait between each health check.
|
|
ImageUrl:
|
|
Type: String
|
|
Description: The url of a docker image that will handle incoming traffic.
|
|
ContainerPort:
|
|
Type: Number
|
|
Default: 80
|
|
Description: The 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.
|
|
DesiredCount:
|
|
Type: Number
|
|
Default: 2
|
|
Description: How many copies of the service task to run.
|
|
|
|
Resources:
|
|
|
|
TargetGroup:
|
|
Type: AWS::ElasticLoadBalancingV2::TargetGroup
|
|
Properties:
|
|
HealthCheckIntervalSeconds: !Ref 'HealthCheckIntervalSeconds'
|
|
HealthCheckPath: !Ref 'HealthCheckPath'
|
|
HealthCheckProtocol: HTTP
|
|
HealthCheckTimeoutSeconds: 5
|
|
HealthyThresholdCount: 2
|
|
TargetType: ip
|
|
Name: !Ref 'ServiceName'
|
|
Port: !Ref 'ContainerPort'
|
|
Protocol: HTTP
|
|
UnhealthyThresholdCount: 2
|
|
VpcId:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'VPCId']]
|
|
|
|
LoadBalancerRule:
|
|
Type: AWS::ElasticLoadBalancingV2::ListenerRule
|
|
Properties:
|
|
Actions:
|
|
- TargetGroupArn: !Ref 'TargetGroup'
|
|
Type: 'forward'
|
|
Conditions:
|
|
- Field: path-pattern
|
|
Values: [!Ref 'Path']
|
|
ListenerArn:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'PublicListener']]
|
|
Priority: 1
|
|
|
|
LogGroup:
|
|
Type: AWS::Logs::LogGroup
|
|
Properties:
|
|
LogGroupName: !Ref 'ServiceName'
|
|
RetentionInDays: 1
|
|
|
|
TaskDefinition:
|
|
Type: AWS::ECS::TaskDefinition
|
|
Properties:
|
|
Family: !Ref 'ServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
NetworkMode: awsvpc
|
|
RequiresCompatibilities:
|
|
- FARGATE
|
|
ExecutionRoleArn:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'ECSTaskExecutionRole']]
|
|
ContainerDefinitions:
|
|
- Name: !Ref 'ServiceName'
|
|
Cpu: !Ref 'ContainerCpu'
|
|
Memory: !Ref 'ContainerMemory'
|
|
Image: !Ref 'ImageUrl'
|
|
Environment:
|
|
- Name: SPRING_DATASOURCE_URL
|
|
Value: !Join
|
|
- ''
|
|
- - 'jdbc:postgresql://'
|
|
- Fn::ImportValue: !Join [':', [!Ref 'DatabaseStackName', 'EndpointAddress']]
|
|
- ':'
|
|
- Fn::ImportValue: !Join [':', [!Ref 'DatabaseStackName', 'EndpointPort']]
|
|
- '/'
|
|
- Fn::ImportValue: !Join [':', [!Ref 'DatabaseStackName', 'DBName']]
|
|
- Name: SPRING_DATASOURCE_USERNAME
|
|
Value: !Join
|
|
- ''
|
|
- - '{{resolve:secretsmanager:'
|
|
- Fn::ImportValue: !Join [':', [!Ref 'DatabaseStackName', 'Secret']]
|
|
- ':SecretString:username}}'
|
|
- Name: SPRING_DATASOURCE_PASSWORD
|
|
Value: !Join
|
|
- ''
|
|
- - '{{resolve:secretsmanager:'
|
|
- Fn::ImportValue: !Join [':', [!Ref 'DatabaseStackName', 'Secret']]
|
|
- ':SecretString:password}}'
|
|
PortMappings:
|
|
- ContainerPort: !Ref 'ContainerPort'
|
|
LogConfiguration:
|
|
LogDriver: 'awslogs'
|
|
Options:
|
|
awslogs-group: !Ref 'ServiceName'
|
|
awslogs-region: !Ref AWS::Region
|
|
awslogs-stream-prefix: !Ref 'ServiceName'
|
|
|
|
Service:
|
|
Type: AWS::ECS::Service
|
|
DependsOn: LoadBalancerRule
|
|
Properties:
|
|
ServiceName: !Ref 'ServiceName'
|
|
Cluster:
|
|
Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'ClusterName']]
|
|
LaunchType: FARGATE
|
|
DeploymentConfiguration:
|
|
MaximumPercent: 200
|
|
MinimumHealthyPercent: 50
|
|
DesiredCount: !Ref 'DesiredCount'
|
|
NetworkConfiguration:
|
|
AwsvpcConfiguration:
|
|
AssignPublicIp: ENABLED
|
|
SecurityGroups:
|
|
- Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'ECSSecurityGroup']]
|
|
Subnets:
|
|
- Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'PublicSubnetOne']]
|
|
- Fn::ImportValue:
|
|
!Join [':', [!Ref 'NetworkStackName', 'PublicSubnetTwo']]
|
|
TaskDefinition: !Ref 'TaskDefinition'
|
|
LoadBalancers:
|
|
- ContainerName: !Ref 'ServiceName'
|
|
ContainerPort: !Ref 'ContainerPort'
|
|
TargetGroupArn: !Ref 'TargetGroup'
|