Skip to content

aws.ecs-capacity-provider resource

Description

CapacityProvider manages an ECS capacity provider. Exactly one provider block is required: an Auto Scaling group provider is account-scoped and must not set cluster, while a Managed Instances provider is cluster-scoped and requires cluster. Tags are reconciled separately from provider settings.

The name and cluster inputs must match ^[0-9A-Za-z_-]{1,255}$, ARN fields get generic ARN validation, and allowed/excluded instance types are checked for length and ^[a-zA-Z0-9.*-]+$ in validate because those checks are not derivable constraints.

Source: internal/service/ecs/capacity_provider_rsrc.go:51

Example usage:

imports: {
  aws: 'github.com/cloudboss/unobin-library-aws'
}

resources: {
  example: aws.ecs-capacity-provider {
    # Set input fields here.
  }
}

Inputs

name

string

required

cluster

optional(string)

auto-scaling-group-provider

optional(object)
optional(
  object({
    auto-scaling-group-arn: string
    managed-draining: optional(string)
    managed-scaling: optional(
      object({
        instance-warmup-period: optional(integer)
        maximum-scaling-step-size: optional(integer)
        minimum-scaling-step-size: optional(integer)
        status: optional(string)
        target-capacity: optional(integer)
      })
    )
    managed-termination-protection: optional(string)
  })
)

managed-instances-provider

optional(object)
optional(
  object({
    auto-repair-configuration: optional(
      object({
        actions-status: optional(string)
      })
    )
    infrastructure-optimization: optional(
      object({
        scale-in-after: optional(integer)
      })
    )
    infrastructure-role-arn: string
    instance-launch-template: object({
      capacity-option-type: optional(string)
      capacity-reservations: optional(
        object({
          reservation-group-arn: optional(string)
          reservation-preference: optional(string)
        })
      )
      ec2-instance-profile-arn: string
      fips-enabled: optional(boolean)
      instance-metadata-tags-propagation: optional(boolean)
      instance-requirements: optional(
        object({
          memory-mib: object({
            min: integer
            max: optional(integer)
          })
          vcpu-count: object({
            min: integer
            max: optional(integer)
          })
          accelerator-count: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          accelerator-manufacturers: list(string)
          accelerator-names: list(string)
          accelerator-total-memory-mib: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          accelerator-types: list(string)
          allowed-instance-types: list(string)
          bare-metal: optional(string)
          baseline-ebs-bandwidth-mbps: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          burstable-performance: optional(string)
          cpu-manufacturers: list(string)
          excluded-instance-types: list(string)
          instance-generations: list(string)
          local-storage: optional(string)
          local-storage-types: list(string)
          max-spot-price-as-percentage-of-optimal-on-demand-price: optional(integer)
          memory-gib-per-vcpu: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
          network-bandwidth-gbps: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
          network-interface-count: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          on-demand-max-price-percentage-over-lowest-price: optional(integer)
          require-hibernate-support: optional(boolean)
          spot-max-price-percentage-over-lowest-price: optional(integer)
          total-local-storage-gb: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
        })
      )
      local-storage-configuration: optional(
        object({
          use-local-storage: boolean
        })
      )
      monitoring: optional(string)
      network-configuration: object({
        security-groups: list(string)
        subnets: list(string)
      })
      storage-configuration: optional(
        object({
          storage-size-gib: integer
        })
      )
    })
    propagate-tags: optional(string)
  })
)

tags

map(string)

Input Constraints

Field combinations

Exactly one of auto-scaling-group-provider or managed-instances-provider.

Forbidden together: auto-scaling-group-provider and cluster.

Managed instances provider rules

cluster is required with managed-instances-provider.

Rule logic
When
input.managed-instances-provider != null
Require
input.cluster != null

auto-repair actions-status must be ENABLED or DISABLED.

Rule logic
When
input.managed-instances-provider.auto-repair-configuration.actions-status != null
Require
input.managed-instances-provider.auto-repair-configuration.actions-status == 'ENABLED'
|| input.managed-instances-provider.auto-repair-configuration.actions-status == 'DISABLED'

scale-in-after must be between -1 and 3600.

Rule logic
When
input.managed-instances-provider.infrastructure-optimization.scale-in-after != null
Require
(input.managed-instances-provider.infrastructure-optimization.scale-in-after == null || input.managed-instances-provider.infrastructure-optimization.scale-in-after >= -1)
&& (input.managed-instances-provider.infrastructure-optimization.scale-in-after == null || input.managed-instances-provider.infrastructure-optimization.scale-in-after <= 3600)

