AWS to Airtable, prioritized alerts sent via Gmail
AWS alerting gets noisy fast. One small misconfiguration can create a flood of “findings,” and the important ones get buried under the “probably fine” ones.
Security leads feel this when the inbox turns into a backlog. Ops managers end up context-switching all day. And consultants supporting multiple client accounts need AWS alert automation that stays readable and consistent.
This workflow takes Security Hub or AWS Config events, normalizes them, uses AI to assign a clear priority (P0–P3), logs the result in Airtable without duplicates, and emails a compact summary through Gmail. You’ll see how it works, what you need, and how to customize it for your team.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: AWS to Airtable, prioritized alerts sent via Gmail
flowchart LR
subgraph sg0["AI Prioritizer Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Normalize Finding"]
n2@{ icon: "mdi:message-outline", form: "rounded", label: "Send a message", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "AI Prioritizer", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Airtable - Create Record"]
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>SNS Handler"]
n7@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>SNS Confirm"]
n9@{ icon: "mdi:swap-vertical", form: "rounded", label: "Edit Fields1", pos: "b", h: 48 }
n7 --> n8
n7 --> n1
n0 --> n6
n8 --> n9
n6 --> n7
n3 --> n4
n2 --> n5
n1 --> n3
n4 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3 ai
class n7 decision
class n4 database
class n0,n8 api
class n1,n6 code
classDef customIcon fill:none,stroke:none
class n0,n1,n4,n6,n8 customIcon
Why This Matters: AWS Findings That Don’t Tell You What to Do
Security Hub and AWS Config are great at detecting issues, but they’re not great at helping humans respond quickly. Findings arrive with inconsistent structure, different severity systems, and wildly different levels of context depending on the service (S3 vs IAM vs Security Groups). Then the real problem starts: triaging in the inbox. Someone has to decide “Is this urgent?”, “Is it a duplicate?”, “Do we already have a ticket?”, and “What’s the fix?” That’s time you don’t get back, and it usually steals attention from work that actually reduces risk.
The friction compounds. Here’s where it breaks down in real teams.
- Important misconfigurations show up mixed with low-value alerts, so you end up scanning everything “just in case.”
- Two services can report the same underlying issue, and your team handles it twice because there’s no simple dedupe.
- Findings aren’t normalized, which means your “process” is basically re-reading JSON and guessing impact.
- When alerts live only in email, you lose history, ownership, and the ability to spot repeat offenders.
What You’ll Build: AWS → AI Priority → Airtable Log → Gmail Summary
This workflow turns raw AWS events into an actionable incident-style brief your team can actually use. It starts when AWS sends a Security Hub finding or an AWS Config compliance change through EventBridge and SNS, which then posts into an n8n webhook. The workflow validates the message (including SNS subscription confirmation), unwraps the payload, and converts each service’s “shape” into one consistent JSON format. Next, an AI step reviews the normalized finding and assigns a priority from P0 to P3, plus a short rationale and concrete remediation steps. Finally, the workflow upserts the finding into Airtable by Finding ID to prevent duplicates, then sends a clean Gmail summary to the right recipients.
The workflow begins with an HTTP webhook that receives SNS messages. It then standardizes the finding, runs AI severity triage, writes the final record to Airtable, and emails a compact alert your team can act on. No hunting through AWS consoles to understand what just happened.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say your account generates about 20 findings a day across Security Hub and AWS Config. Manually, if you spend roughly 6 minutes opening the alert, figuring out severity, checking if it’s already known, and writing a short note, that’s about 2 hours a day. With this workflow, the “human time” becomes: glance at a prioritized Gmail brief (maybe 30 seconds each) and act on only the P0/P1 items. The workflow runs in the background after the initial 10–15 minute setup.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- AWS (Security Hub or AWS Config) to generate findings via EventBridge.
- Airtable for deduping and logging findings.
- OpenAI API key (get it from the OpenAI API dashboard)
- Gmail account to deliver readable incident summaries.
Skill level: Beginner–Intermediate. You’ll paste in a webhook URL, connect credentials, and make one small AWS configuration (SNS + EventBridge).
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
AWS pushes an event to your webhook. EventBridge rules send Security Hub findings or AWS Config compliance events to an SNS topic, and SNS posts that message to your n8n webhook endpoint.
The workflow validates and unwraps the SNS payload. It checks the shared token in the URL, then detects whether the incoming message is a one-time SNS subscription confirmation or a real notification that contains a finding.
The finding is standardized and prioritized. A code step converts messy, service-specific fields into one consistent JSON. Then the AI prioritizer assigns P0–P3 and produces a short rationale plus remediation steps that you can hand to an engineer without rewriting.
Airtable becomes your source of truth, and Gmail becomes your delivery layer. The workflow upserts the record by Finding ID (so repeats update instead of duplicating), then emails a compact summary that’s readable on mobile.
You can easily modify Gmail recipients to send to a shared mailbox, or swap the email step for Slack or Microsoft Teams based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhook that receives AWS SNS notifications and drives the rest of the workflow.
- Add and open Incoming Webhook Trigger.
- Set Path to
aws-misconfig. - Set HTTP Method to
POST. - Set Response Mode to
lastNodeso the workflow replies with the final status payload.
Step 2: Parse and Route Incoming SNS Events
Normalize SNS payloads and route subscription confirmations versus actual notifications.
- Open SNS Event Parser and update the token check to your secret by replacing
[CONFIGURE_YOUR_TOKEN]inside the code. - Verify the parser returns
modeas eitherconfirmornotifydepending on the SNS event type. - Open Branch Logic and confirm the condition uses
=={{ $json.mode === 'confirm' }}to branch confirmations from notifications.
[CONFIGURE_YOUR_TOKEN] will cause all requests to fail with an unauthorized error.Step 3: Handle SNS Subscription Confirmation
Confirm SNS subscriptions automatically when AWS sends a subscription confirmation event.
- Open Confirm SNS Subscription and set URL to
=={{ $json.subscribeUrl }}. - Open Compose Confirmation Response and ensure the response is assigned with
=resp = { status: "subscribed", statusCode: $json.statusCode || 200 }.
Step 4: Normalize Findings and Run AI Severity Triage
Standardize security findings and classify priority using AI before storing and notifying.
- Open Standardize Finding Data and keep Mode as
runOnceForEachItem. - Confirm the code returns a single object with fields like
finding_id,title,severity, andservice. - Open AI Severity Triage and confirm the prompt includes
{{ JSON.stringify($json, null, 2) }}for the normalized finding input. - Credential Required: Connect your openAiApi credentials in AI Severity Triage.
gpt-4.1-mini as configured to keep costs low while maintaining quality.Step 5: Store Findings in Airtable
Upsert each triaged finding into Airtable for tracking and reporting.
- Open Airtable Upsert Record and select your Base and Table.
- Keep Operation set to
upsertand map fields using the existing expressions, such as={{ $('Standardize Finding Data').item.json.finding_id }}for the record ID. - Verify tags and remediation concatenation fields use the expressions shown in the node, for example
={{ $json.message.content.tags[0] }}{{ $json.message.content.tags[1] }}{{ $json.message.content.tags[2] }}{{ $json.message.content.tags[3] }}{{ $json.message.content.tags[4] }}. - Credential Required: Connect your airtableTokenApi credentials in Airtable Upsert Record.
Step 6: Configure Email Alerts and Webhook Reply
Send the triage summary to email and return a structured webhook response.
- Open Dispatch Email Alert and set Send To to your recipient address (replace
[YOUR_EMAIL]). - Confirm Subject uses
=={{ `[${JSON.parse($node["AI Severity Triage"].json.message.content).priority}] ${$node["Standardize Finding Data"].json.title} — ${$node["Standardize Finding Data"].json.resource_id} (${ $node["Standardize Finding Data"].json.service })` }}. - Confirm Message uses the HTML template with AI remediation steps and embedded raw finding data:
=={{ (() => { const nf = $node["Standardize Finding Data"].json; const ai = typeof $node["AI Severity Triage"].json.message.content === 'string' ? JSON.parse($node["AI Severity Triage"].json.message.content) : $node["AI Severity Triage"].json.message.content; const steps = (ai.remediation || []).map(s => `.- ${s}
`).join(''); const tags = (ai.tags || []).join(', '); const airtableId = $node["Airtable Upsert Record"].json?.id || ''; const airtableLine = airtableId ? `Airtable Record ID: ${airtableId}
` : ''; return `AWS Misconfig Alert
Priority: ${ai.priority} Severity: ${nf.severity}
Title: ${nf.title}
Service: ${nf.service} Resource: ${nf.resource_id}
Account: ${nf.account} Region: ${nf.region}
Why: ${ai.rationale}
Remediation:
- ${steps}
Tags: ${tags || '—'}
${airtableLine}`;})() }}Raw finding
${JSON.stringify(nf.raw || nf, null, 2)} - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Email Alert.
- Open Build Webhook Reply and confirm Mode is
rawwith JSON Output set to={{ { resp: { status: "processed", priority: $node["Airtable Upsert Record"].json.fields.Priority, finding_id: $node["Standardize Finding Data"].json.finding_id } } }}.
Step 7: Test and Activate Your Workflow
Validate end-to-end behavior before enabling production execution.
- Click Execute Workflow and send a sample SNS notification payload to the Incoming Webhook Trigger URL.
- Confirm that SNS Event Parser passes to Branch Logic, then to Standardize Finding Data for notification events.
- Verify AI Severity Triage returns structured JSON and Airtable Upsert Record creates/updates a row.
- Check that Dispatch Email Alert sends an email with the formatted summary and Build Webhook Reply returns a
processedresponse. - Turn the workflow Active to start processing live SNS events.
Troubleshooting Tips
- Airtable credentials can expire or the base/table permissions might be too limited. If upserts fail, check the connected account access and the “Finding ID” field type first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
- AWS SNS confirmations can get stuck if the webhook URL is wrong or blocked. Check the SNS subscription status in the AWS console and confirm your n8n instance is reachable over HTTP.
- Gmail can fail quietly when the sender account needs re-authentication. If emails stop, re-connect the Gmail credential in n8n and verify sending limits on that mailbox.
Quick Answers
About 10–15 minutes if your AWS pieces are ready.
No. You’ll import the workflow, connect accounts, and copy a webhook URL into AWS. There is a code node inside the workflow, but you typically don’t need to edit it unless you want custom parsing or extra validation.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API usage (usually pennies per alert) and any Airtable plan limits based on how many findings you log.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you probably should. You can swap the Dispatch Email Alert step for Slack or Teams, adjust the AI Severity Triage prompt to match your risk policy, and extend Standardize Finding Data to include your own tags like environment, account owner, or runbook links.
Usually it’s permissions or a mismatched field. Confirm the connected Airtable account can edit the target base, then verify the workflow is upserting into the right table and that “Finding ID” is present and consistent (blank IDs cause ugly duplicates and failed updates). If it suddenly stopped working, re-authenticate the Airtable credential in n8n.
For most small teams, hundreds of findings a day is fine as long as your n8n instance stays online and your AI/Airtable limits aren’t hit. On n8n Cloud, capacity depends on plan and execution limits; on self-hosted n8n there’s no hard execution cap, but your server size becomes the bottleneck. If you expect bursts (for example, after enabling Security Hub controls), consider routing only specific severities through EventBridge first, then widening coverage once you’re confident.
Often, yes. This workflow needs branching (SNS confirm vs notification), data normalization, and structured AI output, and n8n handles that without turning every extra step into a pricing problem. It also gives you self-hosting, which is useful when you want the webhook endpoint under your control. Zapier or Make can still work if your setup is simpler, but SNS confirmation handling and JSON parsing get awkward fast. Talk to an automation expert if you want a quick recommendation for your exact stack.
Once this is live, your team stops reacting to “an alert” and starts responding to a prioritized, deduped queue with clear next actions. Set it up once, and the workflow does the repetitive part from then on.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.