DEV Community

Cover image for Building an NBA Game Day Notification System with AWS Lambda, SNS & EventBridge
Joseph Ibeh
Joseph Ibeh

Posted on

1 1 1 1 1

Building an NBA Game Day Notification System with AWS Lambda, SNS & EventBridge

🏀 NBA Game Day Notification System

This project is an AWS Lambda-powered notification system that sends NBA game updates via Amazon SNS (Simple Notification Service). It fetches game details from SportsData.io and notifies subscribed users via email. The function runs on a scheduled Amazon EventBridge rule.

Features

  • Fetches NBA game data from SportsData.io API
  • Sends real-time updates on game status, scores, and channels
  • Uses AWS Lambda, SNS, and EventBridge for automation
  • Supports multiple game statuses: Final, In Progress, and Scheduled

Prerequisites

Before deploying, ensure you have:

  • AWS Account with Lambda, SNS, and EventBridge permissions
  • SportsData.io API Key (Create a free API key here)
  • Email Subscription to the SNS topic

Setup Instructions


1️⃣ Create an SNS Topic

  • Open AWS SNS and create a new topic named gd_topic.
  • Subscribe an email address to this topic and confirm the email subscription.

sns topic

subscribe topic


2️⃣ Create an IAM Role for Lambda

  • Open IAMRolesCreate Role.
  • Select AWS Service → Lambda.
  • Attach the AmazonSNSFullAccess policy.
  • Create a custom JSON policy with the following:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:us-east-1:XXXXXXXXXXXX:gd_topic"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Replace XXXXXXXXXXXX with your AWS Account ID.

  • Name the role gd_lambda_role and attach it to your Lambda function.

role and policy


3️⃣ Deploy the AWS Lambda Function

  • Navigate to AWS LambdaCreate FunctionAuthor from Scratch.
  • Function Name: gd_notification
  • Runtime: Python 3.13
  • Attach gd_lambda_role to the function.
  • Paste the following Python script into the function editor:
import os
import json
import urllib.request
import boto3
from datetime import datetime, timedelta, timezone

# Function to format NBA game data
def format_game_data(game):
    status = game.get("Status", "Unknown")
    away_team = game.get("AwayTeam", "Unknown")
    home_team = game.get("HomeTeam", "Unknown")
    final_score = f"{game.get('AwayTeamScore', 'N/A')}-{game.get('HomeTeamScore', 'N/A')}"
    start_time = game.get("DateTime", "Unknown")
    channel = game.get("Channel", "Unknown")

    if status == "Final":
        return f"Game Status: {status}\n{away_team} vs {home_team}\nFinal Score: {final_score}\nStart Time: {start_time}\nChannel: {channel}\n"
    elif status == "InProgress":
        return f"Game Status: {status}\n{away_team} vs {home_team}\nCurrent Score: {final_score}\nChannel: {channel}\n"
    elif status == "Scheduled":
        return f"Game Status: {status}\n{away_team} vs {home_team}\nStart Time: {start_time}\nChannel: {channel}\n"
    else:
        return f"Game Status: {status}\n{away_team} vs {home_team}\nDetails are unavailable.\n"

# Lambda function handler
def lambda_handler(event, context):
    api_key = os.getenv("NBA_API_KEY")
    sns_topic_arn = os.getenv("SNS_TOPIC_ARN")
    sns_client = boto3.client("sns")

    utc_now = datetime.now(timezone.utc)
    today_date = (utc_now - timedelta(hours=6)).strftime("%Y-%m-%d")
    api_url = f"https://api.sportsdata.io/v3/nba/scores/json/GamesByDate/{today_date}?key={api_key}"

    try:
        with urllib.request.urlopen(api_url) as response:
            data = json.loads(response.read().decode())
    except Exception as e:
        print(f"Error fetching data: {e}")
        return {"statusCode": 500, "body": "Error fetching data"}

    messages = [format_game_data(game) for game in data]
    final_message = "\n---\n".join(messages) if messages else "No games available for today."

    try:
        sns_client.publish(TopicArn=sns_topic_arn, Message=final_message, Subject="NBA Game Updates")
        print("Message published to SNS successfully.")
    except Exception as e:
        print(f"Error publishing to SNS: {e}")
        return {"statusCode": 500, "body": "Error publishing to SNS"}

    return {"statusCode": 200, "body": "Data processed and sent to SNS"}
Enter fullscreen mode Exit fullscreen mode

python script

  • Click Deploy.

test

  • Add Environment Variables:

    • NBA_API_KEY: Your SportsData.io API Key
    • SNS_TOPIC_ARN: ARN of your SNS Topic (e.g., arn:aws:sns:us-east-1:XXXXXXXXXXXX:gd_topic)

env variable

  • Increase timeout under General Configuration to 5 seconds or more.

timeout


4️⃣ Test the Lambda Function

  • Click Test, create a test event, and run it.
  • Check your email inbox for an NBA game update notification!

Email update


5️⃣ Automate with AWS EventBridge

  • Open Amazon EventBridgeCreate Rule
  • Rule Name: gd_rule
  • Schedule Pattern:
  0 9-23/2,0-2/2 * * ? *
Enter fullscreen mode Exit fullscreen mode

(Runs every 2 hours from 9 AM - 11 PM UTC and 12 AM - 2 AM UTC)

  • Target: AWS Lambda → NBA-GameDay-Notifier
  • Click Create Rule.

Event bridge


Email Notification

update

update 2


Summary

  • AWS SNS sends game notifications to subscribed emails.
  • AWS Lambda fetches NBA data and publishes updates.
  • Amazon EventBridge schedules function execution.

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more