terraform plan -generate-config-out flag.
Prerequisites
Before you begin, ensure you have:- Terraform 1.14.0 or later (required for list resource support)
- Microsoft 365 provider configured with appropriate credentials
- Read access to the resources you want to discover and import
Supported list resources
The following list resources support this workflow:| Resource Type | Use Case |
|---|---|
microsoft365_graph_beta_device_management_settings_catalog_configuration_policy | Settings Catalog policies |
microsoft365_graph_beta_device_management_windows_platform_script | Windows PowerShell scripts |
microsoft365_graph_beta_identity_and_access_conditional_access_policy | Conditional Access policies |
microsoft365_graph_beta_users_user | Users |
Overview
The workflow consists of three phases:Example: Importing Settings Catalog Policies
This example demonstrates importing Windows 10 baseline policies that exist in Intune but aren’t managed by Terraform.Step 1: Discover Resources
Creatediscover.tfquery.hcl to query for baseline policies:
discover.tfquery.hcl
Step 2: Generate Configuration
Generate Terraform configuration for all discovered policies:baselines.tf containing:
resourceblocks with complete configurationimportblocks with resource identities
Step 3: Review Generated Configuration
The generated file contains verbose configuration. Review and refine:baselines.tf
Common refinements:
- Remove null/default values
- Replace literal IDs with resource references
- Extract common values to locals
- Add comments for documentation
Step 4: Import Resources
Apply the configuration to import resources into state:Step 5: Verify and Clean Up
Verify resources are in state:baselines.tf after successful import.
Verify no drift:
No changes. Your infrastructure matches the configuration.
Refining Generated Configuration
Generated configuration is literal and verbose. Transform it for production use.Express Dependencies
Replace literal IDs with resource references:Use for_each for Similar Resources
Convert repetitive resources to usefor_each:
Centralize Common Values
Extract repeated values:Advanced Filtering
Multiple Filters
Combine filters to target specific resources:Custom OData Queries
Use OData filters for complex queries:Best Practices
Start Small
Test with small batches before large-scale imports:Name Resources Consistently
Use descriptive names in generated configuration:Version Control
Commit generated configuration after review:Organize Files
Keep discovery queries separate from resource management:Troubleshooting
Import Block Errors
Import Block Errors
Error:
Missing Resource Identity After ReadSolution: Verify the resource type supports import and update to the latest provider version.Generated Configuration Issues
Generated Configuration Issues
Error: Invalid syntax in generated configurationSolution:
- Run
terraform validateto identify errors - Adjust complex nested blocks manually
- Test with
terraform plan
List Resource Returns No Results
List Resource Returns No Results
Solution: Simplify filters progressively:
Related resources
Terraform import
Official Terraform import documentation
List resources
Terraform list resources framework
Microsoft Graph API
Microsoft Graph API documentation
Progressive rollout
Learn about phased deployments with GUID List Sharder
