Connection blocks for SSH in Terraform - Time & Space Complexity
When Terraform uses connection blocks for SSH, it needs to connect to each resource to run commands or provision. We want to understand how the time to complete these connections grows as we add more resources.
How does the number of SSH connections affect the total execution time?
Analyze the time complexity of the following Terraform connection block usage.
resource "aws_instance" "example" {
count = var.instance_count
ami = "ami-123456"
instance_type = "t2.micro"
connection {
type = "ssh"
user = "ec2-user"
private_key = file("~/.ssh/id_rsa")
host = self.public_ip
}
provisioner "remote-exec" {
inline = ["echo Hello World"]
}
}
This code creates multiple AWS instances and connects to each via SSH to run a command.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Establishing an SSH connection and running remote commands on each instance.
- How many times: Once per instance created (equal to
var.instance_count).
Each new instance requires a separate SSH connection and command execution. So, the total time grows directly with the number of instances.
| Input Size (n) | Approx. Api Calls/Operations |
|---|---|
| 10 | 10 SSH connections and command runs |
| 100 | 100 SSH connections and command runs |
| 1000 | 1000 SSH connections and command runs |
Pattern observation: The number of SSH operations increases linearly as the number of instances increases.
Time Complexity: O(n)
This means the total time to complete all SSH connections and commands grows directly in proportion to the number of instances.
[X] Wrong: "Connecting to all instances via SSH happens all at once, so time stays the same no matter how many instances."
[OK] Correct: Each SSH connection and command runs separately, so more instances mean more total time, not constant time.
Understanding how connection blocks scale helps you design infrastructure that runs efficiently and predict how long provisioning will take as your environment grows.
"What if we changed from SSH connections to a single centralized management system? How would the time complexity change?"
Practice
connection block in Terraform when using SSH?Solution
Step 1: Understand the role of connection blocks
Connection blocks specify how Terraform connects to remote machines, typically using SSH, to run commands or transfer files during provisioning.Step 2: Differentiate from other configurations
SSH key creation, cloud credentials, and backend storage are configured elsewhere, not in connection blocks.Final Answer:
To define how Terraform connects to remote machines for running commands or copying files -> Option BQuick Check:
Connection block purpose = Define SSH connection [OK]
- Confusing connection block with SSH key creation
- Mixing connection block with cloud provider config
- Thinking connection block manages backend storage
Solution
Step 1: Recall Terraform connection block syntax
The correct keys areuser,host, andprivate_key. Thetypekey is not required for SSH as it is the default.Step 2: Identify the valid syntax
connection { user = "ubuntu" host = self.public_ip private_key = file("~/.ssh/id_rsa") } uses correct keys without unnecessary or incorrect ones liketypeorprotocol.Final Answer:
connection { user = "ubuntu" host = self.public_ip private_key = file("~/.ssh/id_rsa") } -> Option DQuick Check:
Correct keys = user, host, private_key [OK]
- Adding unnecessary 'type' or 'protocol' keys
- Using wrong key names like ssh_user or username
- Omitting required keys like user or host
connection {
user = "admin"
host = aws_instance.example.public_ip
private_key = file("~/.ssh/id_rsa")
timeout = "2m"
}Solution
Step 1: Analyze connection block fields
The block correctly setsuser,host,private_key, andtimeout. Timeout accepts a duration string like "2m".Step 2: Understand Terraform SSH connection behavior
Terraform uses these values to connect via SSH as user 'admin' with a 2-minute timeout for connection attempts.Final Answer:
Terraform will connect using SSH as user 'admin' with a 2-minute timeout -> Option CQuick Check:
Timeout string '2m' is valid duration [OK]
- Thinking timeout must be numeric only
- Assuming default user is used ignoring 'user' key
- Believing timeout is ignored by Terraform
connection {
user = "ec2-user"
host = aws_instance.web.public_ip
private_key = "~/.ssh/id_rsa"
}Solution
Step 1: Check private_key value type
The private_key must contain the actual key content, not just the file path string. Usingfile("~/.ssh/id_rsa")reads the key content.Step 2: Validate other fields
Host can be a resource attribute, user can be 'ec2-user' for Amazon Linux, and 'type' defaults to SSH so it's optional.Final Answer:
private_key should use file() function to read the key content -> Option AQuick Check:
private_key needs file() to read key [OK]
- Assigning private_key a file path string directly
- Assuming host cannot be a resource attribute
- Forcing user to 'ubuntu' regardless of OS
Solution
Step 1: Choose correct user and host
For AWS Amazon Linux, user is usually 'ec2-user'. Public IP is needed for SSH from outside the VPC.Step 2: Set appropriate timeout and agent
A longer timeout like "5m" helps with slow connections. Using SSH agent forwarding (agent = true) can improve key management.Step 3: Compare options
connection { user = "ec2-user" host = aws_instance.app.public_ip private_key = file("~/.ssh/id_rsa") timeout = "5m" agent = true } uses correct user, public IP, sufficient timeout, and enables agent forwarding, matching best practices.Final Answer:
connection { user = "ec2-user" host = aws_instance.app.public_ip private_key = file("~/.ssh/id_rsa") timeout = "5m" agent = true } -> Option AQuick Check:
Public IP, correct user, timeout 5m, agent true = best practice [OK]
- Using private IP when public IP is needed
- Setting too short timeout causing failures
- Disabling agent forwarding unnecessarily
- Using wrong user for the OS
Ready to prove it?
Pass the test and this pattern moves unknown
