Skip to content

aws.ec2-launch-template resource

Description

LaunchTemplate is an EC2 launch template: a named, versioned object holding the configuration to launch instances from. Each change to the instance configuration is an immutable new version (CreateLaunchTemplateVersion), and the template's default version is set by a separate call (ModifyLaunchTemplate) rather than by editing a version in place. The template name is fixed at creation, so a change to it replaces the template; everything else lives under the data block and is reconciled by building a fresh version. The data block is built whole from the declared inputs each time, so a removed sub-block is simply absent from the next version, not cleared with a sentinel.

Several niche or legacy members of the SDK launch-template data are deliberately not modeled: kernel-id and ram-disk-id (legacy paravirtual fields), secondary-interfaces (a recent multi-interface block), and instance-requirements (the attribute-based instance-type selection tree). With instance-requirements absent, instance-type is a plain optional field.

Source: internal/service/ec2/launch_template_rsrc.go:35

Example usage:

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

resources: {
  example: aws.ec2-launch-template {
    # Set input fields here.
  }
}

Inputs

name

string

required

version-description

optional(string)

default-version

optional(integer)

update-default-version

optional(boolean)

tags

map(string)

data

object
object({
  image-id: optional(string)
  instance-type: optional(string)
  key-name: optional(string)
  user-data: optional(string)
  ebs-optimized: optional(boolean)
  disable-api-stop: optional(boolean)
  disable-api-termination: optional(boolean)
  instance-initiated-shutdown-behavior: optional(string)
  security-group-ids: optional(list(string))
  security-groups: optional(list(string))
  block-device-mappings: optional(
    list(
      object({
        device-name: optional(string)
        no-device: optional(string)
        virtual-name: optional(string)
        ebs: optional(
          object({
            delete-on-termination: optional(boolean)
            encrypted: optional(boolean)
            iops: optional(integer)
            kms-key-id: optional(string)
            snapshot-id: optional(string)
            throughput: optional(integer)
            volume-initialization-rate: optional(integer)
            volume-size: optional(integer)
            volume-type: optional(string)
          })
        )
      })
    )
  )
  network-interfaces: optional(
    list(
      object({
        associate-carrier-ip-address: optional(boolean)
        associate-public-ip-address: optional(boolean)
        delete-on-termination: optional(boolean)
        description: optional(string)
        device-index: optional(integer)
        interface-type: optional(string)
        ipv4-prefix-count: optional(integer)
        ipv4-prefixes: optional(list(string))
        ipv6-address-count: optional(integer)
        ipv6-addresses: optional(list(string))
        ipv6-prefix-count: optional(integer)
        ipv6-prefixes: optional(list(string))
        network-card-index: optional(integer)
        network-interface-id: optional(string)
        primary-ipv6: optional(boolean)
        private-ip-address: optional(string)
        ipv4-addresses: optional(list(string))
        ipv4-address-count: optional(integer)
        subnet-id: optional(string)
        groups: optional(list(string))
        ena-srd-specification: optional(
          object({
            ena-srd-enabled: optional(boolean)
            ena-srd-udp-specification: optional(
              object({
                ena-srd-udp-enabled: optional(boolean)
              })
            )
          })
        )
        connection-tracking-specification: optional(
          object({
            tcp-established-timeout: optional(integer)
            udp-stream-timeout: optional(integer)
            udp-timeout: optional(integer)
          })
        )
      })
    )
  )
  iam-instance-profile: optional(
    object({
      arn: optional(string)
      name: optional(string)
    })
  )
  monitoring: optional(
    object({
      enabled: optional(boolean)
    })
  )
  metadata-options: optional(
    object({
      http-endpoint: optional(string)
      http-protocol-ipv6: optional(string)
      http-put-response-hop-limit: optional(integer)
      http-tokens: optional(string)
      instance-metadata-tags: optional(string)
    })
  )
  placement: optional(
    object({
      affinity: optional(string)
      availability-zone: optional(string)
      availability-zone-id: optional(string)
      group-id: optional(string)
      group-name: optional(string)
      host-id: optional(string)
      host-resource-group-arn: optional(string)
      partition-number: optional(integer)
      spread-domain: optional(string)
      tenancy: optional(string)
    })
  )
  tag-specifications: optional(
    list(
      object({
        resource-type: optional(string)
        tags: map(string)
      })
    )
  )
  credit-specification: optional(
    object({
      cpu-credits: optional(string)
    })
  )
  cpu-options: optional(
    object({
      amd-sev-snp: optional(string)
      core-count: optional(integer)
      nested-virtualization: optional(string)
      threads-per-core: optional(integer)
    })
  )
  enclave-options: optional(
    object({
      enabled: optional(boolean)
    })
  )
  hibernation-options: optional(
    object({
      configured: optional(boolean)
    })
  )
  private-dns-name-options: optional(
    object({
      enable-resource-name-dns-aaaa-record: optional(boolean)
      enable-resource-name-dns-a-record: optional(boolean)
      hostname-type: optional(string)
    })
  )
  maintenance-options: optional(
    object({
      auto-recovery: optional(string)
    })
  )
  license-specifications: optional(
    list(
      object({
        license-configuration-arn: optional(string)
      })
    )
  )
  instance-market-options: optional(
    object({
      market-type: optional(string)
      spot-options: optional(
        object({
          block-duration-minutes: optional(integer)
          instance-interruption-behavior: optional(string)
          max-price: optional(string)
          spot-instance-type: optional(string)
          valid-until: optional(string)
        })
      )
    })
  )
  capacity-reservation-specification: optional(
    object({
      capacity-reservation-preference: optional(string)
      capacity-reservation-target: optional(
        object({
          capacity-reservation-id: optional(string)
          capacity-reservation-resource-group-arn: optional(string)
        })
      )
    })
  )
  network-performance-options: optional(
    object({
      bandwidth-weighting: optional(string)
    })
  )
})

