← All status

Serving

Serving

AWS cloud-base for every Quantapix surface. Four CloudFront-fronted static sites, one t4g.small EC2 fronting two FastAPI apps, GitHub OIDC for CI, KMS-CMK-backed SecureStrings.

version 3d6e72fb
source serving/PLAN.md@3d6e72fb
built 2026-05-24T20:33:02.376Z
OK

Service inventory — what runs in v0.1

Eighteen services live in v0.1; six deferred. Total run rate ~$20–25/mo. Phases 1–5 closed (2026-05-15). Use the chips to scope the table to live or deferred only.

Run rate

$22/mo
·

Services live

18
+8

Deferred

6
+1

Filter by state

ServiceScopeStateCost
S3×4 sites + artifactslive~$0.50/mo
CloudFront×4 distributionslive~$1–2/mo
CF FunctionsURI rewritelivefree
ACMus-east-1 certslivefree
Route 532 zoneslive~$1/mo
IAM3 principals + OIDClivefree
EC21× t4g.smalllive~$11/mo
Elastic IPstaticlive$0/mo
Default VPCno NATlivefree
Security Group443 + SSM onlylivefree
SSM Session Mgrno SSHlivefree
SSM Param StoreKMS-encryptedlivefree
KMSalias/qagents-cmklive~$1/mo
CloudWatch Logs7-day retentionlive~$0.50/mo
CW Metric AlarmsCPU/disk/spenddeferfree
AWS Budgets$50/mo · 80/100/120livefree
GuardDutyaccount-widelive~$3–5/mo
SNS alerts topicqagents-alertslivefree
Cost Explorerfreelivefree
ALBlaterdefer~$16/mo
Auto Scaling Grouplaterdefer
AWS Backuplaterdefer
AWS WAFlaterdefer~$5/mo
AWS Configlaterdefer~$10–15/mo
18 live + 6 deferred. Run rate dominated by EC2 ($7–11/mo) + GuardDuty (~$3–5/mo); everything else under $1/mo.

Static sites — R53 → CloudFront → S3 (OAC)

One stamp per site. Identical in shape; differs only in bucket name, hostname, ACM ARN, Route 53 zone. Four stamps live as of Phase 4 (femfas.net, quantapix.com, qnarre.quantapix.com, qresev.quantapix.com).

Static sites — R53 → CloudFront → S3 (OAC) One stamp per site. Identical in shape; differs only in bucket name, hostname, ACM ARN, Route 53 zone. Four stamps live as of Phase 4 (femfas.net, quantapix.com, qnarre.quantapix.com, qresev.quantapix.com). TLS Browser ikifor.dev Route 53 alias record CloudFront PriceClass_100 CloudFront Fn URI rewrite S3 (OAC) origin access ctl static dist/ astro build ACM cert us-east-1
Static sites — inventory Bucket × distribution × ACM cert × Route 53 zone, per site.
SiteBucketDistributionR53 zoneState
femfas.netfemfas.netE1HSASY4B6ODERfemfas.netlive
quantapix.comquantapix.comE27NQG9Y1ZPLGHquantapix.comlive
qnarre.quantapix.comqnarre.quantapix.comE1VG1K1746Z49Xquantapix.comlive
qresev.quantapix.comqresev.quantapix.comE2PFH4Z95BT169quantapix.comlive
Four stamps live. Phase 4 (2026-05-13) landed the two product shells on the same OAC + REST + URI-rewrite Function pattern as the two canonical sites; Phase 5 (2026-05-15) wired the api.* hostnames straight to the EC2 EIP, bypassing CloudFront for SSE.

App APIs — R53 → EIP → EC2 (Caddy + dual FastAPI)

Browsers reach api.qnarre.* + api.qresev.* over a direct A→EIP record. Bypasses CloudFront because SSE long-poll connections do not pass cleanly through it.

App APIs — R53 → EIP → EC2 (Caddy + dual FastAPI) Browsers reach api.qnarre.* + api.qresev.* over a direct A→EIP record. Bypasses CloudFront because SSE long-poll connections do not pass cleanly through it. qnarre vhost qresev vhost AssumeRole Browser SSE long-poll Route 53 A api.qnarre / qresev Elastic IP static EC2 t4g.small ARM, 8 GB gp3 Caddy Lets Encrypt uvicorn :8787 Qnarre FastAPI uvicorn :8788 Qresev FastAPI lake build subprocess qagents-app-role instance role

