This file is the “how to run it” companion to README.md.
python3 -m venv .venv && source .venv/bin/activate
python -m pip install -U pip
python -m pip install -r requirements-dev.txtAWS identity/region:
export AWS_REGION=us-east-2
export AWS_DEFAULT_REGION=us-east-2
# If you use an IAM User/assumed-role profile:
export AWS_PROFILE=audrey-tf
aws sts get-caller-identityIf audrey-tf does not exist locally, create a local alias profile:
make profile-audrey-tf
export AWS_PROFILE=audrey-tf
aws sts get-caller-identityDeploy:
make build
make tf-init
TF_AUTO_APPROVE=1 make tf-applyYou can run everything at once:
make verify-e2eOr capture screenshots step-by-step using the targets below. For each step: Command/Console → Pass criteria → Screenshot.
- Command:
make verify-whoami - Pass: shows Account
818466672474and an Arn containinguser/audrey-tf(or your intended role/user) - Screenshot: terminal output block
- Command:
make verify-tf-outputs - Pass: prints non-empty outputs (buckets, lambdas, queue URLs, optional resources)
- Screenshot: terminal output block
- Command:
make verify-s3-notifications - Console: S3 → your
bronze_bucket→ Properties → Event notifications - Pass: ObjectCreated notification targets the ingest Lambda (prefix includes
bronze/) - Screenshot: Event notification card
- Command:
make verify-lambdas - Console: Lambda →
ingest_lambda/transform_lambda→ Monitor → Logs - Pass: verification command succeeds; log groups exist and show recent invocations after seeding
- Screenshot: Lambda Monitor → Logs view
- Command:
make verify-ddb - Console: DynamoDB → table
idempotency_table_name→ Additional settings → TTL - Pass: TTL is
ENABLEDand items can be scanned - Screenshot: TTL enabled card + terminal scan output
- Command:
make verify-sqs - Console: SQS → main queue + DLQ → Monitoring
- Pass: main queue has ~0 messages and low age; DLQ has 0 messages
- Screenshot: Monitoring charts for both queues
- Command:
make verify-seed - Pass: uploads a JSONL batch to
bronze/…and triggers the pipeline - Screenshot: terminal output + S3 object list (optional)
- Command:
make verify-silver - Console: S3 → your
silver_bucket→silver/<record_type>/… - Pass: Parquet objects exist under
silver/ - Screenshot: S3 object list + terminal output
- Command:
make verify-idempotency - Pass: second invocation is reported as a no-op/duplicate (implementation-specific message), and DynamoDB does not keep growing for identical inputs
- Screenshot: terminal output (both runs)
- Command:
make verify-glue - Console:
- Glue → Databases/Tables (table created)
- Athena → Query editor
- Pass: Glue crawler is
READYand last crawl isSUCCEEDED; Athena can query thesilvertable - Screenshot: Glue table schema + Athena query results
Athena examples (adjust database/table if needed):
SELECT record_type, dt, COUNT(*) AS cnt
FROM silver
GROUP BY record_type, dt
ORDER BY dt DESC;
SELECT dt, shipment_id, origin, destination, carrier, weight_kg, event_time
FROM silver
WHERE record_type = 'shipments'
ORDER BY dt DESC, event_time DESC
LIMIT 20;- Command:
make verify-ge - Console: Step Functions → State machines →
ge_state_machine→ Executions - Pass: latest execution is
SUCCEEDED(or failures are intentional test runs) - Screenshot: execution detail page showing green tasks
- Command:
make verify-observability - Console: CloudWatch → Dashboards / Alarms
- Pass: dashboard exists and alarms are visible
- Screenshot: dashboard + alarms list
Note: if you see Observability disabled or not deployed., it usually means observability_enabled=false (or the module is intentionally skipped). Observability requires permission to create CloudWatch alarms/dashboards (for example: cloudwatch:PutMetricAlarm, cloudwatch:PutDashboard).
If you add images like  and they do not show up:
- The file path is wrong (GitHub is case-sensitive): ensure the file exists exactly at
demo/1.png. - The image is not committed/pushed: run
git status, thengit add demo/1.png && git commit && git push. - The filename contains spaces/parentheses/unicode: use
.png>).
- CloudWatch write restrictions: set
observability_enabled=falseand apply again, or request CloudWatch write permissions. - SQS tag APIs restricted: Terraform may require
sqs:ListQueueTagsduring refresh/create; add the permission or pre-provision the queue and feed URLs via*.auto.tfvars.json.
The repo includes:
.github/workflows/ci.yml:pytest+terraform fmt -check.github/workflows/terraform-manual.yml: manually runplan/apply/destroy
For terraform-manual.yml using auth=keys, add repository secrets:
AWS_ACCESS_KEY_ID: your IAM access key id (e.g.AKIA…)AWS_SECRET_ACCESS_KEY: the corresponding secret access key- (optional)
AWS_SESSION_TOKEN: only if you use temporary credentials
For remote Terraform state (recommended for team usage), set TF_BACKEND_HCL secret to the contents of infra/terraform/backend/backend.hcl.