capacity-option-type must be ON_DEMAND, SPOT, or RESERVED.

Rule logic
When
input.managed-instances-provider.instance-launch-template.capacity-option-type != null
Require
input.managed-instances-provider.instance-launch-template.capacity-option-type == 'ON_DEMAND'
|| input.managed-instances-provider.instance-launch-template.capacity-option-type == 'SPOT'
|| input.managed-instances-provider.instance-launch-template.capacity-option-type == 'RESERVED'

managed instances network-configuration subnets must not be empty.

Rule logic
When
input.managed-instances-provider != null
Require
input.managed-instances-provider.instance-launch-template.network-configuration.subnets != null
&& @core.length(input.managed-instances-provider.instance-launch-template.network-configuration.subnets) >= 1

monitoring must be BASIC or DETAILED.

Rule logic
When
input.managed-instances-provider.instance-launch-template.monitoring != null
Require
input.managed-instances-provider.instance-launch-template.monitoring == 'BASIC'
|| input.managed-instances-provider.instance-launch-template.monitoring == 'DETAILED'

reservation-preference must be a valid capacity reservation preference.

Rule logic
When
input.managed-instances-provider.instance-launch-template.capacity-reservations.reservation-preference != null
Require
input.managed-instances-provider.instance-launch-template.capacity-reservations.reservation-preference == 'RESERVATIONS_ONLY'
|| input.managed-instances-provider.instance-launch-template.capacity-reservations.reservation-preference == 'RESERVATIONS_FIRST'
|| input.managed-instances-provider.instance-launch-template.capacity-reservations.reservation-preference == 'RESERVATIONS_EXCLUDED'

propagate-tags must be CAPACITY_PROVIDER or NONE.

Rule logic
When
input.managed-instances-provider.propagate-tags != null
Require
input.managed-instances-provider.propagate-tags == 'CAPACITY_PROVIDER'
|| input.managed-instances-provider.propagate-tags == 'NONE'

allowed-instance-types allows at most 400 entries.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.allowed-instance-types != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.allowed-instance-types == null
|| @core.length(input.managed-instances-provider.instance-launch-template.instance-requirements.allowed-instance-types) <= 400

excluded-instance-types allows at most 400 entries.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.excluded-instance-types != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.excluded-instance-types == null
|| @core.length(input.managed-instances-provider.instance-launch-template.instance-requirements.excluded-instance-types) <= 400

memory-mib and vcpu-count ranges must be at least 1.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.memory-mib.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.memory-mib.min >= 1)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.memory-mib.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.memory-mib.max >= 1)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.vcpu-count.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.vcpu-count.min >= 1)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.vcpu-count.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.vcpu-count.max >= 1)

accelerator-count range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-count != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-count.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-count.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-count.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-count.max >= 0)

accelerator-total-memory-mib range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-total-memory-mib != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-total-memory-mib.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-total-memory-mib.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-total-memory-mib.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-total-memory-mib.max >= 0)

baseline-ebs-bandwidth-mbps range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.baseline-ebs-bandwidth-mbps != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.baseline-ebs-bandwidth-mbps.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.baseline-ebs-bandwidth-mbps.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.baseline-ebs-bandwidth-mbps.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.baseline-ebs-bandwidth-mbps.max >= 0)

memory-gib-per-vcpu range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.memory-gib-per-vcpu != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.memory-gib-per-vcpu.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.memory-gib-per-vcpu.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.memory-gib-per-vcpu.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.memory-gib-per-vcpu.max >= 0)

network-bandwidth-gbps range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.network-bandwidth-gbps != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.network-bandwidth-gbps.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.network-bandwidth-gbps.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.network-bandwidth-gbps.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.network-bandwidth-gbps.max >= 0)

network-interface-count range must be at least 1.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.network-interface-count != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.network-interface-count.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.network-interface-count.min >= 1)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.network-interface-count.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.network-interface-count.max >= 1)

storage-size-gib must be at least 1.

Rule logic
When
input.managed-instances-provider.instance-launch-template.storage-configuration != null
Require
input.managed-instances-provider.instance-launch-template.storage-configuration.storage-size-gib == null
|| input.managed-instances-provider.instance-launch-template.storage-configuration.storage-size-gib >= 1

total-local-storage-gb range must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.total-local-storage-gb != null
Require
(input.managed-instances-provider.instance-launch-template.instance-requirements.total-local-storage-gb.min == null || input.managed-instances-provider.instance-launch-template.instance-requirements.total-local-storage-gb.min >= 0)
&& (input.managed-instances-provider.instance-launch-template.instance-requirements.total-local-storage-gb.max == null || input.managed-instances-provider.instance-launch-template.instance-requirements.total-local-storage-gb.max >= 0)

