def test_allow_placement_strategy_constraint(self): task_definition = ecs.TaskDefinition( "mytaskdef", ContainerDefinitions=[ ecs.ContainerDefinition( Image="myimage", Memory="300", Name="mycontainer", ) ], Volumes=[ ecs.Volume(Name="my-vol"), ], ) ecs_service = ecs.Service( 'Service', Cluster='cluster', DesiredCount=2, PlacementStrategies=[ ecs.PlacementStrategy( Type="random", ) ], PlacementConstraints=[ ecs.PlacementConstraint( Type="distinctInstance", ) ], TaskDefinition=Ref(task_definition), ) ecs_service.to_dict()
def test_fargate_launch_type(self): task_definition = ecs.TaskDefinition( "mytaskdef", ContainerDefinitions=[ ecs.ContainerDefinition( Image="myimage", Memory="300", Name="mycontainer", ) ], Volumes=[ ecs.Volume(Name="my-vol"), ], ) ecs_service = ecs.Service( 'Service', Cluster='cluster', DesiredCount=2, PlacementStrategies=[ecs.PlacementStrategy(Type="random", )], LaunchType='FARGATE', NetworkConfiguration=ecs.NetworkConfiguration( AwsVpcConfiguration=ecs.AwsVpcConfiguration( AssignPublicIp='DISABLED', SecurityGroups=['sg-1234'], Subnets=['subnet-1234'])), PlacementConstraints=[ ecs.PlacementConstraint(Type="distinctInstance", ) ], TaskDefinition=Ref(task_definition), ) ecs_service.to_dict()
def __init__(self, title, scheme, **kwargs): super().__init__(title, **kwargs) self.Cluster = get_expvalue('Cluster', 'ClusterStack') # DAEMON MODE DO NOT SUPPORT DESIRED OR PLACEMENT STRATEGIES, # IS SIMPLY ONE TASK FOR CONTAINER INSTANCE if cfg.SchedulingStrategy == 'REPLICA': self.DesiredCount = get_endvalue('CapacityDesired') self.DeploymentConfiguration = ecs.DeploymentConfiguration( MaximumPercent=get_endvalue( 'DeploymentConfigurationMaximumPercent'), MinimumHealthyPercent=get_endvalue( 'DeploymentConfigurationMinimumHealthyPercent'), ) self.PlacementStrategies = If( 'LaunchTypeFarGate', Ref('AWS::NoValue'), [ # ecs.PlacementStrategy( # Type='spread', # Field='attribute:ecs.availability-zone' # ), ecs.PlacementStrategy( Type='spread', Field='instanceId' ) ] ) elif cfg.SchedulingStrategy == 'DAEMON': self.SchedulingStrategy = 'DAEMON' self.LaunchType = get_endvalue('LaunchType') if cfg.HealthCheckGracePeriodSeconds != 0: self.HealthCheckGracePeriodSeconds = ( get_endvalue('HealthCheckGracePeriodSeconds')) # self.PlatformVersion = 'LATEST' if cfg.LoadBalancerApplication: self.LoadBalancers = [] self.Role = If( 'NetworkModeAwsVpc', Ref('AWS::NoValue'), get_expvalue('RoleECSService') ) # When creating a service that specifies multiple target groups, # the Amazon ECS service-linked role must be created. # The role is created by omitting the Role property # in AWS CloudFormation if (cfg.LoadBalancerApplicationExternal and cfg.LoadBalancerApplicationInternal): self.Role = Ref('AWS::NoValue') self.TaskDefinition = Ref('TaskDefinition')
- Spread to several AZs for HA - Binpack to minimize number of required hosts per AZ """ service = t.add_resource( ecs.Service( "Service", Cluster=ImportValue(Sub("${EcsStack}-Cluster")), DependsOn=service_role, DesiredCount=Ref(autoscaling_min), LoadBalancers=[ ecs.LoadBalancer(ContainerName=Ref(container_name), ContainerPort=Ref(container_port), TargetGroupArn=Ref(target_group)), ], PlacementStrategies=[ ecs.PlacementStrategy(Type="spread", Field="attribute:ecs.availability-zone"), ecs.PlacementStrategy(Type="binpack", Field="memory"), ], Role=Ref(service_role), TaskDefinition=Ref(task_definition), DeploymentConfiguration=ecs.DeploymentConfiguration( MaximumPercent="100", MinimumHealthyPercent="50"), PlacementConstraints=[ ecs.PlacementConstraint(Type="distinctInstance") ], )) """ Make the service a ScalableTarget """ # scalable_target = t.add_resource(applicationautoscaling.ScalableTarget( # 'ScalableTarget',