# CDK Construct library for higher-level ECS Constructs
<!--BEGIN STABILITY BANNER-->---
![cdk-constructs: Stable](https://img.shields.io/badge/cdk--constructs-stable-success.svg?style=for-the-badge)
---
<!--END STABILITY BANNER-->
This library provides higher-level Amazon ECS constructs which follow common architectural patterns. It contains:
* Application Load Balanced Services
* Network Load Balanced Services
* Queue Processing Services
* Scheduled Tasks (cron jobs)
* Additional Examples
## Application Load Balanced Services
To define an Amazon ECS service that is behind an application load balancer, instantiate one of the following:
* `ApplicationLoadBalancedEc2Service`
```python
# cluster: ecs.Cluster
load_balanced_ecs_service = ecs_patterns.ApplicationLoadBalancedEc2Service(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("test"),
environment={
"TEST_ENVIRONMENT_VARIABLE1": "test environment variable 1 value",
"TEST_ENVIRONMENT_VARIABLE2": "test environment variable 2 value"
}
),
desired_count=2
)
```
* `ApplicationLoadBalancedFargateService`
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
)
)
load_balanced_fargate_service.target_group.configure_health_check(
path="/custom-health-path"
)
```
Instead of providing a cluster you can specify a VPC and CDK will create a new ECS cluster.
If you deploy multiple services CDK will only create one cluster per VPC.
You can omit `cluster` and `vpc` to let CDK create a new VPC with two AZs and create a cluster inside this VPC.
You can customize the health check for your target group; otherwise it defaults to `HTTP` over port `80` hitting path `/`.
Fargate services will use the `LATEST` platform version by default, but you can override by providing a value for the `platformVersion` property in the constructor.
Fargate services use the default VPC Security Group unless one or more are provided using the `securityGroups` property in the constructor.
By setting `redirectHTTP` to true, CDK will automatically create a listener on port 80 that redirects HTTP traffic to the HTTPS port.
If you specify the option `recordType` you can decide if you want the construct to use CNAME or Route53-Aliases as record sets.
If you need to encrypt the traffic between the load balancer and the ECS tasks, you can set the `targetProtocol` to `HTTPS`.
Additionally, if more than one application target group are needed, instantiate one of the following:
* `ApplicationMultipleTargetGroupsEc2Service`
```python
# One application load balancer with one listener and two target groups.
# cluster: ecs.Cluster
load_balanced_ec2_service = ecs_patterns.ApplicationMultipleTargetGroupsEc2Service(self, "Service",
cluster=cluster,
memory_limit_mi_b=256,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageProps(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
target_groups=[ecsPatterns.ApplicationTargetProps(
container_port=80
), ecsPatterns.ApplicationTargetProps(
container_port=90,
path_pattern="a/b/c",
priority=10
)
]
)
```
* `ApplicationMultipleTargetGroupsFargateService`
```python
# One application load balancer with one listener and two target groups.
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationMultipleTargetGroupsFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageProps(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
target_groups=[ecsPatterns.ApplicationTargetProps(
container_port=80
), ecsPatterns.ApplicationTargetProps(
container_port=90,
path_pattern="a/b/c",
priority=10
)
]
)
```
## Network Load Balanced Services
To define an Amazon ECS service that is behind a network load balancer, instantiate one of the following:
* `NetworkLoadBalancedEc2Service`
```python
# cluster: ecs.Cluster
load_balanced_ecs_service = ecs_patterns.NetworkLoadBalancedEc2Service(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("test"),
environment={
"TEST_ENVIRONMENT_VARIABLE1": "test environment variable 1 value",
"TEST_ENVIRONMENT_VARIABLE2": "test environment variable 2 value"
}
),
desired_count=2
)
```
* `NetworkLoadBalancedFargateService`
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.NetworkLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
cpu=512,
task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
)
)
```
The CDK will create a new Amazon ECS cluster if you specify a VPC and omit `cluster`. If you deploy multiple services the CDK will only create one cluster per VPC.
If `cluster` and `vpc` are omitted, the CDK creates a new VPC with subnets in two Availability Zones and a cluster within this VPC.
If you specify the option `recordType` you can decide if you want the construct to use CNAME or Route53-Aliases as record sets.
Additionally, if more than one network target group is needed, instantiate one of the following:
* NetworkMultipleTargetGroupsEc2Service
```python
# Two network load balancers, each with their own listener and target group.
# cluster: ecs.Cluster
load_balanced_ec2_service = ecs_patterns.NetworkMultipleTargetGroupsEc2Service(self, "Service",
cluster=cluster,
memory_limit_mi_b=256,
task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageProps(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
load_balancers=[ecsPatterns.NetworkLoadBalancerProps(
name="lb1",
listeners=[ecsPatterns.NetworkListenerProps(
name="listener1"
)
]
), ecsPatterns.NetworkLoadBalancerProps(
name="lb2",
listeners=[ecsPatterns.NetworkListenerProps(
name="listener2"
)
]
)
],
target_groups=[ecsPatterns.NetworkTargetProps(
container_port=80,
listener="listener1"
), ecsPatterns.NetworkTargetProps(
container_port=90,
listener="listener2"
)
]
)
```
* NetworkMultipleTargetGroupsFargateService
```python
# Two network load balancers, each with their own listener and target group.
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.NetworkMultipleTargetGroupsFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=512,
task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageProps(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
load_balancers=[ecsPatterns.NetworkLoadBalancerProps(
name="lb1",
listeners=[ecsPatterns.NetworkListenerProps(
name="listener1"
)
]
), ecsPatterns.NetworkLoadBalancerProps(
name="lb2",
listeners=[ecsPatterns.NetworkListenerProps(
name="listener2"
)
]
)
],
target_groups=[ecsPatterns.NetworkTargetProps(
container_port=80,
listener="listener1"
), ecsPatterns.NetworkTargetProps(
container_port=90,
listener="listener2"
)
]
)
```
## Queue Processing Services
To define a service that creates a queue and reads from that queue, instantiate one of the following:
* `QueueProcessingEc2Service`
```python
# cluster: ecs.Cluster
queue_processing_ec2_service = ecs_patterns.QueueProcessingEc2Service(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
image=ecs.ContainerImage.from_registry("test"),
command=["-c", "4", "amazon.com"],
enable_logging=False,
desired_task_count=2,
environment={
"TEST_ENVIRONMENT_VARIABLE1": "test environment variable 1 value",
"TEST_ENVIRONMENT_VARIABLE2": "test environment variable 2 value"
},
max_scaling_capacity=5,
container_name="test"
)
```
* `QueueProcessingFargateService`
```python
# cluster: ecs.Cluster
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
command=["-c", "4", "amazon.com"],
enable_logging=False,
desired_task_count=2,
environment={
"TEST_ENVIRONMENT_VARIABLE1": "test environment variable 1 value",
"TEST_ENVIRONMENT_VARIABLE2": "test environment variable 2 value"
},
max_scaling_capacity=5,
container_name="test"
)
```
when queue not provided by user, CDK will create a primary queue and a dead letter queue with default redrive policy and attach permission to the task to be able to access the primary queue.
## Scheduled Tasks
To define a task that runs periodically, there are 2 options:
* `ScheduledEc2Task`
```python
# Instantiate an Amazon EC2 Task to run at a scheduled interval
# cluster: ecs.Cluster
ecs_scheduled_task = ecs_patterns.ScheduledEc2Task(self, "ScheduledTask",
cluster=cluster,
scheduled_ec2_task_image_options=ecsPatterns.ScheduledEc2TaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"),
memory_limit_mi_b=256,
environment={"name": "TRIGGER", "value": "CloudWatch Events"}
),
schedule=appscaling.Schedule.expression("rate(1 minute)"),
enabled=True,
rule_name="sample-scheduled-task-rule"
)
```
* `ScheduledFargateTask`
```python
# cluster: ecs.Cluster
scheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, "ScheduledFargateTask",
cluster=cluster,
scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"),
memory_limit_mi_b=512
),
schedule=appscaling.Schedule.expression("rate(1 minute)"),
platform_version=ecs.FargatePlatformVersion.LATEST
)
```
## Additional Examples
In addition to using the constructs, users can also add logic to customize these constructs:
### Configure HTTPS on an ApplicationLoadBalancedFargateService
```python
from aws_cdk.aws_route53 import HostedZone
from aws_cdk.aws_certificatemanager import Certificate
from aws_cdk.aws_elasticloadbalancingv2 import SslPolicy
# vpc: ec2.Vpc
# cluster: ecs.Cluster
domain_zone = HostedZone.from_lookup(self, "Zone", domain_name="example.com")
certificate = Certificate.from_certificate_arn(self, "Cert", "arn:aws:acm:us-east-1:123456:certificate/abcdefg")
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
vpc=vpc,
cluster=cluster,
certificate=certificate,
ssl_policy=SslPolicy.RECOMMENDED,
domain_name="api.example.com",
domain_zone=domain_zone,
redirect_hTTP=True,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
)
)
```
### Add Schedule-Based Auto-Scaling to an ApplicationLoadBalancedFargateService
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
)
)
scalable_target = load_balanced_fargate_service.service.auto_scale_task_count(
min_capacity=5,
max_capacity=20
)
scalable_target.scale_on_schedule("DaytimeScaleDown",
schedule=appscaling.Schedule.cron(hour="8", minute="0"),
min_capacity=1
)
scalable_target.scale_on_schedule("EveningRushScaleUp",
schedule=appscaling.Schedule.cron(hour="20", minute="0"),
min_capacity=10
)
```
### Add Metric-Based Auto-Scaling to an ApplicationLoadBalancedFargateService
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
)
)
scalable_target = load_balanced_fargate_service.service.auto_scale_task_count(
min_capacity=1,
max_capacity=20
)
scalable_target.scale_on_cpu_utilization("CpuScaling",
target_utilization_percent=50
)
scalable_target.scale_on_memory_utilization("MemoryScaling",
target_utilization_percent=50
)
```
### Change the default Deployment Controller
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
deployment_controller=ecs.DeploymentController(
type=ecs.DeploymentControllerType.CODE_DEPLOY
)
)
```
### Deployment circuit breaker and rollback
Amazon ECS [deployment circuit breaker](https://aws.amazon.com/tw/blogs/containers/announcing-amazon-ecs-deployment-circuit-breaker/)
automatically rolls back unhealthy service deployments without the need for manual intervention. Use `circuitBreaker` to enable
deployment circuit breaker and optionally enable `rollback` for automatic rollback. See [Using the deployment circuit breaker](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html)
for more details.
```python
# cluster: ecs.Cluster
service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
circuit_breaker=ecs.DeploymentCircuitBreaker(rollback=True)
)
```
### Set deployment configuration on QueueProcessingService
```python
# cluster: ecs.Cluster
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
command=["-c", "4", "amazon.com"],
enable_logging=False,
desired_task_count=2,
environment={},
max_scaling_capacity=5,
max_healthy_percent=200,
min_healthy_percent=66
)
```
### Set taskSubnets and securityGroups for QueueProcessingFargateService
```python
# vpc: ec2.Vpc
# security_group: ec2.SecurityGroup
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
vpc=vpc,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
security_groups=[security_group],
task_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_ISOLATED)
)
```
### Define tasks with public IPs for QueueProcessingFargateService
```python
# vpc: ec2.Vpc
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
vpc=vpc,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
assign_public_ip=True
)
```
### Define tasks with custom queue parameters for QueueProcessingFargateService
```python
# vpc: ec2.Vpc
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
vpc=vpc,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
max_receive_count=42,
retention_period=Duration.days(7),
visibility_timeout=Duration.minutes(5)
)
```
### Set capacityProviderStrategies for QueueProcessingFargateService
```python
# cluster: ecs.Cluster
cluster.enable_fargate_capacity_providers()
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
capacity_provider_strategies=[ecs.CapacityProviderStrategy(
capacity_provider="FARGATE_SPOT",
weight=2
), ecs.CapacityProviderStrategy(
capacity_provider="FARGATE",
weight=1
)
]
)
```
### Set a custom container-level Healthcheck for QueueProcessingFargateService
```python
# vpc: ec2.Vpc
# security_group: ec2.SecurityGroup
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
vpc=vpc,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
health_check=ecs.HealthCheck(
command=["CMD-SHELL", "curl -f http://localhost/ || exit 1"],
# the properties below are optional
interval=Duration.minutes(30),
retries=123,
start_period=Duration.minutes(30),
timeout=Duration.minutes(30)
)
)
```
### Set capacityProviderStrategies for QueueProcessingEc2Service
```python
import aws_cdk.aws_autoscaling as autoscaling
vpc = ec2.Vpc(self, "Vpc", max_azs=1)
cluster = ecs.Cluster(self, "EcsCluster", vpc=vpc)
auto_scaling_group = autoscaling.AutoScalingGroup(self, "asg",
vpc=vpc,
instance_type=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),
machine_image=ecs.EcsOptimizedImage.amazon_linux2()
)
capacity_provider = ecs.AsgCapacityProvider(self, "provider",
auto_scaling_group=auto_scaling_group
)
cluster.add_asg_capacity_provider(capacity_provider)
queue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=512,
image=ecs.ContainerImage.from_registry("test"),
capacity_provider_strategies=[ecs.CapacityProviderStrategy(
capacity_provider=capacity_provider.capacity_provider_name
)
]
)
```
### Select specific vpc subnets for ApplicationLoadBalancedFargateService
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
task_subnets=ec2.SubnetSelection(
subnets=[ec2.Subnet.from_subnet_id(self, "subnet", "VpcISOLATEDSubnet1Subnet80F07FA0")]
)
)
```
### Set PlatformVersion for ScheduledFargateTask
```python
# cluster: ecs.Cluster
scheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, "ScheduledFargateTask",
cluster=cluster,
scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"),
memory_limit_mi_b=512
),
schedule=appscaling.Schedule.expression("rate(1 minute)"),
platform_version=ecs.FargatePlatformVersion.VERSION1_4
)
```
### Set SecurityGroups for ScheduledFargateTask
```python
vpc = ec2.Vpc(self, "Vpc", max_azs=1)
cluster = ecs.Cluster(self, "EcsCluster", vpc=vpc)
security_group = ec2.SecurityGroup(self, "SG", vpc=vpc)
scheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, "ScheduledFargateTask",
cluster=cluster,
scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"),
memory_limit_mi_b=512
),
schedule=appscaling.Schedule.expression("rate(1 minute)"),
security_groups=[security_group]
)
```
### Use the REMOVE_DEFAULT_DESIRED_COUNT feature flag
The REMOVE_DEFAULT_DESIRED_COUNT feature flag is used to override the default desiredCount that is autogenerated by the CDK. This will set the desiredCount of any service created by any of the following constructs to be undefined.
* ApplicationLoadBalancedEc2Service
* ApplicationLoadBalancedFargateService
* NetworkLoadBalancedEc2Service
* NetworkLoadBalancedFargateService
* QueueProcessingEc2Service
* QueueProcessingFargateService
If a desiredCount is not passed in as input to the above constructs, CloudFormation will either create a new service to start up with a desiredCount of 1, or update an existing service to start up with the same desiredCount as prior to the update.
To enable the feature flag, ensure that the REMOVE_DEFAULT_DESIRED_COUNT flag within an application stack context is set to true, like so:
```python
# stack: Stack
stack.node.set_context(cxapi.ECS_REMOVE_DEFAULT_DESIRED_COUNT, True)
```
The following is an example of an application with the REMOVE_DEFAULT_DESIRED_COUNT feature flag enabled:
```python
from aws_cdk.core import App, Stack
import aws_cdk.aws_ec2 as ec2
import aws_cdk.aws_ecs as ecs
import aws_cdk.aws_ecs_patterns as ecs_patterns
import aws_cdk.cx_api as cxapi
import path as path
app = App()
stack = Stack(app, "aws-ecs-patterns-queue")
stack.node.set_context(cxapi.ECS_REMOVE_DEFAULT_DESIRED_COUNT, True)
vpc = ec2.Vpc(stack, "VPC",
max_azs=2
)
ecs_patterns.QueueProcessingFargateService(stack, "QueueProcessingService",
vpc=vpc,
memory_limit_mi_b=512,
image=ecs.AssetImage(path.join(__dirname, "..", "sqs-reader"))
)
```
### Deploy application and metrics sidecar
The following is an example of deploying an application along with a metrics sidecar container that utilizes `dockerLabels` for discovery:
```python
# cluster: ecs.Cluster
# vpc: ec2.Vpc
service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
vpc=vpc,
desired_count=1,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample"),
docker_labels={
"application.label.one": "first_label",
"application.label.two": "second_label"
}
)
)
service.task_definition.add_container("Sidecar",
image=ecs.ContainerImage.from_registry("example/metrics-sidecar")
)
```
### Select specific load balancer name ApplicationLoadBalancedFargateService
```python
# cluster: ecs.Cluster
load_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, "Service",
cluster=cluster,
memory_limit_mi_b=1024,
desired_count=1,
cpu=512,
task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(
image=ecs.ContainerImage.from_registry("amazon/amazon-ecs-sample")
),
task_subnets=ec2.SubnetSelection(
subnets=[ec2.Subnet.from_subnet_id(self, "subnet", "VpcISOLATEDSubnet1Subnet80F07FA0")]
),
load_balancer_name="application-lb-name"
)
```
Raw data
{
"_id": null,
"home_page": "https://github.com/aws/aws-cdk",
"name": "aws-cdk.aws-ecs-patterns",
"maintainer": "",
"docs_url": null,
"requires_python": "~=3.7",
"maintainer_email": "",
"keywords": "",
"author": "Amazon Web Services",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/a8/0c/108c881f5c4a1de792f214f1aade5c8c511456322fa5759b794533197144/aws-cdk.aws-ecs-patterns-1.203.0.tar.gz",
"platform": null,
"description": "# CDK Construct library for higher-level ECS Constructs\n\n<!--BEGIN STABILITY BANNER-->---\n\n\n![cdk-constructs: Stable](https://img.shields.io/badge/cdk--constructs-stable-success.svg?style=for-the-badge)\n\n---\n<!--END STABILITY BANNER-->\n\nThis library provides higher-level Amazon ECS constructs which follow common architectural patterns. It contains:\n\n* Application Load Balanced Services\n* Network Load Balanced Services\n* Queue Processing Services\n* Scheduled Tasks (cron jobs)\n* Additional Examples\n\n## Application Load Balanced Services\n\nTo define an Amazon ECS service that is behind an application load balancer, instantiate one of the following:\n\n* `ApplicationLoadBalancedEc2Service`\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_ecs_service = ecs_patterns.ApplicationLoadBalancedEc2Service(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"test\"),\n environment={\n \"TEST_ENVIRONMENT_VARIABLE1\": \"test environment variable 1 value\",\n \"TEST_ENVIRONMENT_VARIABLE2\": \"test environment variable 2 value\"\n }\n ),\n desired_count=2\n)\n```\n\n* `ApplicationLoadBalancedFargateService`\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n )\n)\n\nload_balanced_fargate_service.target_group.configure_health_check(\n path=\"/custom-health-path\"\n)\n```\n\nInstead of providing a cluster you can specify a VPC and CDK will create a new ECS cluster.\nIf you deploy multiple services CDK will only create one cluster per VPC.\n\nYou can omit `cluster` and `vpc` to let CDK create a new VPC with two AZs and create a cluster inside this VPC.\n\nYou can customize the health check for your target group; otherwise it defaults to `HTTP` over port `80` hitting path `/`.\n\nFargate services will use the `LATEST` platform version by default, but you can override by providing a value for the `platformVersion` property in the constructor.\n\nFargate services use the default VPC Security Group unless one or more are provided using the `securityGroups` property in the constructor.\n\nBy setting `redirectHTTP` to true, CDK will automatically create a listener on port 80 that redirects HTTP traffic to the HTTPS port.\n\nIf you specify the option `recordType` you can decide if you want the construct to use CNAME or Route53-Aliases as record sets.\n\nIf you need to encrypt the traffic between the load balancer and the ECS tasks, you can set the `targetProtocol` to `HTTPS`.\n\nAdditionally, if more than one application target group are needed, instantiate one of the following:\n\n* `ApplicationMultipleTargetGroupsEc2Service`\n\n```python\n# One application load balancer with one listener and two target groups.\n# cluster: ecs.Cluster\n\nload_balanced_ec2_service = ecs_patterns.ApplicationMultipleTargetGroupsEc2Service(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=256,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageProps(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n target_groups=[ecsPatterns.ApplicationTargetProps(\n container_port=80\n ), ecsPatterns.ApplicationTargetProps(\n container_port=90,\n path_pattern=\"a/b/c\",\n priority=10\n )\n ]\n)\n```\n\n* `ApplicationMultipleTargetGroupsFargateService`\n\n```python\n# One application load balancer with one listener and two target groups.\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationMultipleTargetGroupsFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageProps(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n target_groups=[ecsPatterns.ApplicationTargetProps(\n container_port=80\n ), ecsPatterns.ApplicationTargetProps(\n container_port=90,\n path_pattern=\"a/b/c\",\n priority=10\n )\n ]\n)\n```\n\n## Network Load Balanced Services\n\nTo define an Amazon ECS service that is behind a network load balancer, instantiate one of the following:\n\n* `NetworkLoadBalancedEc2Service`\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_ecs_service = ecs_patterns.NetworkLoadBalancedEc2Service(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"test\"),\n environment={\n \"TEST_ENVIRONMENT_VARIABLE1\": \"test environment variable 1 value\",\n \"TEST_ENVIRONMENT_VARIABLE2\": \"test environment variable 2 value\"\n }\n ),\n desired_count=2\n)\n```\n\n* `NetworkLoadBalancedFargateService`\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.NetworkLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n cpu=512,\n task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n )\n)\n```\n\nThe CDK will create a new Amazon ECS cluster if you specify a VPC and omit `cluster`. If you deploy multiple services the CDK will only create one cluster per VPC.\n\nIf `cluster` and `vpc` are omitted, the CDK creates a new VPC with subnets in two Availability Zones and a cluster within this VPC.\n\nIf you specify the option `recordType` you can decide if you want the construct to use CNAME or Route53-Aliases as record sets.\n\nAdditionally, if more than one network target group is needed, instantiate one of the following:\n\n* NetworkMultipleTargetGroupsEc2Service\n\n```python\n# Two network load balancers, each with their own listener and target group.\n# cluster: ecs.Cluster\n\nload_balanced_ec2_service = ecs_patterns.NetworkMultipleTargetGroupsEc2Service(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=256,\n task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageProps(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n load_balancers=[ecsPatterns.NetworkLoadBalancerProps(\n name=\"lb1\",\n listeners=[ecsPatterns.NetworkListenerProps(\n name=\"listener1\"\n )\n ]\n ), ecsPatterns.NetworkLoadBalancerProps(\n name=\"lb2\",\n listeners=[ecsPatterns.NetworkListenerProps(\n name=\"listener2\"\n )\n ]\n )\n ],\n target_groups=[ecsPatterns.NetworkTargetProps(\n container_port=80,\n listener=\"listener1\"\n ), ecsPatterns.NetworkTargetProps(\n container_port=90,\n listener=\"listener2\"\n )\n ]\n)\n```\n\n* NetworkMultipleTargetGroupsFargateService\n\n```python\n# Two network load balancers, each with their own listener and target group.\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.NetworkMultipleTargetGroupsFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=512,\n task_image_options=ecsPatterns.NetworkLoadBalancedTaskImageProps(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n load_balancers=[ecsPatterns.NetworkLoadBalancerProps(\n name=\"lb1\",\n listeners=[ecsPatterns.NetworkListenerProps(\n name=\"listener1\"\n )\n ]\n ), ecsPatterns.NetworkLoadBalancerProps(\n name=\"lb2\",\n listeners=[ecsPatterns.NetworkListenerProps(\n name=\"listener2\"\n )\n ]\n )\n ],\n target_groups=[ecsPatterns.NetworkTargetProps(\n container_port=80,\n listener=\"listener1\"\n ), ecsPatterns.NetworkTargetProps(\n container_port=90,\n listener=\"listener2\"\n )\n ]\n)\n```\n\n## Queue Processing Services\n\nTo define a service that creates a queue and reads from that queue, instantiate one of the following:\n\n* `QueueProcessingEc2Service`\n\n```python\n# cluster: ecs.Cluster\n\nqueue_processing_ec2_service = ecs_patterns.QueueProcessingEc2Service(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n image=ecs.ContainerImage.from_registry(\"test\"),\n command=[\"-c\", \"4\", \"amazon.com\"],\n enable_logging=False,\n desired_task_count=2,\n environment={\n \"TEST_ENVIRONMENT_VARIABLE1\": \"test environment variable 1 value\",\n \"TEST_ENVIRONMENT_VARIABLE2\": \"test environment variable 2 value\"\n },\n max_scaling_capacity=5,\n container_name=\"test\"\n)\n```\n\n* `QueueProcessingFargateService`\n\n```python\n# cluster: ecs.Cluster\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n command=[\"-c\", \"4\", \"amazon.com\"],\n enable_logging=False,\n desired_task_count=2,\n environment={\n \"TEST_ENVIRONMENT_VARIABLE1\": \"test environment variable 1 value\",\n \"TEST_ENVIRONMENT_VARIABLE2\": \"test environment variable 2 value\"\n },\n max_scaling_capacity=5,\n container_name=\"test\"\n)\n```\n\nwhen queue not provided by user, CDK will create a primary queue and a dead letter queue with default redrive policy and attach permission to the task to be able to access the primary queue.\n\n## Scheduled Tasks\n\nTo define a task that runs periodically, there are 2 options:\n\n* `ScheduledEc2Task`\n\n```python\n# Instantiate an Amazon EC2 Task to run at a scheduled interval\n# cluster: ecs.Cluster\n\necs_scheduled_task = ecs_patterns.ScheduledEc2Task(self, \"ScheduledTask\",\n cluster=cluster,\n scheduled_ec2_task_image_options=ecsPatterns.ScheduledEc2TaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\"),\n memory_limit_mi_b=256,\n environment={\"name\": \"TRIGGER\", \"value\": \"CloudWatch Events\"}\n ),\n schedule=appscaling.Schedule.expression(\"rate(1 minute)\"),\n enabled=True,\n rule_name=\"sample-scheduled-task-rule\"\n)\n```\n\n* `ScheduledFargateTask`\n\n```python\n# cluster: ecs.Cluster\n\nscheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, \"ScheduledFargateTask\",\n cluster=cluster,\n scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\"),\n memory_limit_mi_b=512\n ),\n schedule=appscaling.Schedule.expression(\"rate(1 minute)\"),\n platform_version=ecs.FargatePlatformVersion.LATEST\n)\n```\n\n## Additional Examples\n\nIn addition to using the constructs, users can also add logic to customize these constructs:\n\n### Configure HTTPS on an ApplicationLoadBalancedFargateService\n\n```python\nfrom aws_cdk.aws_route53 import HostedZone\nfrom aws_cdk.aws_certificatemanager import Certificate\nfrom aws_cdk.aws_elasticloadbalancingv2 import SslPolicy\n\n# vpc: ec2.Vpc\n# cluster: ecs.Cluster\n\n\ndomain_zone = HostedZone.from_lookup(self, \"Zone\", domain_name=\"example.com\")\ncertificate = Certificate.from_certificate_arn(self, \"Cert\", \"arn:aws:acm:us-east-1:123456:certificate/abcdefg\")\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n vpc=vpc,\n cluster=cluster,\n certificate=certificate,\n ssl_policy=SslPolicy.RECOMMENDED,\n domain_name=\"api.example.com\",\n domain_zone=domain_zone,\n redirect_hTTP=True,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n )\n)\n```\n\n### Add Schedule-Based Auto-Scaling to an ApplicationLoadBalancedFargateService\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n )\n)\n\nscalable_target = load_balanced_fargate_service.service.auto_scale_task_count(\n min_capacity=5,\n max_capacity=20\n)\n\nscalable_target.scale_on_schedule(\"DaytimeScaleDown\",\n schedule=appscaling.Schedule.cron(hour=\"8\", minute=\"0\"),\n min_capacity=1\n)\n\nscalable_target.scale_on_schedule(\"EveningRushScaleUp\",\n schedule=appscaling.Schedule.cron(hour=\"20\", minute=\"0\"),\n min_capacity=10\n)\n```\n\n### Add Metric-Based Auto-Scaling to an ApplicationLoadBalancedFargateService\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n )\n)\n\nscalable_target = load_balanced_fargate_service.service.auto_scale_task_count(\n min_capacity=1,\n max_capacity=20\n)\n\nscalable_target.scale_on_cpu_utilization(\"CpuScaling\",\n target_utilization_percent=50\n)\n\nscalable_target.scale_on_memory_utilization(\"MemoryScaling\",\n target_utilization_percent=50\n)\n```\n\n### Change the default Deployment Controller\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n deployment_controller=ecs.DeploymentController(\n type=ecs.DeploymentControllerType.CODE_DEPLOY\n )\n)\n```\n\n### Deployment circuit breaker and rollback\n\nAmazon ECS [deployment circuit breaker](https://aws.amazon.com/tw/blogs/containers/announcing-amazon-ecs-deployment-circuit-breaker/)\nautomatically rolls back unhealthy service deployments without the need for manual intervention. Use `circuitBreaker` to enable\ndeployment circuit breaker and optionally enable `rollback` for automatic rollback. See [Using the deployment circuit breaker](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html)\nfor more details.\n\n```python\n# cluster: ecs.Cluster\n\nservice = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n circuit_breaker=ecs.DeploymentCircuitBreaker(rollback=True)\n)\n```\n\n### Set deployment configuration on QueueProcessingService\n\n```python\n# cluster: ecs.Cluster\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n command=[\"-c\", \"4\", \"amazon.com\"],\n enable_logging=False,\n desired_task_count=2,\n environment={},\n max_scaling_capacity=5,\n max_healthy_percent=200,\n min_healthy_percent=66\n)\n```\n\n### Set taskSubnets and securityGroups for QueueProcessingFargateService\n\n```python\n# vpc: ec2.Vpc\n# security_group: ec2.SecurityGroup\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n vpc=vpc,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n security_groups=[security_group],\n task_subnets=ec2.SubnetSelection(subnet_type=ec2.SubnetType.PRIVATE_ISOLATED)\n)\n```\n\n### Define tasks with public IPs for QueueProcessingFargateService\n\n```python\n# vpc: ec2.Vpc\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n vpc=vpc,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n assign_public_ip=True\n)\n```\n\n### Define tasks with custom queue parameters for QueueProcessingFargateService\n\n```python\n# vpc: ec2.Vpc\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n vpc=vpc,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n max_receive_count=42,\n retention_period=Duration.days(7),\n visibility_timeout=Duration.minutes(5)\n)\n```\n\n### Set capacityProviderStrategies for QueueProcessingFargateService\n\n```python\n# cluster: ecs.Cluster\n\ncluster.enable_fargate_capacity_providers()\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n capacity_provider_strategies=[ecs.CapacityProviderStrategy(\n capacity_provider=\"FARGATE_SPOT\",\n weight=2\n ), ecs.CapacityProviderStrategy(\n capacity_provider=\"FARGATE\",\n weight=1\n )\n ]\n)\n```\n\n### Set a custom container-level Healthcheck for QueueProcessingFargateService\n\n```python\n# vpc: ec2.Vpc\n# security_group: ec2.SecurityGroup\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n vpc=vpc,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n health_check=ecs.HealthCheck(\n command=[\"CMD-SHELL\", \"curl -f http://localhost/ || exit 1\"],\n # the properties below are optional\n interval=Duration.minutes(30),\n retries=123,\n start_period=Duration.minutes(30),\n timeout=Duration.minutes(30)\n )\n)\n```\n\n### Set capacityProviderStrategies for QueueProcessingEc2Service\n\n```python\nimport aws_cdk.aws_autoscaling as autoscaling\n\n\nvpc = ec2.Vpc(self, \"Vpc\", max_azs=1)\ncluster = ecs.Cluster(self, \"EcsCluster\", vpc=vpc)\nauto_scaling_group = autoscaling.AutoScalingGroup(self, \"asg\",\n vpc=vpc,\n instance_type=ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE2, ec2.InstanceSize.MICRO),\n machine_image=ecs.EcsOptimizedImage.amazon_linux2()\n)\ncapacity_provider = ecs.AsgCapacityProvider(self, \"provider\",\n auto_scaling_group=auto_scaling_group\n)\ncluster.add_asg_capacity_provider(capacity_provider)\n\nqueue_processing_fargate_service = ecs_patterns.QueueProcessingFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=512,\n image=ecs.ContainerImage.from_registry(\"test\"),\n capacity_provider_strategies=[ecs.CapacityProviderStrategy(\n capacity_provider=capacity_provider.capacity_provider_name\n )\n ]\n)\n```\n\n### Select specific vpc subnets for ApplicationLoadBalancedFargateService\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n task_subnets=ec2.SubnetSelection(\n subnets=[ec2.Subnet.from_subnet_id(self, \"subnet\", \"VpcISOLATEDSubnet1Subnet80F07FA0\")]\n )\n)\n```\n\n### Set PlatformVersion for ScheduledFargateTask\n\n```python\n# cluster: ecs.Cluster\n\nscheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, \"ScheduledFargateTask\",\n cluster=cluster,\n scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\"),\n memory_limit_mi_b=512\n ),\n schedule=appscaling.Schedule.expression(\"rate(1 minute)\"),\n platform_version=ecs.FargatePlatformVersion.VERSION1_4\n)\n```\n\n### Set SecurityGroups for ScheduledFargateTask\n\n```python\nvpc = ec2.Vpc(self, \"Vpc\", max_azs=1)\ncluster = ecs.Cluster(self, \"EcsCluster\", vpc=vpc)\nsecurity_group = ec2.SecurityGroup(self, \"SG\", vpc=vpc)\n\nscheduled_fargate_task = ecs_patterns.ScheduledFargateTask(self, \"ScheduledFargateTask\",\n cluster=cluster,\n scheduled_fargate_task_image_options=ecsPatterns.ScheduledFargateTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\"),\n memory_limit_mi_b=512\n ),\n schedule=appscaling.Schedule.expression(\"rate(1 minute)\"),\n security_groups=[security_group]\n)\n```\n\n### Use the REMOVE_DEFAULT_DESIRED_COUNT feature flag\n\nThe REMOVE_DEFAULT_DESIRED_COUNT feature flag is used to override the default desiredCount that is autogenerated by the CDK. This will set the desiredCount of any service created by any of the following constructs to be undefined.\n\n* ApplicationLoadBalancedEc2Service\n* ApplicationLoadBalancedFargateService\n* NetworkLoadBalancedEc2Service\n* NetworkLoadBalancedFargateService\n* QueueProcessingEc2Service\n* QueueProcessingFargateService\n\nIf a desiredCount is not passed in as input to the above constructs, CloudFormation will either create a new service to start up with a desiredCount of 1, or update an existing service to start up with the same desiredCount as prior to the update.\n\nTo enable the feature flag, ensure that the REMOVE_DEFAULT_DESIRED_COUNT flag within an application stack context is set to true, like so:\n\n```python\n# stack: Stack\n\nstack.node.set_context(cxapi.ECS_REMOVE_DEFAULT_DESIRED_COUNT, True)\n```\n\nThe following is an example of an application with the REMOVE_DEFAULT_DESIRED_COUNT feature flag enabled:\n\n```python\nfrom aws_cdk.core import App, Stack\nimport aws_cdk.aws_ec2 as ec2\nimport aws_cdk.aws_ecs as ecs\nimport aws_cdk.aws_ecs_patterns as ecs_patterns\nimport aws_cdk.cx_api as cxapi\nimport path as path\n\napp = App()\n\nstack = Stack(app, \"aws-ecs-patterns-queue\")\nstack.node.set_context(cxapi.ECS_REMOVE_DEFAULT_DESIRED_COUNT, True)\n\nvpc = ec2.Vpc(stack, \"VPC\",\n max_azs=2\n)\n\necs_patterns.QueueProcessingFargateService(stack, \"QueueProcessingService\",\n vpc=vpc,\n memory_limit_mi_b=512,\n image=ecs.AssetImage(path.join(__dirname, \"..\", \"sqs-reader\"))\n)\n```\n\n### Deploy application and metrics sidecar\n\nThe following is an example of deploying an application along with a metrics sidecar container that utilizes `dockerLabels` for discovery:\n\n```python\n# cluster: ecs.Cluster\n# vpc: ec2.Vpc\n\nservice = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n vpc=vpc,\n desired_count=1,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\"),\n docker_labels={\n \"application.label.one\": \"first_label\",\n \"application.label.two\": \"second_label\"\n }\n )\n)\n\nservice.task_definition.add_container(\"Sidecar\",\n image=ecs.ContainerImage.from_registry(\"example/metrics-sidecar\")\n)\n```\n\n### Select specific load balancer name ApplicationLoadBalancedFargateService\n\n```python\n# cluster: ecs.Cluster\n\nload_balanced_fargate_service = ecs_patterns.ApplicationLoadBalancedFargateService(self, \"Service\",\n cluster=cluster,\n memory_limit_mi_b=1024,\n desired_count=1,\n cpu=512,\n task_image_options=ecsPatterns.ApplicationLoadBalancedTaskImageOptions(\n image=ecs.ContainerImage.from_registry(\"amazon/amazon-ecs-sample\")\n ),\n task_subnets=ec2.SubnetSelection(\n subnets=[ec2.Subnet.from_subnet_id(self, \"subnet\", \"VpcISOLATEDSubnet1Subnet80F07FA0\")]\n ),\n load_balancer_name=\"application-lb-name\"\n)\n```\n\n\n",
"bugtrack_url": null,
"license": "Apache-2.0",
"summary": "The CDK Construct Library for AWS::ECS",
"version": "1.203.0",
"project_urls": {
"Homepage": "https://github.com/aws/aws-cdk",
"Source": "https://github.com/aws/aws-cdk.git"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "877bb4f2a72251cdc84c72b778e6345d1ab6db613650dcf84d66a40f2f7faa3f",
"md5": "deda633cf5271671c001155291a48241",
"sha256": "102285af9bbe3d6f2ea5d636f97d249fbeb2653148d595cf083151568b8c9093"
},
"downloads": -1,
"filename": "aws_cdk.aws_ecs_patterns-1.203.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "deda633cf5271671c001155291a48241",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": "~=3.7",
"size": 308361,
"upload_time": "2023-05-31T22:54:37",
"upload_time_iso_8601": "2023-05-31T22:54:37.062786Z",
"url": "https://files.pythonhosted.org/packages/87/7b/b4f2a72251cdc84c72b778e6345d1ab6db613650dcf84d66a40f2f7faa3f/aws_cdk.aws_ecs_patterns-1.203.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a80c108c881f5c4a1de792f214f1aade5c8c511456322fa5759b794533197144",
"md5": "a29e7f8fa2be759e7062a5b520d761bd",
"sha256": "6a791aba4a44707874f0253ff2e9ba2b388d807577b81f8837b80f3ef4ef534d"
},
"downloads": -1,
"filename": "aws-cdk.aws-ecs-patterns-1.203.0.tar.gz",
"has_sig": false,
"md5_digest": "a29e7f8fa2be759e7062a5b520d761bd",
"packagetype": "sdist",
"python_version": "source",
"requires_python": "~=3.7",
"size": 309425,
"upload_time": "2023-05-31T23:02:09",
"upload_time_iso_8601": "2023-05-31T23:02:09.525082Z",
"url": "https://files.pythonhosted.org/packages/a8/0c/108c881f5c4a1de792f214f1aade5c8c511456322fa5759b794533197144/aws-cdk.aws-ecs-patterns-1.203.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-31 23:02:09",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "aws",
"github_project": "aws-cdk",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "aws-cdk.aws-ecs-patterns"
}