Automates an Excel report on AWS and OCI cloud services every 3 days, pulling live data from official RSS/Atom feeds, and emailing it to a recipient at 11 AM UAE.
- Runs: every 3 days at 11:00 AM UAE (07:00 UTC) via GitHub Actions
- Live sources: AWS What's New, AWS News Blog, OCI per-service release notes, OCI blog
- Events: dates scraped dynamically from official AWS/Oracle event pages — no manual yearly updates needed
- OCI fallback: if per-service docs feeds are blocked, automatically falls back to public Oracle RSS feeds
- Output:
Cloud_Services_Update_YYYY-MM-DD.xlsxattached to an email
The Excel file has 4 sheets:
- Summary — item counts, lookback window, links to primary sources
- Events — live and upcoming cloud events (30-day window) with dates, location, and any feed announcements that reference them
- AWS Updates — every AWS announcement from the last 72h, tagged with the likely service name
- OCI Updates — every OCI release-note item from the last 72h, grouped by service
If a feed is quiet in the lookback window, the sheet shows "No new announcements captured in the lookback window" rather than failing.
├── .github/
│ └── workflows/
│ └── daily-update.yml # schedule + runner
├── generate_report.py # builds the Excel file from live feeds
├── send_email.py # sends it via Gmail SMTP
├── .gitignore
└── README.md
- Create a new GitHub repo (public or private).
- Copy the files above into the repo.
- Commit and push.
GitHub Actions sends the email through Gmail SMTP. You can't use your regular Gmail password — Google requires an App Password.
- Enable 2-Step Verification on the sender account: https://myaccount.google.com/security
- Go to: https://myaccount.google.com/apppasswords
- Create a new app password (e.g. "GitHub Actions Cloud Report").
- Copy the 16-character password.
Go to Settings → Secrets and variables → Actions → New repository secret and add:
| Secret | Value |
|---|---|
GMAIL_USER |
Sender Gmail address, e.g. sender@gmail.com |
GMAIL_APP_PASS |
The 16-character App Password (no spaces) |
EMAIL_TO |
Recipient address(es), e.g. you@example.com |
To send to multiple recipients, set
EMAIL_TOto a comma-separated list:a@example.com,b@example.com
- Go to the Actions tab.
- Click Cloud Services Update (Every 72h) → Run workflow.
- ~1 minute later an email should arrive with the Excel attached.
Cron is set to 0 7 */3 * * (UTC) = 11:00 AM UAE (UTC+4).
Event dates are scraped automatically from official event pages on each run:
| Event | Source page |
|---|---|
| AWS re:Invent | aws.amazon.com/events/reinvent/ |
| Oracle AI World | oracle.com/cloudworld/ |
If a page can't be fetched or no future date is found, a warning is printed and that event is skipped for the run — no crash.
To add a new event whose page contains a static date line (e.g. "June 10–12, 2027 | Austin, TX"), add an entry to _EVENT_PAGES in generate_report.py:
{"name": "My Event", "provider": "AWS",
"url": "https://aws.amazon.com/events/my-event/",
"notes": "Brief description."}Events are shown as LIVE (today falls within the dates) or UPCOMING (starts within 30 days). Each event block lists any feed items from the lookback window that mention the event by name.
Edit .github/workflows/daily-update.yml:
- cron: "0 7 */3 * *" # 07:00 UTC every 3 days = 11:00 AM UAEIn generate_report.py:
LOOKBACK_HOURS = 7272h covers the 3-day interval. Raise to 96 for extra buffer, or lower for a daily schedule.
Edit AWS_SERVICE_PATTERNS in generate_report.py — a list of (display_name, regex). The regex runs over announcement titles; first match wins.
Edit OCI_SERVICE_FEEDS — each entry is (display_name, slug) where the feed URL is:
https://docs.oracle.com/en-us/iaas/releasenotes/services/<slug>/feed
"Username and Password not accepted" → Use an App Password, not your regular Gmail password (see step 2).
403 Forbidden on OCI feeds → The script automatically falls back to public Oracle RSS feeds. No action needed.
Empty AWS/OCI Updates sheet → Genuinely quiet period on the feeds, or a temporary feed outage. The Events sheet will still render correctly.
Scheduled runs don't fire at exactly 11:00 → GitHub cron can be delayed a few minutes under load. Use Run workflow for an immediate trigger.
Email lands in Spam → Mark as "Not spam" once, or add a filter on the recipient side: From GMAIL_USER → Never send to Spam.
Event not showing → The event page may not yet have published a future date. It will appear automatically once the page is updated.