• resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header = var.preserve_host_headerresource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header =resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header = var.preserve_host_header var.preserve_host_header
  • Scalable infrastructure as code on AWS providing up to 70% cloud savings.
  • On-demand environments for 5x faster code deployment.
  • Experienced DevOps support for ongoing infrastructure management.
Plug ‘n’ play infrastructure-as-code: deploy 5x faster and cut cloud costs
by up to 70%
99.99%
guaranteed uptime
4 hrs/week
70%
time saved per developer
cloud cost savings
Our battle-tested infrastructure-as-code runs on Amazon AWS. It cuts your cloud costs, unlocks developer productivity and removes the need for an in-house DevOps team.
Kuttle: Your complete DevOps solution
Infrastructure as code
Serverless infrastructure as code (built with Terraform) for full control over configuration and provisioning.
Plug ‘n’ play
Optimized use of spot instances lowers your cloud costs by up to 70%.
Cuts cloud costs
Ensure performance and the best server prices as your application grows.
Designed to scale
The infrastructure is SOC2 Type 2 and ISO 27001 compliant and follow best practices in line with the AWS.
Compliant
DevOps support
We’ll handle all infrastructure maintenance tasks including updates, monitoring, security checks, and debugging.
Ongoing infrastructure maintenance
Developer self-service
Speed up testing with one-click environments and pre-built CI/CD scenarios
Self-service portal
Set, automate and change resource provisioning quickly.
Automated provisioning
Set permissions and enable single sign on (SSO).
User management
99.9% uptime with 2 hours SLA.
You own your infrastructure code and keep it if you leave us.
Uptime guaranteed
No vendor lock-in
We’ll take care of the migration to AWS ECS.
Managed transition
resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy =resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled =resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("",resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("",
Want to know how much you could save?
Join our public beta and learn how Kuttle can cut your infrastructure expenses and boost your team’s productivity.
Unlock developer productivity and allocate resources with ease
UAT, ephemeral, QA, and playground environments are all supported.
Versatile environments
Monitor your system state by viewing logs, metrics and traces.
Full observability
Turn environments on and off to save resources.
Increased savings
  • resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header = var.preserve_host_headerresource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header =resource "aws_security_group_rule" "http_ingress" count = module.this.enabled && var.security_group_enabled && var.http_enabled ? 1 : 0type = "ingressfrom_port = var.http_portto_port = var.http_portprotocol = "tcp"cidr_blocks = var.http_ingress_cidr_blocksprefix_list_ids = var.http_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}resource "aws_security_group_rule" "https_ingress" {count = module.this.enabled && var.security_group_enabled && var.https_enabled ? 1 : type = "ingressfrom_port = var.https_portto_port = var.https_portprotocol = "tcp"cidr_blocks = var.https_ingress_cidr_blocksprefix_list_ids = var.https_ingress_prefix_list_idssecurity_group_id = join("", aws_security_group.default.*.id)}module "access_logs" {source = "cloudposse/lb-s3-bucket/aws"version = "0.16.0"enabled = module.this.enabled && var.access_logs_enabled && var.access_logs_s3_bucket_id == nullattributes = compact(concat(module.this.attributes, ["alb", "access", "logs"]))force_destroy = var.alb_access_logs_s3_bucket_force_destroyforce_destroy_enabled = var.alb_access_logs_s3_bucket_force_destroy_enabledlifecycle_configuration_rules = var.lifecycle_configuration_rules# TODO: deprecate these inputs in favor of `lifecycle_configuration_rules`lifecycle_rule_enabled = var.lifecycle_rule_enabledenable_glacier_transition = var.enable_glacier_transitionexpiration_days = var.expiration_daysglacier_transition_days = var.glacier_transition_daysnoncurrent_version_expiration_days = var.noncurrent_version_expiration_daysnoncurrent_version_transition_days = var.noncurrent_version_transition_daysstandard_transition_days = var.standard_transition_dayscontext = module.this.context}module "default_load_balancer_label" {source = "cloudposse/label/null"version = "0.25.0 id_length_limit = var.load_balancer_name_max_lengthcontext = module.this.contextresource "aws_lb" "default" {#bridgecrew:skip=BC_AWS_NETWORKING_41 - Skipping Ensure that ALB Drops HTTP Headers#bridgecrew:skip=BC_AWS_LOGGING_22 - Skipping Ensure ELBv2 has Access Logging Enabledcount = module.this.enabled ? 1 : 0name = var.load_balancer_name == "" ? module.default_load_balancer_label.id : substr(var.load_balancer_name, 0, var.load_balancer_name_max_length)tags = module.this.tagsinternal = var.internalload_balancer_type = "application"security_groups = compact(concat(var.security_group_ids, [join("", aws_security_group.default.*.id)])) subnets = var.subnet_idsenable_cross_zone_load_balancing = var.cross_zone_load_balancing_enabledenable_http2 = var.http2_enabledidle_timeout = var.idle_timeouip_address_type var.ip_address_typeenable_deletion_protection = var.deletion_protection_enableddrop_invalid_header_fields = var.drop_invalid_header_fieldspreserve_host_header = var.preserve_host_header var.preserve_host_header
Out-of-the-box infrastructure as code, customized for you
Kuttle runs your applications purely and safely on spot instances, which means you pay bare minimum for the compute power.
Cut cloud costs by up to 70%
Kuttle takes care of your under-the-hood infrastructure. This means devs can use on-demand environments to focus on what they do best—creating fantastic products.
Let devs focus on what matters
You’ll have access to a 24/7 support team of DevOps professionals. A success manager we’ll be assigned to your account. We’ll also handle all aspects of migration and onboarding.
Fast migration and customer support
There are no long-term contracts and you’re free to take our code with you wherever you go.
No vendor lock-in
Fintech Startup
Saved 2hrs/week for 10 developers ($4500 savings
per month).

Cut monthly cloud costs by 70% from $10,000 to $3000.
$138,000
/year
Total savings:
Hear from some of our clients
Use Cases
Biotech AI startup
$318,000
/year
Total savings:
Saved 2hrs/week for 21 developers ($9000 savings per months).

Cut monthly cloud costs by 70% from $25,000 to $7500.
Early-stage SaaS startup
Total savings:
$46,800
on pay-as-you-go pricing
Saved 2hrs/week for 3 developers ($2700 savings per months).

Cut monthly cloud costs by 30% from $4000 to $2800.
/year
Frequently Asked Questions
KTL.AI, INC.
353 West 48th St
New York, NY 10036
hi@ktl.ai