<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ADEEL ABBAS</title>
    <description>The latest articles on DEV Community by ADEEL ABBAS (@adeelabbas).</description>
    <link>https://dev.to/adeelabbas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1969939%2Fe97e539f-858b-45a0-9dd5-0697a2a58dd4.jpeg</url>
      <title>DEV Community: ADEEL ABBAS</title>
      <link>https://dev.to/adeelabbas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adeelabbas"/>
    <language>en</language>
    <item>
      <title>Share your thoughts/suggestions 🙂</title>
      <dc:creator>ADEEL ABBAS</dc:creator>
      <pubDate>Fri, 02 Jan 2026 16:42:33 +0000</pubDate>
      <link>https://dev.to/adeelabbas/share-your-thoughtssuggestions-j92</link>
      <guid>https://dev.to/adeelabbas/share-your-thoughtssuggestions-j92</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/adeelabbas" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1969939%2Fe97e539f-858b-45a0-9dd5-0697a2a58dd4.jpeg" alt="adeelabbas"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/adeelabbas/automated-reporting-system-47ob" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Automated Reporting System&lt;/h2&gt;
      &lt;h3&gt;ADEEL ABBAS ・ Dec 31 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#lambda&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#s3&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#awscommunitybuilder&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
      <category>lambda</category>
      <category>s3</category>
      <category>awscommunitybuilder</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>ADEEL ABBAS</dc:creator>
      <pubDate>Thu, 01 Jan 2026 06:22:03 +0000</pubDate>
      <link>https://dev.to/adeelabbas/-1ba0</link>
      <guid>https://dev.to/adeelabbas/-1ba0</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/adeelabbas" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1969939%2Fe97e539f-858b-45a0-9dd5-0697a2a58dd4.jpeg" alt="adeelabbas"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/adeelabbas/automated-reporting-system-47ob" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Automated Reporting System&lt;/h2&gt;
      &lt;h3&gt;ADEEL ABBAS ・ Dec 31 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#lambda&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#s3&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#awscommunitybuilder&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
      <category>lambda</category>
      <category>s3</category>
      <category>awscommunitybuilder</category>
    </item>
    <item>
      <title>Automated Reporting System</title>
      <dc:creator>ADEEL ABBAS</dc:creator>
      <pubDate>Wed, 31 Dec 2025 15:49:13 +0000</pubDate>
      <link>https://dev.to/adeelabbas/automated-reporting-system-47ob</link>
      <guid>https://dev.to/adeelabbas/automated-reporting-system-47ob</guid>
      <description>&lt;p&gt;&lt;strong&gt;Overview&lt;/strong&gt;&lt;br&gt;