Identity — three IAM principals

Domain separation by design: deploy user cannot SSH or modify EC2; EC2 role cannot deploy site buckets; OIDC role mirrors deploy with short-lived federated tokens.

Identity — three IAM principals Domain separation by design: deploy user cannot SSH or modify EC2; EC2 role cannot deploy site buckets; OIDC role mirrors deploy with short-lived federated tokens. STS OIDC (Phase 2) AssumeRole s3:* s3:* ikifor (laptop) aws-vault → STS GitHub Actions OIDC EC2 instance sts:AssumeRole qagents-deploy IAM user qagents-deploy-ci IAM role · OIDC qagents-app-role IAM role · EC2 s3:* on 4 sites site buckets s3:* on artifacts qagents-artifacts cloudfront:Invalidate 4 distributions ssm:GetParameter /qagents/* kms:Decrypt alias/qagents-cmk logs:* /aws/qagents/* CloudWatch Logs Deny ec2:* explicit Deny iam:* / r53:* explicit
IAM principals Single human + single CI principal, MFA-Deny on the human, OIDC-trust on CI.
PrincipalKindMFAAuthScope
qagents-deployIAM userrequiredaws-vault + Imres-iPhone TOTP4 site buckets + artifacts · 4 CF dists · EC2/SSM/EBS-modify · CodeCommit (5 repos)
qagents-deploy-ciIAM rolen/aGitHub OIDC (sub pinned)CI deploys via OIDC; main-branch only
AWSReservedSSO_*IAM Identity CenterrequiredIIC SSOadmin sessions, not deploy path
Boundary policy at qagents-deploy-boundary caps both deploy principals; managed-policy drift cannot escalate.
GitHub OIDC trust Repo × workflow × allowed branches × actions on assume.
RepoWorkflowSub-claim pinRole assumedPhase
quantapix/qagents.github/workflows/deploy.ymlrepo:quantapix/qagents:ref:refs/heads/mainqagents-deploy-ciphase 6
quantapix/qagents.github/workflows/build-status.ymlrepo:quantapix/qagents:ref:refs/heads/mainqagents-deploy-ciphase 6
quantapix/quantapix.github/workflows/pages.ymlrepo:quantapix/quantapix:ref:refs/heads/mainqagents-deploy-ciphase 6
Trust policy condition pins both audience (sts.amazonaws.com) and sub-claim. No long-lived keys in CI.

Security baseline — 23 controls

8 enforce, 12 adopt, 3 defer. Modern AWS controls (OAC, OIDC, IMDSv2, GuardDuty, KMS CMK, SSM Session Mgr) — not OAI, not SSH, not plaintext keys.

Enforce

8

Caps blast radius regardless of policy drift.

Adopt

12

Modern AWS controls wired in.

Defer

3

Revisit at scale (Flow Logs · WAF · Config).

Filter by state

ControlMechanismState
No long-lived keysaws-vault + Keychainenforce
MFA on STSaws:MFAPresentenforce
Permission boundaryqagents-deploy-boundaryenforce
GitHub OIDCIdentityStack · phase 6adopt
CloudFront OACnot OAIadopt
ACM certsno self-signedenforce
Security headersshared CDK policyadopt
HSTS preloadmax-age=63072000adopt
CSPper-site factoryadopt
S3 BlockPublicAccessbucket + accountenforce
S3 SSESSE-KMS on artifactsenforce
EBS encryptionCMK · account defaultenforce
No SSHSSM Session Mgradopt
KMS CMKalias/qagents-cmkadopt
CloudTrail org-wideKMS · validation onadopt
GuardDutyaccount-wideadopt
AWS Budgets$50/moadopt
Alternate contactssecurity + billingadopt
IMDSv2 onlyHttpTokens=requiredenforce
EC2 termination protStaticSiteStackadopt
VPC Flow Logsdeferdefer
WAFdeferdefer
AWS Configdeferdefer
Enforce (8) — caps blast radius regardless of policy drift. Adopt (12) — modern best practices wired in. Defer (3) — revisit at scale.

Metrics

siteCount
4
ec2Count
1
distributionCount
4
runRateUsdPerMo
20–25