npx skills add ...
npx skills add snyk/studio-recipes --skill drift-detector
Detect infrastructure drift between Terraform state and actual cloud resources. Identifies unmanaged resources, manual changes, and configuration drift. Use when: - User asks to check for infrastructure drift - User wants to find unmanaged cloud resources - User mentions "drift detection" or "Terraform drift" - User asks to compare cloud state to IaC - User wants to audit infrastructure changes
npx skills add snyk/studio-recipes --skill drift-detector
Detect, track, and resolve infrastructure drift between Terraform state and actual cloud resources to maintain Infrastructure as Code integrity.
Core Principle: Your cloud should match your code.
Note: This skill uses snyk iac describe CLI command (requires shell execution).
snyk CLI installed| Provider | Setup |
|---|---|
| AWS | AWS credentials (profile, env vars, or IAM role) |
| Azure | Azure CLI login or service principal |
| GCP | Application default credentials or service account |
For a full list of supported resource types per provider, see SERVICES.md.
Goal: Configure drift detection environment.
Check for Terraform state:
Local state:
Remote state (S3 backend):
AWS:
Azure:
GCP:
Goal: Identify differences between IaC and actual cloud state.
For S3 backend:
For Terraform Cloud:
To focus on specific AWS services:
Goal: Understand and categorize drift.
| Category | Description | Risk Level |
|---|---|---|
| Unmanaged | Resources not in Terraform | High - shadow IT |
| Changed | Resources modified outside Terraform | Medium - config drift |
| Missing | Resources in state but deleted | Low - usually intentional |
Prioritize Critical issues first (e.g. SSH opened to 0.0.0.0/0, production HA disabled), then High risk issues (e.g. unmanaged IAM users or security groups). Document the affected resource, the risk, and the intended remediation action for each finding.
Goal: Resolve drift and restore IaC integrity.
For resources that should be in Terraform:
For resources that shouldn't exist:
For resources modified outside Terraform:
If the manual change should be kept:
Goal: Prevent future drift.
For expected drift (auto-scaling, etc.):
This creates a .snyk policy file:
Add drift detection to CI/CD:
Schedule regular drift audits:
| Frequency | Scope | Purpose |
|---|---|---|
| Daily | Critical resources | Security monitoring |
| Weekly | All production | Configuration audit |
| Monthly | All environments | Comprehensive review |
For detailed worked examples, see EXAMPLES.md. Brief references:
ls terraform.tfstateterraform {
backend "s3" {
bucket = "my-terraform-state"
key = "state/terraform.tfstate"
region = "us-east-1"
}
}aws sts get-caller-identityaz account showgcloud auth application-default print-access-tokensnyk iac describe --from=tfstate://terraform.tfstatesnyk iac describe --from=tfstate+s3://my-bucket/state.tfstatesnyk iac describe \
--from=tfstate+tfcloud://organization/workspace \
--tfc-token=$TFC_TOKENsnyk iac describe \
--from=tfstate://terraform.tfstate \
--service=aws_s3,aws_ec2,aws_rdssnyk iac describe \
--from=tfstate://terraform.tfstate \
--json > drift-report.json## Infrastructure Drift Report
Scan Date: 2024-01-15
Terraform State: s3://my-bucket/prod.tfstate
Cloud Provider: AWS (us-east-1)
### Summary
- Unmanaged Resources: 12 (High)
- Changed Resources: 5 (Medium)
- Missing Resources: 2 (Low)
- Total Drift: 19
### Unmanaged Resources (Not in Terraform)
- aws_s3_bucket | prod-logs-manual | High | Import or delete
- aws_security_group | sg-temp-access | Critical | Review and remove
### Changed Resources (Modified Outside Terraform)
- aws_security_group.web | ingress: [443] → ingress: [443, 22] | High
- aws_rds_instance.main | multi_az: true → multi_az: false | Critical# Generate import block
terraform import aws_s3_bucket.manual_bucket prod-logs-manual
# Or use import block (Terraform 1.5+)import {
to = aws_s3_bucket.manual_bucket
id = "prod-logs-manual"
}# After verification, delete unmanaged resources
aws s3 rb s3://unauthorized-bucket --force
aws ec2 terminate-instances --instance-ids i-temp-server# Re-apply Terraform to restore intended state
terraform apply# Update Terraform to match new reality
resource "aws_security_group" "web" {
# Add the new rule
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["10.0.0.0/8"] # Restrict if keeping
}
}snyk iac update-exclude-policy \
--exclude-unmanaged \
--exclude-changedexclude:
iac-drift:
- aws_autoscaling_group.*
- aws_ecs_service.*:desiredCount# GitHub Actions example
- name: Check for Infrastructure Drift
run: |
snyk iac describe \
--from=tfstate+s3://my-bucket/prod.tfstate \
--json > drift.json
# Fail if unmanaged resources found
if [ $(jq '.summary.total_unmanaged' drift.json) -gt 0 ]; then
echo "Drift detected!"
exit 1
fiError: Could not read Terraform state
Solutions:
1. Verify state file path
2. Check S3/backend permissions
3. Ensure terraform init has been runError: Authentication failed
Solutions:
1. Verify cloud credentials
2. Check IAM permissions for describe/list
3. Ensure credentials not expiredWarning: Service X not supported
Solutions:
1. Check supported services list
2. Use Terraform plan comparison instead
3. Report to Snyk for feature request