Skip to main content
compliance · aws

SageMaker notebooks with no lifecycle configuration attached

resource types
1
rule IDs covered
1
severity
low

What does ZopNight detect here?

Lifecycle configurations are the only hook that runs on every notebook start: package installs, security agents, and the auto-stop script that halts idle instances. ZopNight flags in-service notebooks whose lifecycleConfigName is confirmed empty. Severity is low, but the missing auto-stop hook routinely costs more than any 1 misconfiguration here.

Signal and threshold

How ZopNight evaluates SageMaker notebooks with no lifecycle configuration attached.
Field Value
Rule IDsRC-1623
Categorycompliance
Severitylow
Metricnone — pure configuration read
Sourcesagemaker_compliance.go

The lowest-severity finding with a real invoice attached

Strictly, this is hygiene: a notebook without a lifecycle configuration still works. But the lifecycle config’s on-start hook is where fleets attach the idle auto-stop script, and a notebook without one runs until a human remembers it exists. An ml.m5.xlarge left up over a long weekend bills every one of those hours at its notebook instance rate for zero work. The rule itself claims no dollar figure, since idle detection is a different rule’s job, but the cheapest fix for that whole class of waste is the hook this finding says is missing.

Drift is the other half

Without a lifecycle configuration, every notebook is built by hand: users pip-install their own stacks, clone repos ad hoc, and configure credentials in whatever way occurred to them that morning. Six months later no two instances are alike and none are reproducible. A lifecycle config turns “how notebooks are set up here” from tribal knowledge into a script: version-pinned installs, the security tooling your org requires, and standard repo checkouts, applied identically on every start.

Detection mechanics

Discovery stamps lifecycleConfigName from the notebook description; a present-but-empty value is the confirmed no-config state and the only one that fires. Absent metadata (failed describe) abstains, and non-in-service notebooks are excluded so the finding never argues with a deletion recommendation on the same instance.

See which notebooks lack one

Terminal window
aws sagemaker list-notebook-instances \
--query 'NotebookInstances[].[NotebookInstanceName,NotebookInstanceLifecycleConfigName]' \
--output table

Blank second column, in-service instance: this finding.

Attaching one retroactively

Unlike the VPC and CMK settings, this is repairable in place: stop the notebook, attach the lifecycle configuration, start it. Begin with the auto-stop script (AWS publishes a sample that checks Jupyter idle time and stops the instance), add your provisioning steps, and keep the on-start script fast. A script exceeding the timeout leaves the notebook stuck in Pending, which is how lifecycle configs get a bad name. Once the standard config exists, bake it into the template creating notebooks so new instances never fire this finding at all.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·