AWS Glue + CloudWatch lab with controlled failure drills for PATCHIT.
WORKSPACE_ROOT="<local folder where repos will live>"GITHUB_ORIGIN="<optional: remote github org/repo base>"PATCHIT_CMD="<command to invoke Patchit locally>"OUTPUT_DIR="<local folder for evidence packs and reports>"AWS_PROFILEorAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYAWS_REGIONS3_BUCKET_DATA_LANDINGGLUE_ROLE_ARN(or created via Terraform)
Glue job:
- Reads S3 landing data.
- Validates schema + row counts.
- Writes partitioned Parquet to curated bucket.
- Emits a small manifest for verification.
Terraform deploys S3 buckets, IAM role, Glue jobs (ingest + quality), and log group.
Create a local .env (do not commit):
cat > .env <<'EOF'
AWS_PROFILE=
AWS_REGION=
S3_BUCKET_DATA_LANDING=
GLUE_ROLE_ARN=
PATCHIT_CMD=
OUTPUT_DIR=
EOFcd infra/terraform
terraform init
terraform plan \
-var "aws_region=${AWS_REGION}" \
-var "s3_bucket_data_landing=${S3_BUCKET_DATA_LANDING}" \
-var "glue_role_arn=${GLUE_ROLE_ARN}"Apply (only after explicit confirmation + creds):
terraform apply \
-var "aws_region=${AWS_REGION}" \
-var "s3_bucket_data_landing=${S3_BUCKET_DATA_LANDING}" \
-var "glue_role_arn=${GLUE_ROLE_ARN}"Destroy:
terraform destroy \
-var "aws_region=${AWS_REGION}" \
-var "s3_bucket_data_landing=${S3_BUCKET_DATA_LANDING}" \
-var "glue_role_arn=${GLUE_ROLE_ARN}"Drills are defined in drills/drills.yaml.
Run one drill:
OUTPUT_DIR="<path>" PATCHIT_CMD="<patchit command>" \
./scripts/run_drill.sh AWS1_glue_schema_driftRun all enabled drills:
OUTPUT_DIR="<path>" PATCHIT_CMD="<patchit command>" \
./scripts/run_all_drills.sh${PATCHIT_CMD} \
--repo "$(pwd)" \
--platform aws \
--logs "$LOG_PATH" \
--mode pr_only \
--evidence_out "$EVIDENCE_PATH"- Use smallest job size and small input data.
- Disable schedules by default.
- Always
terraform destroyafter validation.
- Emit Glue failures from EventBridge into a secure webhook/Lambda.
- Store AWS secrets in IAM roles/SSM, not local files.
- Enforce PR-only remediation.
- Local smoke test (no cloud required):
python jobs/glue_job.py- Run a drill:
OUTPUT_DIR="$(pwd)/evidence" PATCHIT_CMD="<your patchit cmd>" \
./scripts/run_drill.sh AWS1_glue_schema_drift- Review outputs:
- Evidence:
evidence/AWS1_glue_schema_drift/evidence_pack.json - Logs:
evidence/AWS1_glue_schema_drift/logs/
- Run all enabled drills:
OUTPUT_DIR="$(pwd)/evidence" PATCHIT_CMD="<your patchit cmd>" \
./scripts/run_all_drills.sh