Skip to content

Project Overview

This walkthrough documents the event-driven-serverless-platform-demo — a consolidated AWS
Amazon Web Services — cloud platform for ingest, processing, storage, API, and portal hosting in this walkthrough.
event-driven serverless platform for GNSS
Global Navigation Satellite System — source of RINEX observation data ingested and calibrated in this platform.
RINEX
Receiver Independent Exchange Format — standard GNSS observation file format synced from GeoNet and calibrated by the processor.
ingest, PyTECGg
PyTECGg — Python library performing TEC calibration on GNSS RINEX observations inside the processor container.
TEC
Total Electron Content — integrated electron density along the GNSS signal path; primary calibrated output of the processor.
calibration, and interactive visualization.

By the end you will have:

  • Ingest — hourly RINEX
    Receiver Independent Exchange Format — standard GNSS observation file format synced from GeoNet and calibrated by the processor.
    synced from GeoNet
    GeoNet open data — public S3 bucket `geonet-open-data` with GNSS RINEX hourly files under `gnss/rinexhourly/`. Not owned by this stack; no push notification when new files arrive.
    into a private data lake
    Private S3 bucket holding raw RINEX under `raw/rinexhourly/` and processed TEC output under `processed/tec/`.
  • Processing SQS
    Amazon Simple Queue Service — buffers ingest and reprocess messages between S3/API and the processor Lambda.
    -driven processor Lambda
    Processor Lambda container — runs PyTECGg calibration per SQS message; adopted when a Batch on Fargate parallel-execution quota increase was rejected. Image from `ghcr.io/platformfuzz/tec-processor-image` mirrored to ECR.
    container writing calibrated TEC output
  • Presentation REST API
    Amazon API Gateway — REST API exposing `/catalog`, `/query`, and `/reprocess`. Browser CORS is locked to the Amplify hostname; CLI clients call the API Gateway URL directly.
    and an Amplify
    AWS Amplify — hosts the Vite portal SPA. This walkthrough deploys via manual zip upload (no Git connection required).
    portal for charts, maps, and reprocess jobs
  • Operations CloudWatch
    Amazon CloudWatch — alarms, dashboard (`event-driven-platform`), and structured Lambda logs for observability.
    alarms, SNS
    Amazon Simple Notification Service — publishes CloudWatch alarm notifications; subscribe an email endpoint after deploy.
    notifications, and the event-driven-platform dashboard

Everything lives in one monorepo and is provisioned through Terraform
HashiCorp Terraform — provisions all platform infrastructure through five modules in `terraform/`.
.

Architecture diagram: GeoNet RINEX flows through EventBridge Scheduler and ingest Lambda into S3, SQS-driven processor Lambda writes TEC output, and the Amplify portal queries via API Gateway and Lambda

Data moves left to right across three layers — ingest, processing, and presentation. New raw files in S3
Amazon Simple Storage Service — data lake bucket for raw ingest and processed TEC output; S3 events trigger processing.
enqueue the process queue
SQS standard queue — receives S3 ObjectCreated notifications for new raw RINEX files; triggers processor Lambda ingest path.
; operator reprocess jobs use a separate reprocess queue
SQS standard queue — buffers reprocessing job messages from the Reprocess API with lower concurrency than ingest.
with lower concurrency so scheduled ingest is not starved.

The browser and CLI reach processed data only through API Gateway
Amazon API Gateway — REST API exposing `/catalog`, `/query`, and `/reprocess`. Browser CORS is locked to the Amplify hostname; CLI clients call the API Gateway URL directly.
— not S3 or DynamoDB
Amazon DynamoDB — Jobs table tracks reprocessing job status by `job_id` (queued → processing → completed/failed).
directly. Infrastructure Layers covers each component; System Overview covers Terraform modules and design decisions.

LayerResponsibilityKey components
IngestSync recent RINEX from GeoNet into the data lake

EventBridge Scheduler
AWS EventBridge Scheduler — triggers ingest-sync Lambda on a recurring UTC schedule (default: hourly).
, Ingest_Sync_Lambda
Ingest-sync Lambda (`services/ingest-sync/`) — polls GeoNet on schedule and copies recent RINEX into the data lake (workaround for no source-bucket event subscription).
,

S3
Amazon Simple Storage Service — data lake bucket for raw ingest and processed TEC output; S3 events trigger processing.
Data_Lake_Bucket
Private S3 bucket holding raw RINEX under `raw/rinexhourly/` and processed TEC output under `processed/tec/`.
ProcessingCalibrate raw observations into TEC output

Process_Queue
SQS standard queue — receives S3 ObjectCreated notifications for new raw RINEX files; triggers processor Lambda ingest path.
, Reprocess_Queue
SQS standard queue — buffers reprocessing job messages from the Reprocess API with lower concurrency than ingest.
, Processor Lambda
Processor Lambda container — runs PyTECGg calibration per SQS message; adopted when a Batch on Fargate parallel-execution quota increase was rejected. Image from `ghcr.io/platformfuzz/tec-processor-image` mirrored to ECR.
container,

