Files
kodekloud-engineer/terraform/task-25.md

5.0 KiB

Assignment

During the migration process, the Nautilus DevOps team created several EC2 instances in different regions. They are currently in the process of identifying the correct resources and utilization and are making continuous changes to ensure optimal resource utilization. Recently, they discovered that one of the EC2 instances was underutilized, prompting them to decide to change the instance type. Please make sure the Status check is completed (if it's still in Initializing state) before making any changes to the instance.

Change the instance type from t2.micro to t2.nano for nautilus-ec2 instance using terraform.

Make sure the EC2 instance nautilus-ec2 is in running state after the change.

The Terraform working directory is /home/bob/terraform. Update the main.tf file (do not create a separate .tf file) to change the instance type.

Note: Right-click under the EXPLORER section in VS Code and select Open in Integrated Terminal to launch the terminal.

Solution

Change EC2 Instance Type — nautilus-ec2 (t2.micro → t2.nano)

This is an update to an already Terraform-managed instance, not a new resource. The instance definition already exists in main.tf from when it was created; the task is to change its instance_type and re-apply.

The change

Find the aws_instance block for nautilus-ec2 in the existing main.tf and change the single instance_type line:

 resource "aws_instance" "nautilus_ec2" {
   ami           = "ami-xxxxxxxxxxxxxxxxx"
-  instance_type = "t2.micro"
+  instance_type = "t2.nano"
   # ... key_name, vpc_security_group_ids, tags, etc. unchanged ...

   tags = {
     Name = "nautilus-ec2"
   }
 }

For reference, the full block looks like this after the edit (leave every other argument exactly as it already is — only instance_type changes):

resource "aws_instance" "nautilus_ec2" {
  ami           = "ami-xxxxxxxxxxxxxxxxx"   # keep the existing value
  instance_type = "t2.nano"                 # was t2.micro

  tags = {
    Name = "nautilus-ec2"
  }
}

Do not rewrite the block from scratch or change the resource's Terraform name, AMI, key, or security groups. Altering those could force a replacement (destroy + recreate) instead of an in-place modify. Only the one line changes.

How to run

cd /home/bob/terraform

# 1) Make sure status checks are done (not "Initializing") BEFORE changing anything.
aws ec2 describe-instance-status \
  --filters Name=tag:Name,Values=nautilus-ec2 \
  --query 'InstanceStatuses[0].{Instance:InstanceStatus.Status,System:SystemStatus.Status}'
# Wait until both report "ok" (2/2 checks passed). If it shows "initializing", wait and re-run.

# 2) Apply the instance-type change.
terraform plan     # should show ~ instance_type "t2.micro" -> "t2.nano" (update in place)
terraform apply -auto-approve

How it works

Why it's an in-place update, not a replacement

instance_type is a mutable attribute in EC2. Terraform's AWS provider changes it without destroying the instance: it stops the instance, issues ModifyInstanceAttribute to set the new type, then starts it again. You'll see this in the plan as ~ update in-place, not -/+ destroy and recreate. The instance keeps its ID, EBS volumes, private IP, and (if it has one) EIP association.

t2.micro and t2.nano are in the same family and share the same virtualization and architecture, so the modify is fully compatible — no AMI or platform mismatch.

Why wait for the status check first

The task calls this out specifically. Changing instance type requires the instance to be stopped momentarily. If the instance is still Initializing (status checks haven't reached 2/2), issuing a stop/modify mid-initialization can fail or leave the instance in an inconsistent state. Waiting until both the system and instance status checks report ok guarantees a clean stop → modify → start cycle.

Why it ends up running (requirement #2)

After a type change, the AWS provider automatically starts the instance back up and waits for it to reach the running state before apply returns. No extra configuration is needed — an aws_instance resource's desired state is running, so Terraform restores that after the modify. When apply completes, the instance is running as t2.nano.

If the instance isn't in Terraform state

The task says update main.tf, which means the instance is already managed here. If for some reason terraform plan reports it wants to create nautilus-ec2 (i.e. it's not in state), stop — that means the instance was made outside Terraform and you'd need to terraform import aws_instance.nautilus_ec2 <instance-id> first, then apply the type change. In the normal lab flow this isn't necessary.

Verify

aws ec2 describe-instances \
  --filters Name=tag:Name,Values=nautilus-ec2 \
  --query 'Reservations[0].Instances[0].{Id:InstanceId,Type:InstanceType,State:State.Name}'

Expected — the same instance ID as before, InstanceType: t2.nano, and State: running.