Provision a small, self-healing fleet of EC2 instances that automatically join an existing Teleport Cloud cluster. The nodes can run the Teleport Node, App, or Database services and implements AWS EC2 best practices.
- One-Command Deploy – Launches an Auto Scaling Group behind the scenes; nodes bootstrap themselves via cloud-init and join Teleport Cloud automatically.
 - Always-latest Build – Each instance queries the Teleport download endpoint and installs the newest stable Cloud release at boot.
 - Spot-friendly – Supports mixed-instance/spot policies for cost savings.
 - Integrated Observability – System, cloud-init and Teleport logs are streamed to a dedicated CloudWatch Log Group; optional SSM session transcripts to S3.
 - Database Service Ready – IAM & RDS/Redshift permissions wired in when
tp_config.db_service.enabled = true, enabling discovery and IAM auth. - Hygienic Networking & IAM – No public IPs, IMDSv2 enforced, least-priv policies, single inbound rule limited to the SG itself for Teleport gossip.
 
module "teleport_nodes" {
  source  = "github.com/cruxstack/terraform-aws-teleport-node"
  version = "x.x.x"
  tp_domain = "acme.teleport.sh"
  tp_join_config = {
    token_name = "iam-role"
  }
  vpc_id              = "vpc-1234567890abcdef"
  vpc_subnet_ids      = ["subnet-1234abcd", "subnet-5678efgh"]
}In addition to the variables documented below, this module includes several
other optional variables (e.g., name, tags, etc.) provided by the
cloudposse/label/null module. Please refer to its documentation
for more details on these variables.
| Name | Description | Type | Default | Required | 
|---|---|---|---|---|
tp_domain | 
Teleport Cloud cluster FQDN (e.g. example.teleport.sh). | 
string | 
— | yes | 
tp_join_config | 
Join token config.token_name (required) and optional method (iam | token). | 
object({...}) | 
— | yes | 
tp_edition | 
Teleport edition (cloud, ent, …). | 
string | 
"cloud" | 
no | 
tp_config | 
Extra Teleport service configuration (enable DB/App/SSH, label rules, etc.). | object({...}) | 
{} | 
no | 
instance_capacity | 
ASG desired/min/max. | object({...}) | 
{ min = 1, max = 3 } | 
no | 
instance_types | 
List of allowed instance types & weights. | list(object({...})) | 
see variables.tf | 
no | 
instance_key_name | 
Existing EC2 key-pair name (ssh access). | string | 
"" | 
no | 
instance_spot | 
Spot settings (enabled, allocation_strategy). | 
object({...}) | 
{ enabled = true } | 
no | 
logs_bucket_name | 
S3 bucket for generic logs (unused by SSM). | string | 
"" | 
no | 
ssm_sessions | 
Toggle SSM logging and target bucket. | object({...}) | 
{ enabled = false } | 
no | 
vpc_id | 
Target VPC ID. | string | 
— | yes | 
vpc_subnet_ids | 
Subnet IDs for the ASG. | list(string) | 
[] | 
yes | 
vpc_security_group_ids | 
Extra SGs to attach. | list(string) | 
[] | 
no | 
experimental_mode | 
Shorter CW log retention & zero-health refresh for dev. | bool | 
false | 
no | 
| Name | Description | 
|---|---|
teleport_version | 
The Teleport version installed on the nodes. | 
teleport_config | 
Fully-rendered Teleport YAML that was injected. | 
security_group_id | 
ID of the generated node SG. | 
security_group_name | 
Name of the generated node SG. |