DynamoDB
Amazon DynamoDB — Jobs table tracks reprocessing job status by `job_id` (queued → processing → completed/failed).
Jobs table
DynamoDB table keyed by `job_id` — stores reprocess job metadata, parameters, status, and output references.
PresentationQuery, visualize, and submit reprocessing jobs

API Gateway
Amazon API Gateway — REST API exposing `/catalog`, `/query`, and `/reprocess`. Browser CORS is locked to the Amplify hostname; CLI clients call the API Gateway URL directly.
, Query
Query API Lambda (`services/query-api/`) — serves `/catalog` and `/query` from processed S3 keys and Parquet/JSON files.
/ Reprocess API
Reprocess API Lambda (`services/reprocess-api/`) — accepts `/reprocess` jobs, writes DynamoDB records, enqueues Reprocess_Queue.
Lambdas, Amplify
AWS Amplify — hosts the Vite portal SPA. This walkthrough deploys via manual zip upload (no Git connection required).
Portal

GNSS TEC Platform on Amplify showing station browser, VTEC time series, and ionospheric pierce point map for AUCK

The portal browses processed stations
Four-character GNSS receiver site identifier (e.g. `auck`) parsed from RINEX filenames and used in processed key paths.
, charts TEC metrics over time, and maps ionospheric pierce points
Ionospheric Pierce Point — geographic location where the satellite signal intersects the ionospheric shell; plotted on the portal IPP map.
. See Portal Usage and Amplify Portal.

CloudWatch dashboard event-driven-platform showing alarm status, SQS queue depth, processor Lambda throughput, ingest sync, and presentation API metrics

Observability spans all layers. The event-driven-platform dashboard aggregates alarm health, queue backlog, Lambda throughput, and API activity. Subscribe to SNS and verify alarms in Alarms and Dashboard.

TermDefinition
Demo Repo
event-driven-serverless-platform-demo — source repository for Terraform, Lambda services, portal, and scripts. Commands run from its root with `terraform -chdir=terraform` unless stated otherwise.

Source repository

event-driven-serverless-platform-demo

— run commands from its root with terraform -chdir=terraform unless stated otherwise

RINEX
Receiver Independent Exchange Format — standard GNSS observation file format synced from GeoNet and calibrated by the processor.

GNSS observation files synced from GeoNet and calibrated by the processor

TEC
Total Electron Content — integrated electron density along the GNSS signal path; primary calibrated output of the processor.

Total Electron Content — primary calibrated output served by the Query API and portal

Data Lake
Private S3 bucket holding raw RINEX under `raw/rinexhourly/` and processed TEC output under `processed/tec/`.

Private S3 bucket with raw/rinexhourly/ ingest keys and processed/tec/ output

Process vs reprocess queues
SQS standard queue — receives S3 ObjectCreated notifications for new raw RINEX files; triggers processor Lambda ingest path.

Ingest path ( Process_Queue
SQS standard queue — receives S3 ObjectCreated notifications for new raw RINEX files; triggers processor Lambda ingest path.
) vs operator jobs ( Reprocess_Queue
SQS standard queue — buffers reprocessing job messages from the Reprocess API with lower concurrency than ingest.
) — separate concurrency so reprocess does not starve ingest

Processor Lambda
Processor Lambda container — runs PyTECGg calibration per SQS message; adopted when a Batch on Fargate parallel-execution quota increase was rejected. Image from `ghcr.io/platformfuzz/tec-processor-image` mirrored to ECR.

Container image (ghcr.io/platformfuzz/tec-processor-image, mirrored to ECR
Amazon Elastic Container Registry — stores the mirrored processor Lambda container image at deploy time.
) — SQS-triggered Lambda container (see design notes)

Terraform stack
HashiCorp Terraform — provisions all platform infrastructure through five modules in `terraform/`.

Five modules in terraform/ — ingest, ingest-scheduler, processing, presentation, observability

The sidebar follows a deploy → verify → use order.

  1. PrerequisitesTools and Accounts
  2. ArchitectureSystem Overview and Infrastructure Layers

Provision the stack in order: Terraform InitECR and Processor ImageStaged ApplyAmplify PortalCORS Lockdown.

Confirm each stage of the pipeline:

  • UsageREST API, Portal, Manual Ingest
  • Data Contract — SQS, DynamoDB, S3 keys, Parquet, and API schemas
  • Development, Troubleshooting, and Reference — local setup, common issues, Terraform outputs
  1. Confirm Tools and Accounts before cloning the demo repo.
  2. Read System Overview for module layout and design decisions.
  3. Follow Terraform Init to deploy the stack.