Automated AWS Bill Reminder System using Serverless Architecture with AWS Lambda
Tags: aws, lambda, automation, bill
Published: 2024-03-23 20:52:08

The aim is to develop a serverless system using AWS Lambda to notify users when their AWS bill is pending, to ensure timely payment and avoid disruptions to AWS services.

Components:

* AWS Lambda Functions: Use Lambda functions to periodically check the status of AWS billing and send notifications to users when their bills are pending.
* AWS Billing and Cost Management: Utilize AWS Billing and Cost Management services to retrieve billing information and check the status of pending bills.
* Amazon SNS: Use Amazon Simple Notification Service (SNS) to send email notifications to users when their AWS bills are pending.
* AWS CloudWatch Events: Set up CloudWatch Events to trigger Lambda functions at regular intervals for checking the billing status.
* AWS SDKs: Leverage AWS SDKs (e.g., Boto3 for Python) to interact with AWS services programmatically and automate billing notifications.

Steps to Implement:

Set up IAM Roles:
- To send notifications via Amazon SNS and use AWS Billing and Cost Management services, create an IAM role with the necessary permissions.

Write Lambda Function:
- Develop a Lambda function that retrieves billing information using the AWS SDK. 
- Implement logic to check if the bill is pending and trigger a notification if necessary.

Configure CloudWatch Event Rule:
- Set up a CloudWatch Event rule to trigger the Lambda function at regular intervals (e.g., daily, weekly) to check the billing status.

Implement Notification Logic:
- Use the SNS service to send email notifications to users when their AWS bills are pending.
- Customize the notification message with relevant billing details and instructions for payment.

Handle Error Cases:
- Incorporate error handling into the Lambda function to handle exceptions, including failed service requests and incorrectly retrieved billing data.
- Configure appropriate logging and monitoring using CloudWatch to track function executions and errors.

Testing:
- Test the Lambda function and CloudWatch Event rule to ensure they trigger notifications correctly based on the billing status.
- Verify that users receive notifications as expected and that the notification content is accurate.

Deployment:
- Deploy the Lambda function and CloudWatch Event rule in the AWS account where billing notifications are required.
- Configure necessary permissions and IAM roles for the Lambda function to access AWS Billing and SNS services.

Monitor and Maintain:
- Monitor the execution of Lambda functions and CloudWatch Events to ensure they run as scheduled and handle any failures or exceptions promptly.
- Periodically review and update the system to accommodate changes in AWS billing policies or user requirements.

Lambda Function:

```
import json
import boto3

def lambda_handler(event, context):
    # Initialize AWS services
    sns_client = boto3.client('sns')
    billing_client = boto3.client('ce')  # AWS Cost Explorer

    # Retrieve billing information
    response = billing_client.get_cost_and_usage(
        TimePeriod={
            'Start': '2024-01-01',
            'End': '2024-03-01'  # Modify the date range as needed
        },
        Granularity='MONTHLY',
        Metrics=['UnblendedCost']  # You can customize the metrics as needed
    )

    # Extract the total cost for the current billing period
    total_cost = float(response['ResultsByTime'][0]['Total']['UnblendedCost']['Amount'])

    # Check if the bill is pending (total cost > 0)
    if total_cost > 0:
        # Send notification
        topic_arn = 'arn:aws:sns:ap-south-1:965519929135:awsBillNotification'  # Replace with your SNS topic ARN
        message = f'Your AWS bill for the current month is pending. Total amount due: ${total_cost:.2f}'
        subject = 'Action Required: Your AWS Bill is Pending'

        sns_client.publish(
            TopicArn=topic_arn,
            Message=message,
            Subject=subject
        )

        print('Billing notification sent successfully')
    else:
        print('No pending bills found')

    return {
        'statusCode': 200,
        'body': 'Billing notification process completed'
    }


```
Testing:

![Lambda Test](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j1dgcnox6h61v44hhimn.png)

Output:

![Email Output](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gsnwja9ji9dyutw0ei73.png)

[Find me Online!](https://beacons.ai/rahulsharma.rks)