@ beesolve/分析-dashboard
用于查看CloudFront交通分析的SvelteKit仪表板——部署在CloudFront后方的AWS Lambda上,并有电子邮件编码认证.
[尖叫声] 前1.0——不稳定的API. 这个软件包是
0.x活动 发展。 打破的改变可以降落在任何0.x释放无主 版本凸起。 选中一个精确的版本并在升级前审查更改日志 . 一旦API稳定,包裹到达1.0.0,它跟随语义 版本和此通知被删除 .
建筑
┌────────────┐ ┌──────────────┐ ┌─────────┐ ┌──────────┐
│ CloudFront │ ──► │ Lambda (SSR) │ ──► │ DynamoDB│ │ SES │
└────────────┘ └──────────────┘ └─────────┘ └──────────┘
│ ▲ ▲
│ read-only │ analytics table │
│ (AnalyticsProcessor.grantRead) OTP emails via
└── /auth/* ──► AuthGateway (authorizer) @beesolve/email-service
仪表板读取 @beesolve/analytics-processor 迪纳摩DB表(时/日/月)
总计 + 分数 只读它自己的小DynatomDB 桌子持有
仪表板 Users编号 :Setup 记录(签名、角色).
先决条件
npm install \
@beesolve/analytics-dashboard \
@beesolve/analytics-processor \
@beesolve/cdk-constructs \
@beesolve/auth-service \
aws-cdk \
aws-cdk-lib \
constructs
@beesolve/cdk-constructs—— 说CloudFrontAccessLoggingSettings带有标准日志 v2@beesolve/analytics-processor– Athena 查询结果汇总到 DynamoDB@beesolve/auth-service——与会话管理层进行电子邮件码认证
CDK 设置
import { AnalyticsDashboard } from "@beesolve/analytics-dashboard/cdk";
import { requiredRecordFields } from "@beesolve/analytics-processor";
import { AnalyticsProcessor } from "@beesolve/analytics-processor/cdk";
import { AuthGateway } from "@beesolve/auth-service/cdk";
import { CloudFrontAccessLoggingSettings } from "@beesolve/cdk-constructs";
import { App, RemovalPolicy, Stack } from "aws-cdk-lib";
const frontendUri = process.env.FRONTEND_URI;
if (frontendUri == null) throw new Error("FRONTEND_URI environment variable is required");
const app = new App();
const stack = new Stack(app, "AnalyticsStack", {
env: { account: "123456789012", region: "eu-central-1" },
});
// 1. Log the distribution to S3 as Parquet (standard logging v2)
const logging = new CloudFrontAccessLoggingSettings(stack, "Logging", {
athena: { account: "123456789012", recordFields: requiredRecordFields },
});
// ...create your CloudFront `distribution`, spreading
// `...logging.cloudFrontLoggingSettings` into its props, then:
logging.enableV2Logging({
distributionArn: `arn:aws:cloudfront::123456789012:distribution/${distribution.distributionId}`,
});
// 2. Aggregate logs into DynamoDB
const processor = new AnalyticsProcessor(stack, "Processor", {
athenaDatabase: logging.glueDatabaseName!,
athenaV2Table: logging.glueTableName!,
athenaWorkgroup: logging.workgroupName!,
logBucketArn: logging.logBucket.bucketArn,
athenaResultsBucketArn: logging.athenaResultsBucket?.bucketArn,
});
// 3. Set up authentication
const auth = new AuthGateway(stack, "Auth", {
stage: "prod",
frontendUri,
allowSignUp: false,
authorizerCache: "disabled",
});
// 4. Deploy the dashboard
const dashboard = new AnalyticsDashboard(stack, "AnalyticsDashboard", {
auth,
processor,
emailSender: {
name: "Analytics Dashboard",
emailAddress: "[email protected]",
},
});
这个 AnalyticsDashboard 构建条款:
- SvelteKit app on Lambda (通过
kit-on-lambda(中文(简体) ) - 带有 Auth 饼干执行的 CloudFront 分布
- 认证行为
/auth/*路线 - 用于仪表板的专用DynamoDB表(+逆向GSI)
Users编号 :Setup,通过ANALYTICS_USERS_TABLE编号 :ANALYTICS_USERS_REVERSE_INDEX - 只读访问处理器分析表
processor.grantRead(handler)(单位:千美元)ANALYTICS_TABLE_NAME编号 :ANALYTICS_REVERSE_INDEX(中文(简体) ) - 检察官办公室编码的电子邮件服务
- 事件Bridge 认证事件规则( 发送 OTP 电子邮件)
数据层( 远程函数)
仪表板通过SvelteKit远程功能读取其数据,而不是 +page.server.ts
load编号 :actions定义 src/lib/remote/*.remote.ts数字 :
getOverview({ grain, anchor?, size? })——每粒夹住窗口,计算边界 从主机中确定密钥( 没有 DynamoDB 光标), 并返回总计序列 加号prev编号 :next锚.getBreakdown({ dimension, grain, periodKey })——读出单一的分界线分解.users编号 :setup远程函数镜像@beesolve/dmarc-dashboard(守军,toRemoteError, (中文(简体) ),requireUser编号 :requireAdmin) (中文(简体) ).
环境变量在 src/env.ts 通过 defineEnvVars (瓦利博特计划)和
从 $app/env/private数字 : ANALYTICS_TABLE_NAME, (中文(简体) ),
ANALYTICS_REVERSE_INDEX, (中文(简体) ), ANALYTICS_USERS_TABLE, (中文(简体) ), ANALYTICS_USERS_REVERSE_INDEX。 。 。 .
第一次部署
SvelteKit大楼需要 FRONTEND_URI 环境变量(CloudFront URL),它直到第一次部署后才存在:
- 设定
FRONTEND_URI到占位符 URL( 例如).https://placeholder.cloudfront.net(中文(简体) ) - 部署 — 从 CDK 输出注意 CloudFront URL
- 更新
FRONTEND_URI使用真实的 URL 并重新部署
回填历史
CloudFront 标准日志 v2 仅在升级后开始收集 Parquet 数据
CloudFrontAccessLoggingSettings 已经部署。 历史交通生活 已经收集
v1 (tab- delited) 日志. 运行一次性回填 @beesolve/analytics-processor 曾经,
作为操作员,在任何人依赖远程视图之前将表格从v1历史中填入:
# from the analytics-processor package, with AWS creds (AWS_PROFILE) in scope
bun run backfill -- --from 2026-01-01T00:00:00Z --to 2026-02-01T00:00:00Z
后填是可再接再励的,而且恰好是一模一样的 (每小时的一能标记),所以重新运行它 跳过已处理的小时。 请参看处理器 README的全旗参考.
地方发展
运行 SvelteKit dev 服务器对面 真实 已部署后端- 无固定装置 :
bun install
cp .env.local.example .env.local # then fill in real values
aws sso login # (or export AWS_PROFILE) so SDK clients can reach AWS
bun run dev
当地没有Lambda授权人,所以 @beesolve/auth-service 输入 dev 会话
自动。 设定 DEV_USER_EMAIL 内 .env.local 改为 真实 用户在用户中的电子邮件
表格 —— 应用浏览它以解决用户的角色. 这是由守护 import.meta.env.DEV
绝不包含在已部署的包里.
特征
- 以小时/日/月/年谷物切换和滚动的预/下个窗口进行概览
- 显示点击、成功、出错和字节的站牌
- 分解分解: HTTP 状态、 国家、 设备以及顶端路径
- 电子邮件编码登录( 无密码) + 用户管理( 请, 删除)