diff --git a/aws-ecs-ec2/services.yaml b/aws-ecs-ec2/services.yaml new file mode 100644 index 0000000..c352e66 --- /dev/null +++ b/aws-ecs-ec2/services.yaml @@ -0,0 +1,160 @@ +AWSTemplateFormatVersion: '2010-09-09' +Description: Deploy robot shop services to a given ECS cluster +Parameters: + StackName: + Type: String + Default: production + 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 + 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 + 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' + + 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' diff --git a/aws-ecs-fargate/README.md b/aws-ecs-fargate/README.md new file mode 100644 index 0000000..af1342b --- /dev/null +++ b/aws-ecs-fargate/README.md @@ -0,0 +1,8 @@ +# Robot-Shop on AWS ECS with Fargate + +## Prerequisites + +The `ecs-cli` tool has to be on your `$PATH`. + +[Read more on installing it](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ECS_CLI_installation.html) +