CDK patterns for modern application with serverless containers on AWS
Project description
serverless-container-constructs
CDK patterns for modern application with serverless containers on AWS
AlbFargateServices
Inspired by Vijay Menon from the AWS blog post introduced in 2019, AlbFargateServices
allows you to create one or many fargate services with both internet-facing ALB and internal ALB associated with all services. With this pattern, fargate services will be allowed to intercommunicat via internal ALB while external inbound traffic will be spread across the same service tasks through internet-facing ALB.
The sample below will create 3 fargate services associated with both external and internal ALBs. The internal ALB will have an alias(internal.svc.local
) auto-configured from Route 53 so services can communite through the private ALB endpoint.
# Example automatically generated without compilation. See https://github.com/aws/jsii/issues/826
from serverless_container_constructs import AlbFargateServices
AlbFargateServices(stack, "Service",
spot=True, # FARGATE_SPOT only cluster
tasks=[{
"listener_port": 80,
"task": order_task,
"desired_count": 2,
# customize the service autoscaling policy
"scaling_policy": {
"max_capacity": 20,
"request_per_target": 1000,
"target_cpu_utilization": 50
}
}, {"listener_port": 8080, "task": customer_task, "desired_count": 2}, {"listener_port": 9090, "task": product_task, "desired_count": 2}
],
route53_ops={
"zone_name": zone_name, # svc.local
"external_alb_record_name": external_alb_record_name, # external.svc.local
"internal_alb_record_name": internal_alb_record_name
}
)
Fargate Spot Support
By enabling the spot
property, 100% fargate spot tasks will be provisioned to help you save up to 70%. Check more details about Fargate Spot. This is a handy catch-all flag to force all tasks to be FARGATE_SPOT
only.
To specify mixed strategy with partial FARGATE
and partial FARGATE_SPOT
, specify the capacityProviderStrategy
for individual tasks like
# Example automatically generated without compilation. See https://github.com/aws/jsii/issues/826
AlbFargateServices(stack, "Service",
tasks=[{
"listener_port": 8080,
"task": customer_task,
"desired_count": 2,
"capacity_provider_strategy": [{
"capacity_provider": "FARGATE",
"base": 1,
"weight": 1
}, {
"capacity_provider": "FARGATE_SPOT",
"base": 0,
"weight": 3
}
]
}
]
)
The custom capacity provider strategy will be applied if capacityProviderStretegy
is specified, otherwise, 100% spot will be used when spot: true
. The default policy is 100% Fargate on-demand.
ECS Exec
Simply turn on the enableExecuteCommand
property to enable the ECS Exec support for all services.
Internal or External Only
By default, all task(s) defined in the AlbFargateServices
will be registered to both external and internal ALBs.
Set accessibility
to make it internal only, external only, or both.
# Example automatically generated without compilation. See https://github.com/aws/jsii/issues/826
AlbFargateServices(stack, "Service",
tasks=[{"listener_port": 8080, "task": task1, "accessibility": LoadBalancerAccessibility.INTERNAL_ONLY}, {"listener_port": 8081, "task": task2, "accessibility": LoadBalancerAccessibility.EXTERNAL_ONLY}, {"listener_port": 8082, "task": task3}
]
)
Please note if all tasks are defined as INTERNAL_ONLY
, no external ALB will be created. Similarly, no internal ALB
will be created if all defined as EXTERNAL_ONLY
.
VPC Subnets
By default, all tasks will be deployed in the private subnets. You will need the NAT gateway for the default route associated with the private subnets to ensure the task can successfully pull the container images.
However, you are allowed to specify vpcSubnets
to customize the subnet selection.
To deploy all tasks in public subnets, one per AZ:
# Example automatically generated without compilation. See https://github.com/aws/jsii/issues/826
AlbFargateServices(stack, "Service",
vpc_subnets={
"subnet_type": ec2.SubnetType.PUBLIC,
"one_per_az": True
}, ...
)
This will implicitly enable the auto assign public IP
for each fargate task so the task can successfully pull the container images from external registry. However, the ingress traffic will still be balanced via the external ALB.
To deploy all tasks in specific subnets:
# Example automatically generated without compilation. See https://github.com/aws/jsii/issues/826
AlbFargateServices(stack, "Service",
vpc_subnets={
"subnets": [
ec2.Subnet.from_subnet_id(stack, "sub-1a", "subnet-0e9460dbcfc4cf6ee"),
ec2.Subnet.from_subnet_id(stack, "sub-1b", "subnet-0562f666bdf5c29af"),
ec2.Subnet.from_subnet_id(stack, "sub-1c", "subnet-00ab15c0022872f06")
]
}, ...
)
Sample Application
This repository comes with a sample applicaiton with 3 services in Golang. On deployment, the Order
service will be exposed externally on external ALB port 80
and all requests to the Order
service will trigger sub-requests internally to another other two services(product
and customer
) through the internal ALB and eventually aggregate the response back to the client.
Deploy
To deploy the sample application in you default VPC:
// install first
$ yarn install
$ npx cdk diff -c use_default_vpc=1
$ npx cdk deploy -c use_default_vpc=1
On deployment complete, you will see the external ALB endpoint in the CDK output. cURL
the external HTTP endpoint and you should be able to see the aggregated response.
$ curl http://demo-Servi-EH1OINYDWDU9-1397122594.ap-northeast-1.elb.amazonaws.com
{"service":"order", "version":"1.0"}
{"service":"product","version":"1.0"}
{"service":"customer","version":"1.0"}
Security
See CONTRIBUTING for more information.
License
This library is licensed under the MIT-0 License. See the LICENSE file.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for serverless-container-constructs-0.1.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0116e971306d10f115f344d38f49c05ea21498df60d75dfce49091b5f2aeb8b9 |
|
MD5 | 533668ff89a9abfea3649777f81cb751 |
|
BLAKE2b-256 | 286bed4be68eaab653d1aecf0c22d5c081523cbeda8426605f33f84417811f5a |
Hashes for serverless_container_constructs-0.1.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dcfd85397b08d85b22091393366e2fa1721b38cde240ff86a03dbe555ff281b4 |
|
MD5 | a29cb5f534324ca78ceb5e16be57814c |
|
BLAKE2b-256 | 072f1449e6deb7d24638d17ff22db462eb40aa1d1dd38b78481e5fb542e174ec |