DEV Community

Harshil Thummar
Harshil Thummar

Posted on

How to Receive Phone Call 📞 Alerts Using AWS CloudWatch, Lambda & Twilio

Alert Call

Imagine this: Your EC2 instance's CPU is suddenly spiking, but you miss the CloudWatch email alert buried under dozens of other notifications. What if, instead, your phone rings with a voice message warning you of the spike?

Welcome to a hands-on guide where we'll combine AWS Lambda, CloudWatch, and Twilio to send real-time phone call alerts whenever your EC2 instance breaches a certain threshold - no more missed alerts.

🔧 What You'll Build

By the end of this tutorial, you'll have a serverless system that:

  • Detects high CPU usage using CloudWatch
  • Sends an SNS notification
  • Triggers an AWS Lambda function
  • Uses Twilio to make a real phone call with a custom alert message

Let's jump right in!

📦 Step 1: Create the Lambda Function

Head over to the AWS Lambda Console and follow these steps:

  • Click "Create function."
  • Choose "Author from scratch."
  • Name it something like CallOnHighCPU
  • Runtime: Python 3.9 (or higher)
  • Click "Create function."

📞 Step 2: Package Twilio with Your Lambda Code

AWS Lambda doesn't include third-party packages by default. Let's package the Twilio SDK:

👉 On your local machine, run:

mkdir lambda_twilio && cd lambda_twilio pip install twilio -t . zip -r9 ../lambda_function.zip . 
Enter fullscreen mode Exit fullscreen mode

Now, add your Lambda function code.
Create a file called lambda_function.py inside lambda_twilio/:

import json import os from twilio.rest import Client TWILIO_ACCOUNT_SID = os.environ['TWILIO_ACCOUNT_SID'] TWILIO_AUTH_TOKEN = os.environ['TWILIO_AUTH_TOKEN'] TWILIO_PHONE_NUMBER = os.environ['TWILIO_PHONE_NUMBER'] YOUR_PHONE_NUMBER = os.environ['YOUR_PHONE_NUMBER'] def lambda_handler(event, context): try: sns_message = event['Records'][0]['Sns']['Message'] alarm_name = json.loads(sns_message).get("AlarmName", "Unknown Alert") metric_name = json.loads(sns_message).get("Trigger", {}).get("MetricName", "Unknown Metric") alert_message = f"Alert! {alarm_name} triggered due to high {metric_name} usage. Please check your server. Thanks!!" client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN) twiml_response = f""" <Response> <Say voice="man" language="en-US">{alert_message}</Say> </Response> """ call = client.calls.create( to=YOUR_PHONE_NUMBER, from_=TWILIO_PHONE_NUMBER, twiml=twiml_response ) print(f"Call initiated with SID: {call.sid}") return { 'statusCode': 200, 'body': json.dumps(f'Call initiated for {alarm_name}') } except Exception as e: print(f"Error: {str(e)}") return { 'statusCode': 500, 'body': json.dumps(f"Error: {str(e)}") } 
Enter fullscreen mode Exit fullscreen mode

Then, add it to your ZIP:

zip -g ../lambda_function.zip lambda_function.py 
Enter fullscreen mode Exit fullscreen mode

This zip now contains:

  • Your Lambda code
  • The Twilio SDK

☁️ Step 3: Upload to Lambda

Back in the AWS Lambda Console:

  1. Open your CallOnHighCPU function
  2. Go to Code → Choose "Upload from" → "ZIP file"
  3. Upload your lambda_function.zip
  4. Click Deploy

🔐 Step 4: Set Environment Variables

Still in the Lambda console:

  • Go to Configuration → Environment Variables → Edit
  • Add:
TWILIO_ACCOUNT_SID = <your Twilio SID> TWILIO_AUTH_TOKEN = <your Twilio token> TWILIO_PHONE_NUMBER = +1234567890 YOUR_PHONE_NUMBER = +9876543210 
Enter fullscreen mode Exit fullscreen mode

Save changes.

✨ If you don't have a Twilio account, create one. You'll get $15 free credit for testing.

🧪 Step 5: Test the Lambda Function

Click "Test" and create a new event:
Test Event JSON (SNS format):

{ "Records": [ { "Sns": { "Message": "{\"AlarmName\":\"HighCPUUsage\",\"Trigger\":{\"MetricName\":\"CPUUtilization\"}}" } } ] } 
Enter fullscreen mode Exit fullscreen mode

Run the test. Your phone should ring with the alert message. Magic!

📣 Step 6: Connect Lambda to SNS

Now, let's wire up SNS to trigger your function.

6.1: Create an SNS Topic

  1. Go to SNS Console
  2. Click Create Topic
  3. Type: Standard
  4. Name:HighCPUAlert
  5. Click Create Topic

6.2: Create a Subscription

  1. Open your HighCPUAlert topic
  2. Click Create Subscription
  3. Protocol: Lambda
  4. Endpoint: Select your CallOnHighCPU Lambda
  5. Click Create Subscription

📊 Step 7: Attach SNS to a CloudWatch Alarm

  1. Go to CloudWatch → Alarms → Create Alarm
  2. Choose EC2 → Per-Instance Metrics
  3. Select CPUUtilization for your instance
  4. Conditions:
  • Greater than 80%
  • For 2 periods of 5 minutes
  1. In actions, choose SNS topic → HighCPUAlert
  2. Click Create Alarm

🔥 Bonus: Trigger the Alarm with a CPU Spike

On your EC2 instance, simulate CPU load:

sudo apt install stress stress --cpu 2 --timeout 120s 
Enter fullscreen mode Exit fullscreen mode

Within minutes, CloudWatch will detect the spike, SNS will publish a message, Lambda will be triggered, and… your phone will ring.

🎉 You're Done!

You've successfully built a voice-based monitoring system using AWS Lambda, CloudWatch, SNS, and Twilio.
This solution is

  • Real-time
  • Reliable
  • Easy to extend

Need to alert a team? Add multiple Twilio calls. Want Slack integration instead? Swap Twilio with a Slack webhook.

🙌 Final Thoughts

Email alerts are great, but voice alerts are immediate, hard to ignore, and potentially life-saving in production environments.

With just a few lines of code and some AWS configuration, you now have an automated voice call alert system that keeps your infrastructure healthy and your response time sharp.

Top comments (0)