Serverless Component Inventory

Every piece of infrastructure is declared as a component in src/main/serverless/. The root config.json lists the components and the region each is deployed to; each components/*.json file specifies one component's type, settings and links. The Serverless Maven Plugin translates these into AWS resources and the IAM permissions implied by the links.

Deployment configuration

config.json groups components by region:

Region
Components
global
Email_Service, SMS_Service, Auth_Service
eu-west-2
deploy-artifacts, Content_Store, Asset_Store, Component_Store, Publish_Store, Backup_Store, cms-functions, publisher-function, public-functions, CMS_API, Public_API, Admin_Tool

Shared variables (rootDomain, version) are interpolated into component settings using ${...} placeholders (e.g. cms-api.${rootDomain}).

Component summary

Component
Type
Purpose
Admin_Tool
website
React admin SPA on S3 + CloudFront at admin.<rootDomain>
CMS_API
api-gateway
Authenticated admin REST API at cms-api.<rootDomain>
Public_API
api-gateway
Public read/delivery API at api.<rootDomain>
cms-functions
functions
~90 control-plane Lambda handlers
publisher-function
functions
Renders pages to static HTML
public-functions
functions
Public content, navigation, search, form handlers
Content_Store
database
DynamoDB single-table store for all authoring state
Asset_Store
storage
Per-site media and font uploads
Component_Store
storage
Component HTML/CSS/JS bundles
Publish_Store
storage
Rendered static site output (CloudFront origin)
Backup_Store
storage
Backup zip archives
deploy-artifacts
storage
Lambda deployment zips
Auth_Service
authentication
Cognito user pool (email login, MFA, groups)
Email_Service
email
Transactional email (SES)
SMS_Service
sms
SMS for MFA/notifications (SNS)

APIs

CMS_API (admin)

  • Domain: cms-api.${rootDomain}
  • CORS origins: https://admin.${rootDomain} only
  • Access logging: enabled
  • Authorizer: preProcessFunction: cms-pre-process runs ahead of routes
  • Routes: ~90, almost all requiring auth: Auth_Service. Public exceptions are the auth endpoints (/auth/*) and /platform/status.
  • Links: API_GATEWAY_TO_FUNCTION → cms-functions, API_GATEWAY_TO_AUTHENTICATION → Auth_Service.

See the API reference for the route list.

Public_API (delivery)

  • Domain: api.${rootDomain}
  • Unauthenticated, read-optimised. Routes: page content by slug, navigation, site meta, search, and form submit.
  • Links: API_GATEWAY_TO_FUNCTION → public-functions.

Function groups

cms-functions

The control plane. Each function is Node.js 22 (nodejs22.x), packaged from releases/cms-functions/...zip in deploy-artifacts. Handlers are grouped by domain:

  • Auth & identity — cms-pre-process (authorizer), auth-login, auth-logout, auth-refresh, auth-change-password, auth-forgot-password, auth-confirm-forgot-password.
  • Users & groups — users-*, groups-*, custom-groups-*, site-groups-*.
  • Sites — sites-list/create/get/update/delete, root-domains, provision-site, delete-site-step, rebuild-site.
  • Templates & pages — templates-*, pages-*, pages-lock-*, pages-move, pages-revert, page-versions-*, pages-preview.
  • Publishing — publish-page, unpublish-page, publish-tree, bulk-publish-initiate/status/worker, publish-requests-*.
  • Components & design — components-*, component-css, themes-*, theme-get/update, breakpoints-update, variables-*, page-types-*.
  • Assets & fonts — assets-list/upload/create-folder, fonts-list/upload/delete.
  • Platform — platform-status, platform-initialize, ai-crawler-activity, activity-log-list.
  • Backup & restore — backup-create, backup-create-platform, backup-list, backup-list-all, backup-get, backup-delete, backup-restore, backup-process-step, restore-process-step.

Each function declares only the links it needs (FUNCTION_TO_DATABASE, FUNCTION_TO_STORAGE, FUNCTION_TO_AUTHENTICATION, FUNCTION_TO_FUNCTION) plus explicit permissions for cross-cutting actions (e.g. dns:*, certificate:*, website:invalidate, event-bus:manage). This is how least privilege is expressed — see Security.

Notable non-default resourcing:

Function
Memory
Timeout
Why
provision-site
512 MB
120 s
DNS + ACM + CloudFront orchestration
bulk-publish-worker
512 MB
300 s
Renders many pages per run
backup-process-step
512 MB
60 s
Gathers + zips site content
delete-site-step
256 MB
30 s
Teardown steps
restore-process-step
512 MB
120 s
Restore steps (incl. asset upload)
platform-status / platform-initialize
default
300 s
Seeds/inspects platform records

publisher-function

A single publisher Lambda (1024 MB, 60 s) that renders pages to HTML. It links to Content_Store, Component_Store, Publish_Store and Asset_Store. It is invoked by control-plane handlers rather than exposed via API Gateway.

public-functions

Delivery-plane handlers (page-content, navigation, site-meta, form-submit, search) that read from Content_Store and Publish_Store.

Stores (S3)

Store
Contents
Asset_Store
Per-site media (assets/{siteId}/…) and fonts
Component_Store
Component bundles ({componentId}/component.html, .css, .js)
Publish_Store
Rendered static output per site (CloudFront origin), sitemaps, robots.txt, error.html
Backup_Store
Backup zips (backups/{siteId}/{backupId}/backup.zip) and staging JSON
deploy-artifacts
Lambda deployment zips for the three function groups

Data store

Content_Store is a DynamoDB table with:

  • Composite key PK / SK (both strings)
  • Two global secondary indexes GSI1 and GSI2 (each …PK / …SK)
  • PAY_PER_REQUEST billing and point-in-time recovery enabled

The single-table key design is documented in the Data model.

Identity & messaging services

  • Auth_Service — Cognito user pool: email login provider, self registration disabled, mfa: optional, and a password policy of min length 12 with upper-case, number and symbol requirements. Ships with platform groups (admin, site-editor, site-creator, authentication-admin) and a seed admin user. Linked to Email_Service and SMS_Service.
  • Email_Service — SES sender identity (fromAddress / fromName) for Cognito emails and platform notifications.
  • SMS_Service — SNS-backed SMS for MFA/notifications.

Continue to Data model »