This repository contains a demo project created as part of my DevOps studies in the TechWorld with Nana – DevOps Bootcamp.
Demo Project: Health Check: EC2 Status Checks
Technologies used: Python, Boto3, AWS, Terraform
Project Description:
- Create EC2 Instances with Terraform
- Write a Python script that fetches statuses of EC2 Instances and prints to the console
- Extend the Python script to continuously check the status of EC2 Instances in a specific interval
Install Python dependencies with uv:
uv syncConfigure AWS credentials at ~/.aws/credentials:
[default]
aws_access_key_id = AKIA...
aws_secret_access_key = ...
And the default region at ~/.aws/config:
[default]
region = us-east-1
Create a Terraform variables file from the provided example:
cp terraform.tfvars.example terraform.tfvars-
Initialize Terraform to download the required providers:
terraform init
-
Review the execution plan and apply it:
terraform plan terraform apply --auto-approve
Option 1 — basic instance state
Use describe_instances to list every instance along with its current state (running, stopped, terminated, etc.):
import boto3
ec2_client = boto3.client('ec2', region_name="eu-west-3")
reservations = ec2_client.describe_instances()
for reservation in reservations['Reservations']:
instances = reservation['Instances']
for instance in instances:
print(f"Instance {instance['InstanceId']} is {instance['State']['Name']}")Run the script: main.py
To verify that the script reflects infrastructure changes, remove the third instance from main.tf and re-apply:
terraform apply --auto-approveThen run the script again: main.py
Option 2 — extended status checks
describe_instance_status returns the lifecycle state together with the EC2 system and instance reachability checks, giving a more complete view of instance health:
import boto3
ec2_client = boto3.client('ec2', region_name="eu-west-3")
statuses = ec2_client.describe_instance_status()
for status in statuses['InstanceStatuses']:
ins_status = status['InstanceStatus']['Status']
sys_status = status['SystemStatus']['Status']
state = status['InstanceState']['Name']
print(f"Instance {status['InstanceId']} is {state} with instance status is {ins_status} and system status {sys_status}")Make sure the schedule module is installed:
uv syncThe script below polls every 5 seconds and prints the state and both reachability checks for each instance. Passing IncludeAllInstances=True ensures stopped instances are reported as well:
import boto3
import schedule
import time
ec2_client = boto3.client('ec2', region_name="eu-west-3")
def check_instance_status():
statuses = ec2_client.describe_instance_status(
IncludeAllInstances=True
)
for status in statuses['InstanceStatuses']:
ins_status = status['InstanceStatus']['Status']
sys_status = status['SystemStatus']['Status']
state = status['InstanceState']['Name']
print(f"Instance {status['InstanceId']} is {state} with instance status is {ins_status} and system status {sys_status}")
print("###############################\n")
schedule.every(5).seconds.do(check_instance_status)
while True:
schedule.run_pending()
time.sleep(1)Once you are done, tear down the infrastructure to avoid unnecessary AWS charges:
terraform destroy




