@@ -125,7 +125,7 @@ cd AWS-Serverless-ELT-Pipeline-Enterprise
125125git checkout v2.0
126126```
127127
128- ### 1) Python 虚拟环境 + 依赖
128+ ### 1) Python ENV + Dependencies
129129
130130``` bash
131131python3 -m venv .venv
@@ -238,12 +238,12 @@ make ge-status
238238make ge-history
239239```
240240
241- ## GitHub Actions(更像企业交付)
241+ ## GitHub Actions
242242
243243本仓库包含:
244244
245245- ` .github/workflows/ci.yml ` :` pytest ` + ` terraform fmt -check `
246- - ` .github/workflows/terraform-manual.yml ` :手动触发的 ` plan/apply/destroy ` (企业版工作流 )
246+ - ` .github/workflows/terraform-manual.yml ` :手动触发的 ` plan/apply/destroy ` (工作流 )
247247
248248### terraform-manual:先配 Secrets 再运行
249249
@@ -272,7 +272,7 @@ ls -la configs/ups_shipping.yaml lambdas/transform/ups_shipping/handler.py dq/up
272272
273273## E2E 验收清单(见截图)
274274
275- 目标:按顺序过一遍就能留存证据。每一步都有「要点 → 命令/控制台路径 → 通过标准(截图点 )」。
275+ 目标:按顺序过一遍就能留存证据。每一步都有「要点 → 命令/控制台路径 → 通过标准(截图 )」。
276276
277277建议先跑一键版(会依次执行多步 CLI 验证 + 造数 + 等待 Silver):
278278
@@ -286,112 +286,101 @@ ls -la configs/ups_shipping.yaml lambdas/transform/ups_shipping/handler.py dq/up
286286- ` make profile-audrey-tf `
287287- 然后:` export AWS_PROFILE=audrey-tf `
288288
289- ### 0) 我是谁( Profile/ Region)
289+ ### 0) Profile / Region
290290
291291要点:确认当前命令行使用的 AWS 身份与区域。
292292
293293- 命令:` make verify-whoami `
294294- 通过:` Account=818466672474 ` ,且 Arn 对应你预期的身份(可为 ` user/audrey-tf ` 或 Toolkit 登录的 session)。
295- - 截图:终端输出整块(含 ` AWS_PROFILE ` / ` AWS_REGION ` )。
296295![ ] ( < demo/0-我是谁(Profile:Region+Python环境).png > )
297296
298- ### 1) Terraform 输出就绪
297+ ### 1) Terraform
299298
300299要点:确保 TF 已部署并且能输出关键资源名/ARN。
301300
302301- 命令:` make verify-tf-outputs `
303302- 通过:输出里至少包含 ` bronze_bucket ` / ` silver_bucket ` / ` queue_url ` / ` ingest_lambda ` / ` transform_lambda ` 。
304- - 截图:终端 output。
305303![ ] ( < demo/1-Terraform用对了身份+Region.png > )
306304![ ] ( < demo/1-Terraform用对了身份+Region-2.png > )
307305
308306
309- ### 2) S3 事件触发已就绪 (bronze → ingest)
307+ ### 2) S3 (bronze → ingest)
310308
311309要点:S3 Event notification 指向 ingest Lambda,并且 prefix 为 ` bronze/ ` 。
312310
313311- 命令:` make verify-s3-notifications `
314312- 控制台:S3 → ` <bronze_bucket> ` → Properties → Event notifications
315313- 通过:事件存在且目标 ARN 为 ingest。
316- - 截图:控制台 Event notification 卡片(或终端 table 输出)。
317314![ ] ( < demo/2-S3事件触发已就绪(bronze→LambdaIngest).png > )
318315
319- ### 3) Lambda 存在且可读 (ingest / transform)
316+ ### 3) Lambda (ingest / transform)
320317
321318- 命令:` make verify-lambdas `
322319- 通过:输出 ` OK ingest=... ` 、` OK transform=... `
323- - 截图:终端输出;控制台 Lambda → Monitor → Logs
324320![ ] ( < demo/3-Lambda正常(ingest-transform).png > )
325321
326- ### 4) 幂等表 (DynamoDB)与 TTL(对象级别)
322+ ### 4) Idempotency (DynamoDB)+ TTL
327323
328324要点:本项目幂等粒度是 ** S3 对象级别** :` s3://bucket/key#etag ` ,不是 record/event_id 级别。
329325
330326- 命令:` make verify-ddb `
331327- 通过:TTL ` ENABLED ` ;scan 能看到 ` pk/status ` 等字段。
332- - 截图:终端 TTL 输出 + scan 输出(前几条)。
333328![ ] ( < demo/4-幂等表-DynamoDB-TTL.png > )
334329
335- ### 5) SQS / DLQ 健康
330+ ### 5) SQS / DLQ
336331
337332- 命令:` make verify-sqs `
338333- 通过:主队列消息数接近 0;DLQ 为 0。(消息“最老年龄”属于 CloudWatch 指标,不是 SQS attribute)
339- - 截图:终端 ` get-queue-attributes ` 输出; SQS 控制台 Monitoring 图表。
340334![ ] ( < demo/5-SQS-DLQ健康.png > )
341335
342- ### 6) 造数触发 E2E (S3 → ingest → SQS → transform → Silver)
336+ ### 6) End to End (S3 → ingest → SQS → transform → Silver)
343337
344338要点:上传一份 Bronze JSONL 触发整条链路。
345339
346340- 命令:` make verify-seed ` (会把本次上传写入 ` $(E2E_LAST_SEED_FILE) ` )
347341- 通过:上传成功(终端会打印 ` s3://<bronze>/<key> ` )
348- - 截图:终端输出 + S3 控制台里该对象 Key
349342![ ] ( < demo/造数触发E2E(S3-ingest-SQS-transform-Silver).png > )
350343
351- ### 7) Silver 产出 Parquet(等待窗口)
344+ ### 7) Silver → Parquet
352345
353346- 命令:` make verify-silver `
354347- 通过:最近 ` $(VERIFY_WINDOW_MINUTES) ` 分钟内能观测到 ` silver/shipments/ ` 下新增 parquet。
355- - 截图:终端 OK 输出;或 S3 控制台显示 parquet 文件列表。
356348![ ] ( < demo/6-造数触发整条链路(S3→ingest→SQS→transform→Silver).png > )
357349
358- ### 8) 幂等验收(同一对象重复触发会被跳过)
350+ ### 8) Idempotency Validation - Exactly Once
359351
360352要点:为了避免 S3 自动触发干扰,这一步会把对象上传到 ` $(E2E_IDEMPOTENCY_PREFIX)/... ` (不匹配 ` bronze/ ` 通知),然后手动 invoke ingest 两次,第二次应 ` skipped>=1 ` 。
361353
362354- 命令:` make verify-idempotency `
363355- 通过:第二次 invoke 输出里 ` skipped>=1 ` ,并打印 ` OK: second invoke skipped ` 。
364- - 截图:终端 first/second 两段输出。
365356![ ] ( < demo/7-幂等验收-profile-key-lambda-invoke.png > )
366357
367- ### 9) Glue / Athena(可选)
358+ ### 9) Glue / Athena
368359
369360前提:` glue_enabled=true ` 。
370361
371362- 命令:` make verify-glue `
372363- 通过:crawler ` LastCrawl=SUCCEEDED ` ;能看到 database 名称。
373- - 截图:Glue 控制台表结构页 + Athena 查询结果(见下方 “Athena quick queries”)。
374364![ ] ( < demo/8-GlueCatalog-Athena可查询.png > )
375365![ ] ( < demo/Athena.png > )
376366
377- ### 10) GE 质量门禁(可选)
367+ ### 10) Great Expectations Quality Gate
368+
378369
379370前提:` ge_enabled=true ` 且 ` ge_workflow_enabled=true ` 。
380371
381372- 命令:` make verify-ge ` (列出最近执行;手动触发用 ` make ge-start ` )
382373- 通过:能看到最近的 executions;或至少 state machine 存在。
383- - 截图:Step Functions execution 详情(Glue task 绿勾)或终端 list-executions 输出。
384374![ ] ( < demo/9-质量门禁-StepFunctions-GlueGEJob.png > )
385375![ ] ( < demo/step-function-1.png > )
386376![ ] ( < demo/step-function-2.png > )
387377
388- ### 11) CloudWatch Dashboard(可选)
378+ ### 11) CloudWatch Dashboard
389379
390380前提:` observability_enabled=true ` 且账号允许 ` cloudwatch:PutDashboard ` 。
391381
392382- 命令:` make verify-observability `
393383- 通过:输出 ` OK dashboard=... `
394- - 截图:CloudWatch Dashboard 预览页。
395384
396385## Quickstart (dev)
397386
0 commit comments