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
86
82%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Passed
No known issues
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).
# Basic drift scan against a local Terraform state file
snyk iac describe --from=tfstate://terraform.tfstate
# Output as JSON for further analysis
snyk iac describe --from=tfstate://terraform.tfstate --json > drift-report.jsonsnyk 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:
ls terraform.tfstateRemote state (S3 backend):
terraform {
backend "s3" {
bucket = "my-terraform-state"
key = "state/terraform.tfstate"
region = "us-east-1"
}
}AWS:
aws sts get-caller-identityAzure:
az account showGCP:
gcloud auth application-default print-access-tokenGoal: Identify differences between IaC and actual cloud state.
snyk iac describe --from=tfstate://terraform.tfstateFor S3 backend:
snyk iac describe --from=tfstate+s3://my-bucket/state.tfstateFor Terraform Cloud:
snyk iac describe \
--from=tfstate+tfcloud://organization/workspace \
--tfc-token=$TFC_TOKENTo focus on specific AWS services:
snyk iac describe \
--from=tfstate://terraform.tfstate \
--service=aws_s3,aws_ec2,aws_rdssnyk iac describe \
--from=tfstate://terraform.tfstate \
--json > drift-report.jsonGoal: 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 |
## 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 | CriticalPrioritize 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:
# 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"
}For resources that shouldn't exist:
# After verification, delete unmanaged resources
aws s3 rb s3://unauthorized-bucket --force
aws ec2 terminate-instances --instance-ids i-temp-serverFor resources modified outside Terraform:
# Re-apply Terraform to restore intended state
terraform applyIf the manual change should be kept:
# 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
}
}Goal: Prevent future drift.
For expected drift (auto-scaling, etc.):
snyk iac update-exclude-policy \
--exclude-unmanaged \
--exclude-changedThis creates a .snyk policy file:
exclude:
iac-drift:
- aws_autoscaling_group.*
- aws_ecs_service.*:desiredCountAdd drift detection to CI/CD:
# 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
fiSchedule 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:
Error: 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 request9293725
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.