We’ll build a system using &lt;strong&gt;AWS Lambda&lt;/strong&gt; and other &lt;strong&gt;serverless&lt;/strong&gt; tools to automate daily &lt;strong&gt;reporting&lt;/strong&gt;. The system will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Collect data from multiple sources.&lt;/li&gt;
&lt;li&gt;   Generate a &lt;strong&gt;PDF&lt;/strong&gt; report.&lt;/li&gt;
&lt;li&gt;   Send the report via &lt;strong&gt;email&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;   Trigger this process &lt;strong&gt;daily&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This guide assumes you have a basic understanding of &lt;strong&gt;AWS&lt;/strong&gt;. Let’s start!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create an S3 Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;S3&lt;/strong&gt; service.&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Create bucket&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Name your bucket (e.g., &lt;code&gt;daily-reports-s3-bucket&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Keep other settings &lt;strong&gt;default&lt;/strong&gt; and click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; This bucket will &lt;strong&gt;store&lt;/strong&gt; the reports if needed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshz86eld3mi4fqpy77bx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshz86eld3mi4fqpy77bx.webp" alt="S3" width="800" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Verify an Email Address in SES&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Amazon SES&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Navigate to &lt;strong&gt;Email Addresses&lt;/strong&gt; under &lt;strong&gt;Identity Management&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Click Verify a &lt;strong&gt;New&lt;/strong&gt; Email Address and enter your &lt;strong&gt;email&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Check your email &lt;strong&gt;inbox&lt;/strong&gt; and click the &lt;strong&gt;verification link&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This allows &lt;strong&gt;SES&lt;/strong&gt; to send &lt;strong&gt;emails&lt;/strong&gt; from this address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdwrcfi7whnajybdkimh.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcdwrcfi7whnajybdkimh.webp" alt="SES" width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Write the Lambda Function&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Go to &lt;strong&gt;AWS Lambda&lt;/strong&gt; and click the &lt;strong&gt;Create function&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Choose:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;    &lt;strong&gt;Author from scratch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;    Function name: daily-report-lambda.&lt;/li&gt;
&lt;li&gt;    Runtime: &lt;code&gt;Python 3.9 (or later)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;   Click the &lt;strong&gt;Create&lt;/strong&gt; function.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Code for the Lambda Function&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scroll to the &lt;strong&gt;Code&lt;/strong&gt; section.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replace&lt;/strong&gt; the default code with the following:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3
from fpdf import FPDF
import os
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders

def lambda_handler(event, context):
    try:
        # Generate the PDF report
        pdf = FPDF()
        pdf.add_page()
        pdf.set_font("Arial", size=12)
        pdf.cell(200, 10, txt="Daily Report", ln=True, align="C")
        pdf.cell(200, 10, txt="This is your automated report.", ln=True)

        # Save the PDF
        report_path = "/tmp/daily_report.pdf"
        pdf.output(report_path)

        # Upload to S3 (Optional)
        s3 = boto3.client('s3')
        bucket_name = "daily-reports-s3-bucket"
        s3.upload_file(report_path, bucket_name, "daily_report.pdf")

        # Send email via SES with attachment using raw email
        ses = boto3.client('ses')
        msg = MIMEMultipart()
        msg['From'] = "sender_email@gmail.com"  # Replace with your SES verified email
        msg['To'] = "receiver_email@gmail.com"  # Replace with recipient email
        msg['Subject'] = "Daily Report"

        # Attach the text body
        body = MIMEText("Please find the attached report.", 'plain')
        msg.attach(body)

        # Attach the PDF report
        with open(report_path, 'rb') as file:
            part = MIMEBase('application', 'octet-stream')
            part.set_payload(file.read())
            encoders.encode_base64(part)
            part.add_header('Content-Disposition', f'attachment; filename={os.path.basename(report_path)}')
            msg.attach(part)

        # Send the email using SES's send_raw_email
        response = ses.send_raw_email(
            Source=msg['From'],
            Destinations=[msg['To']],
            RawMessage={'Data': msg.as_string()}
        )

        return {"status": "success", "response": response}

    except Exception as e:
        return {"status": "error", "message": str(e)}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Install Libraries Locally and Deploy (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will use third-party libraries like &lt;code&gt;fpdf&lt;/code&gt;, as &lt;code&gt;fpdf&lt;/code&gt; is not available in &lt;strong&gt;Lambda&lt;/strong&gt;, package them &lt;strong&gt;locally&lt;/strong&gt;:&lt;br&gt;
Install &lt;code&gt;fpdf&lt;/code&gt; locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;pip install fpdf&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Zip&lt;/strong&gt; the files and upload them to the &lt;strong&gt;Lambda&lt;/strong&gt; function.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxar17vlw10q8fb7dp7zy.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxar17vlw10q8fb7dp7zy.webp" alt="lambda" width="696" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Set Up EventBridge Trigger&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;EventBridge&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Click Create &lt;strong&gt;rule&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Name: &lt;code&gt;daily-report-trigger&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt; Define pattern: &lt;strong&gt;Schedule&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; Cron expression: &lt;code&gt;"cron(0 9 * * ? *)" (9:00 AM UTC daily).&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; Under &lt;strong&gt;Target&lt;/strong&gt;, choose your &lt;strong&gt;Lambda&lt;/strong&gt; function (&lt;code&gt;daily-report-lambda&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt; Click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmci31utwhea4n2wynxli.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmci31utwhea4n2wynxli.webp" alt="Cron" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Test the Lambda Function&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;Test&lt;/strong&gt; tab in your &lt;strong&gt;Lambda&lt;/strong&gt; function.&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;test&lt;/strong&gt; event (leave it blank).&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Test&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Check your email &lt;strong&gt;inbox&lt;/strong&gt; for the report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0isfnaudjhjcpg2t5ui.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv0isfnaudjhjcpg2t5ui.webp" alt="Report" width="800" height="677"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complete!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ve built a serverless reporting system! 🎉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Happy Cloud Learning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adeel Abbas&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>lambda</category>
      <category>s3</category>
      <category>awscommunitybuilder</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>ADEEL ABBAS</dc:creator>
      <pubDate>Sun, 28 Dec 2025 10:56:41 +0000</pubDate>
      <link>https://dev.to/adeelabbas/-402c</link>
      <guid>https://dev.to/adeelabbas/-402c</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/adeelabbas" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1969939%2Fe97e539f-858b-45a0-9dd5-0697a2a58dd4.jpeg" alt="adeelabbas"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/adeelabbas/restrict-iam-user-access-after-aws-budget-limit-is-reached-l9d" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Restrict IAM User Access after AWS Budget Limit is reached&lt;/h2&gt;
      &lt;h3&gt;ADEEL ABBAS ・ Dec 25 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#lambda&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#iam&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#awsbilling&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>lambda</category>
      <category>aws</category>
      <category>iam</category>
      <category>awsbilling</category>
    </item>
    <item>
      <title>Restrict IAM User Access after AWS Budget Limit is reached</title>
      <dc:creator>ADEEL ABBAS</dc:creator>
      <pubDate>Thu, 25 Dec 2025 11:27:16 +0000</pubDate>
      <link>https://dev.to/adeelabbas/restrict-iam-user-access-after-aws-budget-limit-is-reached-l9d</link>
      <guid>https://dev.to/adeelabbas/restrict-iam-user-access-after-aws-budget-limit-is-reached-l9d</guid>
      <description>&lt;p&gt;&lt;strong&gt;💰 Automatically Restrict IAM User Access After AWS Budget Limit is Reached&lt;/strong&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;At &lt;strong&gt;2:37 AM&lt;/strong&gt;, the &lt;strong&gt;AWS bill&lt;/strong&gt; silently crossed its limit, no alarms, no humans watching.&lt;br&gt;
Seconds later, an &lt;strong&gt;unseen Lambda&lt;/strong&gt; woke up, and just like that, the IAM user’s access vanished mid-click.&lt;br&gt;
The cloud didn’t &lt;strong&gt;crash&lt;/strong&gt;, it &lt;strong&gt;locked&lt;/strong&gt; the door 🔒&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;🎯Goal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set a spend limit (budget) in &lt;strong&gt;AWS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Send an alert using &lt;strong&gt;Amazon SNS&lt;/strong&gt; when the limit is reached.&lt;/li&gt;
&lt;li&gt;Trigger an &lt;strong&gt;AWS Lambda&lt;/strong&gt; function that will restrict an &lt;strong&gt;IAM&lt;/strong&gt; user.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;IAM&lt;/strong&gt; user will lose &lt;strong&gt;AWS&lt;/strong&gt; access automatically when the budget is &lt;strong&gt;exceeded&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✅ Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic &lt;strong&gt;AWS&lt;/strong&gt; &lt;strong&gt;Account&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM&lt;/strong&gt; user to test&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IAM permissions&lt;/strong&gt; to create &lt;strong&gt;budgets&lt;/strong&gt;, &lt;strong&gt;Lambda&lt;/strong&gt; functions, and &lt;strong&gt;SNS&lt;/strong&gt; topics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔧 Step 1: Create an AWS Budget&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the AWS Console, choose &lt;strong&gt;Billing&lt;/strong&gt;, then &lt;strong&gt;Budgets&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Budget&lt;/strong&gt; name: &lt;strong&gt;Cost Budget&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Spend limit (let &lt;code&gt;$10&lt;/code&gt; per month).&lt;/li&gt;
&lt;li&gt;Add an alert threshold at &lt;code&gt;100%&lt;/code&gt; of the budget.&lt;/li&gt;
&lt;li&gt;Create a new &lt;strong&gt;SNS Topic&lt;/strong&gt; when prompted (we'll configure  later).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🛠️ Example:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Budget: &lt;code&gt;$10/month&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Alert at: &lt;code&gt;100%&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔔 Step 2: Create an SNS Topic&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Amazon SNS choose &lt;strong&gt;Topics&lt;/strong&gt; then &lt;strong&gt;Create Topic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Standard Topic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the name (let: BudgetExceedTopic).&lt;/li&gt;
&lt;li&gt;Click Create Topic.&lt;/li&gt;
&lt;li&gt;Subscribe &lt;strong&gt;Lambda&lt;/strong&gt; to &lt;strong&gt;SNS&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;We will will link this 
&lt;strong&gt;SNS topic&lt;/strong&gt; to a &lt;strong&gt;Lambda&lt;/strong&gt; function in the next step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🖥️ Step 3: Create a Lambda Function&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Lambda&lt;/strong&gt; → &lt;strong&gt;Create Function&lt;/strong&gt; → &lt;strong&gt;Author from scratch&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Function name: RestrictIAMUserFunction&lt;/li&gt;
&lt;li&gt;Runtime: Python &lt;code&gt;3.12&lt;/code&gt; (or latest)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcaianldabmxzruwlsfx.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcaianldabmxzruwlsfx.webp" alt=" " width="800" height="738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste This Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3
import json

iam = boto3.client('iam')

def lambda_handler(event, context):
    user_name = 'adeel'  # Change this to your IAM username

    deny_policy = {
        "Version": "2012-10-17",
        "Statement": [{
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*"
        }]
    }

    iam.put_user_policy(
        UserName=user_name,
        PolicyName='DenyAllPolicy',
        PolicyDocument=json.dumps(deny_policy)
    )

    return {"status": f"Permissions restricted for user {user_name}"}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;🔒 Step 4: Add IAM Permissions to Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Lambda needs permissions to:&lt;/li&gt;
&lt;li&gt;Write logs&lt;/li&gt;
&lt;li&gt;Attach IAM policies
&lt;strong&gt;Inline Policy to Add:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrakbllnjw1c80dd6zu2.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwrakbllnjw1c80dd6zu2.webp" alt=" " width="730" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👉 Replace YOUR_ACCOUNT_ID With your AWS Account ID.&lt;/li&gt;
&lt;li&gt;If you want to restrict all users, use:&lt;/li&gt;
&lt;li&gt;&lt;code&gt;"Resource": "arn:aws:iam::YOUR_ACCOUNT_ID:user/*"&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔗 Step 5: Connect SNS to Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your &lt;strong&gt;SNS Topic&lt;/strong&gt;, choose &lt;strong&gt;Subscriptions&lt;/strong&gt;, then &lt;strong&gt;Create&lt;/strong&gt; Subscription.&lt;/li&gt;
&lt;li&gt;Choose Protocol: &lt;strong&gt;AWS Lambda&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the Lambda function we just &lt;strong&gt;created&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Confirm &lt;strong&gt;subscription&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔️ Now, when the budget threshold is &lt;strong&gt;exceeded&lt;/strong&gt;, SNS will automatically &lt;strong&gt;trigger&lt;/strong&gt; the Lambda function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6qtudmtbduc4h6hn8uh.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6qtudmtbduc4h6hn8uh.webp" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Step 6: Review and Test&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Budget Alerts&lt;/strong&gt; should now trigger your SNS topic when the budget is crossed.&lt;/li&gt;
&lt;li&gt;SNS will trigger the &lt;strong&gt;Lambda&lt;/strong&gt; function.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lambda&lt;/strong&gt; will restrict the &lt;strong&gt;IAM&lt;/strong&gt; user by attaching a &lt;strong&gt;deny-all&lt;/strong&gt; policy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✔️ You can verify this by checking the user in IAM ( Inline Policies )&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔥 Key Tips&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Budgets update a few times a day, so the restriction is not instant, but timely.&lt;/li&gt;
&lt;li&gt;Always test on a non-production user first.&lt;/li&gt;
&lt;li&gt;You can enhance this by making the Lambda dynamically read the username from the SNS message.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;✨ Happy Cloud Learning!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you found this blog helpful, Subscribe here:&lt;br&gt;
&lt;a href="https://www.youtube.com/@CloudTipsByAD" rel="noopener noreferrer"&gt;CloudTipsByAD&lt;/a&gt; &lt;/p&gt;

</description>
      <category>lambda</category>
      <category>aws</category>
      <category>iam</category>
      <category>awsbilling</category>
    </item>
  </channel>
</rss>