bare-metal must be included, required, or excluded.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.bare-metal != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.bare-metal == 'included'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.bare-metal == 'required'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.bare-metal == 'excluded'

burstable-performance must be included, required, or excluded.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.burstable-performance != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.burstable-performance == 'included'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.burstable-performance == 'required'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.burstable-performance == 'excluded'

local-storage must be included, required, or excluded.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.local-storage != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.local-storage == 'included'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.local-storage == 'required'
|| input.managed-instances-provider.instance-launch-template.instance-requirements.local-storage == 'excluded'

max-spot-price-as-percentage-of-optimal-on-demand-price must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.max-spot-price-as-percentage-of-optimal-on-demand-price != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.max-spot-price-as-percentage-of-optimal-on-demand-price == null
|| input.managed-instances-provider.instance-launch-template.instance-requirements.max-spot-price-as-percentage-of-optimal-on-demand-price >= 0

on-demand-max-price-percentage-over-lowest-price must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.on-demand-max-price-percentage-over-lowest-price != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.on-demand-max-price-percentage-over-lowest-price == null
|| input.managed-instances-provider.instance-launch-template.instance-requirements.on-demand-max-price-percentage-over-lowest-price >= 0

spot-max-price-percentage-over-lowest-price must be at least 0.

Rule logic
When
input.managed-instances-provider.instance-launch-template.instance-requirements.spot-max-price-percentage-over-lowest-price != null
Require
input.managed-instances-provider.instance-launch-template.instance-requirements.spot-max-price-percentage-over-lowest-price == null
|| input.managed-instances-provider.instance-launch-template.instance-requirements.spot-max-price-percentage-over-lowest-price >= 0

accelerator-manufacturers entries must be valid.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-manufacturers
Require
@each.value == 'amazon-web-services'
|| @each.value == 'amd'
|| @each.value == 'nvidia'
|| @each.value == 'xilinx'
|| @each.value == 'habana'

accelerator-names entries must be valid.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-names
Require
@each.value == 'a100'
|| @each.value == 'inferentia'
|| @each.value == 'k520'
|| @each.value == 'k80'
|| @each.value == 'm60'
|| @each.value == 'radeon-pro-v520'
|| @each.value == 't4'
|| @each.value == 'vu9p'
|| @each.value == 'v100'
|| @each.value == 'a10g'
|| @each.value == 'h100'
|| @each.value == 't4g'

accelerator-types entries must be gpu, fpga, or inference.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.accelerator-types
Require
@each.value == 'gpu'
|| @each.value == 'fpga'
|| @each.value == 'inference'

cpu-manufacturers entries must be valid.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.cpu-manufacturers
Require
@each.value == 'intel'
|| @each.value == 'amd'
|| @each.value == 'amazon-web-services'

instance-generations entries must be current or previous.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.instance-generations
Require
@each.value == 'current'
|| @each.value == 'previous'

local-storage-types entries must be hdd or ssd.

Rule logic
For each
input.managed-instances-provider.instance-launch-template.instance-requirements.local-storage-types
Require
@each.value == 'hdd'
|| @each.value == 'ssd'

Auto scaling group provider rules

managed-draining must be ENABLED or DISABLED.

Rule logic
When
input.auto-scaling-group-provider.managed-draining != null
Require
input.auto-scaling-group-provider.managed-draining == 'ENABLED'
|| input.auto-scaling-group-provider.managed-draining == 'DISABLED'

managed-termination-protection must be ENABLED or DISABLED.

Rule logic
When
input.auto-scaling-group-provider.managed-termination-protection != null
Require
input.auto-scaling-group-provider.managed-termination-protection == 'ENABLED'
|| input.auto-scaling-group-provider.managed-termination-protection == 'DISABLED'

managed-scaling status must be ENABLED or DISABLED.

Rule logic
When
input.auto-scaling-group-provider.managed-scaling.status != null
Require
input.auto-scaling-group-provider.managed-scaling.status == 'ENABLED'
|| input.auto-scaling-group-provider.managed-scaling.status == 'DISABLED'

instance-warmup-period must be between 0 and 10000.

Rule logic
When
input.auto-scaling-group-provider.managed-scaling.instance-warmup-period != null
Require
(input.auto-scaling-group-provider.managed-scaling.instance-warmup-period == null || input.auto-scaling-group-provider.managed-scaling.instance-warmup-period >= 0)
&& (input.auto-scaling-group-provider.managed-scaling.instance-warmup-period == null || input.auto-scaling-group-provider.managed-scaling.instance-warmup-period <= 10000)

