{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TypeFamilies #-} {-# OPTIONS_GHC -fno-warn-unused-imports #-} {-# OPTIONS_GHC -fno-warn-unused-binds #-} {-# OPTIONS_GHC -fno-warn-unused-matches #-} -- Derived from AWS service descriptions, licensed under Apache 2.0. -- | -- Module : Network.AWS.ECS.CreateService -- Copyright : (c) 2013-2016 Brendan Hay -- License : Mozilla Public License, v. 2.0. -- Maintainer : Brendan Hay -- Stability : auto-generated -- Portability : non-portable (GHC extensions) -- -- Runs and maintains a desired number of tasks from a specified task -- definition. If the number of tasks running in a service drops below -- 'desiredCount', Amazon ECS spawns another instantiation of the task in -- the specified cluster. To update an existing service, see -- < UpdateService>. -- -- You can optionally specify a deployment configuration for your service. -- During a deployment (which is triggered by changing the task definition -- of a service with an < UpdateService> operation), the service scheduler -- uses the 'minimumHealthyPercent' and 'maximumPercent' parameters to -- determine the deployment strategy. -- -- If the 'minimumHealthyPercent' is below 100%, the scheduler can ignore -- the 'desiredCount' temporarily during a deployment. For example, if your -- service has a 'desiredCount' of four tasks, a 'minimumHealthyPercent' of -- 50% allows the scheduler to stop two existing tasks before starting two -- new tasks. Tasks for services that /do not/ use a load balancer are -- considered healthy if they are in the 'RUNNING' state; tasks for -- services that /do/ use a load balancer are considered healthy if they -- are in the 'RUNNING' state and the container instance it is hosted on is -- reported as healthy by the load balancer. The default value for -- 'minimumHealthyPercent' is 50% in the console and 100% for the AWS CLI, -- the AWS SDKs, and the APIs. -- -- The 'maximumPercent' parameter represents an upper limit on the number -- of running tasks during a deployment, which enables you to define the -- deployment batch size. For example, if your service has a 'desiredCount' -- of four tasks, a 'maximumPercent' value of 200% starts four new tasks -- before stopping the four older tasks (provided that the cluster -- resources required to do this are available). The default value for -- 'maximumPercent' is 200%. -- -- When the service scheduler launches new tasks, it attempts to balance -- them across the Availability Zones in your cluster with the following -- logic: -- -- - Determine which of the container instances in your cluster can -- support your service\'s task definition (for example, they have the -- required CPU, memory, ports, and container instance attributes). -- -- - Sort the valid container instances by the fewest number of running -- tasks for this service in the same Availability Zone as the -- instance. For example, if zone A has one running service task and -- zones B and C each have zero, valid container instances in either -- zone B or C are considered optimal for placement. -- -- - Place the new service task on a valid container instance in an -- optimal Availability Zone (based on the previous steps), favoring -- container instances with the fewest number of running tasks for this -- service. -- module Network.AWS.ECS.CreateService ( -- * Creating a Request createService , CreateService -- * Request Lenses , cCluster , cClientToken , cLoadBalancers , cRole , cDeploymentConfiguration , cServiceName , cTaskDefinition , cDesiredCount -- * Destructuring the Response , createServiceResponse , CreateServiceResponse -- * Response Lenses , csrsService , csrsResponseStatus ) where import Network.AWS.ECS.Types import Network.AWS.ECS.Types.Product import Network.AWS.Lens import Network.AWS.Prelude import Network.AWS.Request import Network.AWS.Response -- | /See:/ 'createService' smart constructor. data CreateService = CreateService' { _cCluster :: !(Maybe Text) , _cClientToken :: !(Maybe Text) , _cLoadBalancers :: !(Maybe [LoadBalancer]) , _cRole :: !(Maybe Text) , _cDeploymentConfiguration :: !(Maybe DeploymentConfiguration) , _cServiceName :: !Text , _cTaskDefinition :: !Text , _cDesiredCount :: !Int } deriving (Eq,Read,Show,Data,Typeable,Generic) -- | Creates a value of 'CreateService' with the minimum fields required to make a request. -- -- Use one of the following lenses to modify other fields as desired: -- -- * 'cCluster' -- -- * 'cClientToken' -- -- * 'cLoadBalancers' -- -- * 'cRole' -- -- * 'cDeploymentConfiguration' -- -- * 'cServiceName' -- -- * 'cTaskDefinition' -- -- * 'cDesiredCount' createService :: Text -- ^ 'cServiceName' -> Text -- ^ 'cTaskDefinition' -> Int -- ^ 'cDesiredCount' -> CreateService createService pServiceName_ pTaskDefinition_ pDesiredCount_ = CreateService' { _cCluster = Nothing , _cClientToken = Nothing , _cLoadBalancers = Nothing , _cRole = Nothing , _cDeploymentConfiguration = Nothing , _cServiceName = pServiceName_ , _cTaskDefinition = pTaskDefinition_ , _cDesiredCount = pDesiredCount_ } -- | The short name or full Amazon Resource Name (ARN) of the cluster on -- which to run your service. If you do not specify a cluster, the default -- cluster is assumed. cCluster :: Lens' CreateService (Maybe Text) cCluster = lens _cCluster (\ s a -> s{_cCluster = a}); -- | Unique, case-sensitive identifier you provide to ensure the idempotency -- of the request. Up to 32 ASCII characters are allowed. cClientToken :: Lens' CreateService (Maybe Text) cClientToken = lens _cClientToken (\ s a -> s{_cClientToken = a}); -- | A list of load balancer objects, containing the load balancer name, the -- container name (as it appears in a container definition), and the -- container port to access from the load balancer. cLoadBalancers :: Lens' CreateService [LoadBalancer] cLoadBalancers = lens _cLoadBalancers (\ s a -> s{_cLoadBalancers = a}) . _Default . _Coerce; -- | The name or full Amazon Resource Name (ARN) of the IAM role that allows -- your Amazon ECS container agent to make calls to your load balancer on -- your behalf. This parameter is only required if you are using a load -- balancer with your service. cRole :: Lens' CreateService (Maybe Text) cRole = lens _cRole (\ s a -> s{_cRole = a}); -- | Optional deployment parameters that control how many tasks run during -- the deployment and the ordering of stopping and starting tasks. cDeploymentConfiguration :: Lens' CreateService (Maybe DeploymentConfiguration) cDeploymentConfiguration = lens _cDeploymentConfiguration (\ s a -> s{_cDeploymentConfiguration = a}); -- | The name of your service. Up to 255 letters (uppercase and lowercase), -- numbers, hyphens, and underscores are allowed. Service names must be -- unique within a cluster, but you can have similarly named services in -- multiple clusters within a region or across multiple regions. cServiceName :: Lens' CreateService Text cServiceName = lens _cServiceName (\ s a -> s{_cServiceName = a}); -- | The 'family' and 'revision' ('family:revision') or full Amazon Resource -- Name (ARN) of the task definition to run in your service. If a -- 'revision' is not specified, the latest 'ACTIVE' revision is used. cTaskDefinition :: Lens' CreateService Text cTaskDefinition = lens _cTaskDefinition (\ s a -> s{_cTaskDefinition = a}); -- | The number of instantiations of the specified task definition to place -- and keep running on your cluster. cDesiredCount :: Lens' CreateService Int cDesiredCount = lens _cDesiredCount (\ s a -> s{_cDesiredCount = a}); instance AWSRequest CreateService where type Rs CreateService = CreateServiceResponse request = postJSON ecs response = receiveJSON (\ s h x -> CreateServiceResponse' <$> (x .?> "service") <*> (pure (fromEnum s))) instance Hashable CreateService instance NFData CreateService instance ToHeaders CreateService where toHeaders = const (mconcat ["X-Amz-Target" =# ("AmazonEC2ContainerServiceV20141113.CreateService" :: ByteString), "Content-Type" =# ("application/x-amz-json-1.1" :: ByteString)]) instance ToJSON CreateService where toJSON CreateService'{..} = object (catMaybes [("cluster" .=) <$> _cCluster, ("clientToken" .=) <$> _cClientToken, ("loadBalancers" .=) <$> _cLoadBalancers, ("role" .=) <$> _cRole, ("deploymentConfiguration" .=) <$> _cDeploymentConfiguration, Just ("serviceName" .= _cServiceName), Just ("taskDefinition" .= _cTaskDefinition), Just ("desiredCount" .= _cDesiredCount)]) instance ToPath CreateService where toPath = const "/" instance ToQuery CreateService where toQuery = const mempty -- | /See:/ 'createServiceResponse' smart constructor. data CreateServiceResponse = CreateServiceResponse' { _csrsService :: !(Maybe ContainerService) , _csrsResponseStatus :: !Int } deriving (Eq,Read,Show,Data,Typeable,Generic) -- | Creates a value of 'CreateServiceResponse' with the minimum fields required to make a request. -- -- Use one of the following lenses to modify other fields as desired: -- -- * 'csrsService' -- -- * 'csrsResponseStatus' createServiceResponse :: Int -- ^ 'csrsResponseStatus' -> CreateServiceResponse createServiceResponse pResponseStatus_ = CreateServiceResponse' { _csrsService = Nothing , _csrsResponseStatus = pResponseStatus_ } -- | The full description of your service following the create call. csrsService :: Lens' CreateServiceResponse (Maybe ContainerService) csrsService = lens _csrsService (\ s a -> s{_csrsService = a}); -- | The response status code. csrsResponseStatus :: Lens' CreateServiceResponse Int csrsResponseStatus = lens _csrsResponseStatus (\ s a -> s{_csrsResponseStatus = a}); instance NFData CreateServiceResponse