required

Input Constraints

Field combinations

At most one of default-version or update-default-version.

Data rules

At most one of data.security-groups or data.security-group-ids.

At most one of data.iam-instance-profile.arn or data.iam-instance-profile.name.

At most one of data.placement.group-id or data.placement.group-name.

At most one of data.placement.host-resource-group-arn or data.placement.host-id.

At most one of data.capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id or data.capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn.

capacity-reservation-preference must be capacity-reservations-only, open, or none.

Rule logic
When
input.data.capacity-reservation-specification.capacity-reservation-preference != null
Require
input.data.capacity-reservation-specification.capacity-reservation-preference == 'capacity-reservations-only'
|| input.data.capacity-reservation-specification.capacity-reservation-preference == 'open'
|| input.data.capacity-reservation-specification.capacity-reservation-preference == 'none'

instance-initiated-shutdown-behavior must be stop or terminate.

Rule logic
When
input.data.instance-initiated-shutdown-behavior != null
Require
input.data.instance-initiated-shutdown-behavior == 'stop'
|| input.data.instance-initiated-shutdown-behavior == 'terminate'

credit-specification cpu-credits must be standard or unlimited.

Rule logic
When
input.data.credit-specification.cpu-credits != null
Require
input.data.credit-specification.cpu-credits == 'standard'
|| input.data.credit-specification.cpu-credits == 'unlimited'

cpu-options amd-sev-snp must be enabled or disabled.

Rule logic
When
input.data.cpu-options.amd-sev-snp != null
Require
input.data.cpu-options.amd-sev-snp == 'enabled'
|| input.data.cpu-options.amd-sev-snp == 'disabled'

cpu-options nested-virtualization must be enabled or disabled.

Rule logic
When
input.data.cpu-options.nested-virtualization != null
Require
input.data.cpu-options.nested-virtualization == 'enabled'
|| input.data.cpu-options.nested-virtualization == 'disabled'

placement tenancy must be default, dedicated, or host.