maximum-scaling-step-size must be between 1 and 10000.

Rule logic
When
input.auto-scaling-group-provider.managed-scaling.maximum-scaling-step-size != null
Require
(input.auto-scaling-group-provider.managed-scaling.maximum-scaling-step-size == null || input.auto-scaling-group-provider.managed-scaling.maximum-scaling-step-size >= 1)
&& (input.auto-scaling-group-provider.managed-scaling.maximum-scaling-step-size == null || input.auto-scaling-group-provider.managed-scaling.maximum-scaling-step-size <= 10000)

minimum-scaling-step-size must be between 1 and 10000.

Rule logic
When
input.auto-scaling-group-provider.managed-scaling.minimum-scaling-step-size != null
Require
(input.auto-scaling-group-provider.managed-scaling.minimum-scaling-step-size == null || input.auto-scaling-group-provider.managed-scaling.minimum-scaling-step-size >= 1)
&& (input.auto-scaling-group-provider.managed-scaling.minimum-scaling-step-size == null || input.auto-scaling-group-provider.managed-scaling.minimum-scaling-step-size <= 10000)

target-capacity must be between 1 and 100.

Rule logic
When
input.auto-scaling-group-provider.managed-scaling.target-capacity != null
Require
(input.auto-scaling-group-provider.managed-scaling.target-capacity == null || input.auto-scaling-group-provider.managed-scaling.target-capacity >= 1)
&& (input.auto-scaling-group-provider.managed-scaling.target-capacity == null || input.auto-scaling-group-provider.managed-scaling.target-capacity <= 100)

Outputs

arn

string

capacity-provider-arn

string

status

string

update-status

string

update-status-reason

optional(string)

tags

map(string)

auto-scaling-group-provider

optional(object)
optional(
  object({
    auto-scaling-group-arn: string
    managed-draining: optional(string)
    managed-scaling: optional(
      object({
        instance-warmup-period: optional(integer)
        maximum-scaling-step-size: optional(integer)
        minimum-scaling-step-size: optional(integer)
        status: optional(string)
        target-capacity: optional(integer)
      })
    )
    managed-termination-protection: optional(string)
  })
)

managed-instances-provider

optional(object)
optional(
  object({
    auto-repair-configuration: optional(
      object({
        actions-status: optional(string)
      })
    )
    infrastructure-optimization: optional(
      object({
        scale-in-after: optional(integer)
      })
    )
    infrastructure-role-arn: string
    instance-launch-template: object({
      capacity-option-type: optional(string)
      capacity-reservations: optional(
        object({
          reservation-group-arn: optional(string)
          reservation-preference: optional(string)
        })
      )
      ec2-instance-profile-arn: string
      fips-enabled: optional(boolean)
      instance-metadata-tags-propagation: optional(boolean)
      instance-requirements: optional(
        object({
          memory-mib: object({
            min: integer
            max: optional(integer)
          })
          vcpu-count: object({
            min: integer
            max: optional(integer)
          })
          accelerator-count: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          accelerator-manufacturers: list(string)
          accelerator-names: list(string)
          accelerator-total-memory-mib: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          accelerator-types: list(string)
          allowed-instance-types: list(string)
          bare-metal: optional(string)
          baseline-ebs-bandwidth-mbps: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          burstable-performance: optional(string)
          cpu-manufacturers: list(string)
          excluded-instance-types: list(string)
          instance-generations: list(string)
          local-storage: optional(string)
          local-storage-types: list(string)
          max-spot-price-as-percentage-of-optimal-on-demand-price: optional(integer)
          memory-gib-per-vcpu: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
          network-bandwidth-gbps: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
          network-interface-count: optional(
            object({
              max: optional(integer)
              min: optional(integer)
            })
          )
          on-demand-max-price-percentage-over-lowest-price: optional(integer)
          require-hibernate-support: optional(boolean)
          spot-max-price-percentage-over-lowest-price: optional(integer)
          total-local-storage-gb: optional(
            object({
              max: optional(number)
              min: optional(number)
            })
          )
        })
      )
      local-storage-configuration: optional(
        object({
          use-local-storage: boolean
        })
      )
      monitoring: optional(string)
      network-configuration: object({
        security-groups: list(string)
        subnets: list(string)
      })
      storage-configuration: optional(
        object({
          storage-size-gib: integer
        })
      )
    })
    propagate-tags: optional(string)
  })
)