Rule logic
When
input.data.placement.tenancy != null
Require
input.data.placement.tenancy == 'default'
|| input.data.placement.tenancy == 'dedicated'
|| input.data.placement.tenancy == 'host'

private-dns-name-options hostname-type must be ip-name or resource-name.

Rule logic
When
input.data.private-dns-name-options.hostname-type != null
Require
input.data.private-dns-name-options.hostname-type == 'ip-name'
|| input.data.private-dns-name-options.hostname-type == 'resource-name'

maintenance-options auto-recovery must be default or disabled.

Rule logic
When
input.data.maintenance-options.auto-recovery != null
Require
input.data.maintenance-options.auto-recovery == 'default'
|| input.data.maintenance-options.auto-recovery == 'disabled'

network-performance-options bandwidth-weighting must be default, vpc-1, or ebs-1.

Rule logic
When
input.data.network-performance-options.bandwidth-weighting != null
Require
input.data.network-performance-options.bandwidth-weighting == 'default'
|| input.data.network-performance-options.bandwidth-weighting == 'vpc-1'
|| input.data.network-performance-options.bandwidth-weighting == 'ebs-1'

instance-market-options market-type must be a valid market type.

Rule logic
When
input.data.instance-market-options.market-type != null
Require
input.data.instance-market-options.market-type == 'spot'
|| input.data.instance-market-options.market-type == 'capacity-block'
|| input.data.instance-market-options.market-type == 'interruptible-capacity-reservation'

spot-options instance-interruption-behavior must be hibernate, stop, or terminate.

Rule logic
When
input.data.instance-market-options.spot-options.instance-interruption-behavior != null
Require
input.data.instance-market-options.spot-options.instance-interruption-behavior == 'hibernate'
|| input.data.instance-market-options.spot-options.instance-interruption-behavior == 'stop'
|| input.data.instance-market-options.spot-options.instance-interruption-behavior == 'terminate'

spot-options spot-instance-type must be one-time or persistent.

Rule logic
When
input.data.instance-market-options.spot-options.spot-instance-type != null
Require
input.data.instance-market-options.spot-options.spot-instance-type == 'one-time'
|| input.data.instance-market-options.spot-options.spot-instance-type == 'persistent'

metadata-options http-endpoint must be enabled or disabled.

Rule logic
When
input.data.metadata-options.http-endpoint != null
Require
input.data.metadata-options.http-endpoint == 'enabled'
|| input.data.metadata-options.http-endpoint == 'disabled'

metadata-options http-tokens must be optional or required.

Rule logic
When
input.data.metadata-options.http-tokens != null
Require
input.data.metadata-options.http-tokens == 'optional'
|| input.data.metadata-options.http-tokens == 'required'

metadata-options http-protocol-ipv6 must be enabled or disabled.

Rule logic
When
input.data.metadata-options.http-protocol-ipv6 != null
Require
input.data.metadata-options.http-protocol-ipv6 == 'enabled'
|| input.data.metadata-options.http-protocol-ipv6 == 'disabled'

metadata-options instance-metadata-tags must be enabled or disabled.

Rule logic
When
input.data.metadata-options.instance-metadata-tags != null
Require
input.data.metadata-options.instance-metadata-tags == 'enabled'
|| input.data.metadata-options.instance-metadata-tags == 'disabled'

metadata-options http-put-response-hop-limit must be between 1 and 64.

Rule logic
When
input.data.metadata-options.http-put-response-hop-limit != null
Require
(input.data.metadata-options.http-put-response-hop-limit == null || input.data.metadata-options.http-put-response-hop-limit >= 1)
&& (input.data.metadata-options.http-put-response-hop-limit == null || input.data.metadata-options.http-put-response-hop-limit <= 64)

Version description rules

version-description must be at most 255 characters.

Rule logic
When
input.version-description != null
Require
input.version-description == null
|| input.version-description <= 255

Outputs

launch-template-id

string

latest-version

integer

default-version

integer