Version 2.0.0 introduces a modular architecture by extracting IAM roles into a reusable submodule. While this change is functionally equivalent and maintains the same AWS resources, it requires Terraform state migration for existing deployments.
The root module (source/) now uses the modules/iam-roles submodule internally instead of defining IAM resources directly. This change:
- ✅ Does NOT change any AWS resources (same names, policies, permissions)
- ✅ Does NOT change module inputs or outputs
- ✅ Does NOT affect CloudFormation StackSets behavior
⚠️ DOES change Terraform state resource addresses
A new standalone submodule (modules/iam-roles) is now available for customers who need to integrate individual AWS accounts without AWS Organizations or StackSets.
You need to migrate if:
- You are currently using v1.0.0 (or earlier) of the root module
- You want to upgrade to v2.0.0
- You have existing Terraform state with Aikido resources
You do NOT need to migrate if:
- You are deploying Aikido for the first time
- You are using the new
modules/iam-rolessubmodule separately
Version 2.0.0 includes moved blocks that automatically handle state migration. This is the simplest approach.
-
Update your module source to v2.0.0:
module "aikido_security" { source = "github.com/AikidoSec/aws-native-terraform-module//source?ref=v2.0.0" # ... your existing configuration }
-
Run Terraform init:
terraform init -upgrade
-
Run Terraform plan:
terraform plan
You should see output indicating resources are being moved:
Terraform will perform the following actions: # aws_iam_role.aikido_security_cspm has moved to module.iam_roles.aws_iam_role.aikido_security_cspm ... -
Apply the changes:
terraform apply
The moved blocks will automatically update your state file without making any changes to AWS resources.
If you prefer manual control or encounter issues with automated migration:
-
Update your module source to v2.0.0:
module "aikido_security" { source = "github.com/AikidoSec/aws-native-terraform-module//source?ref=v2.0.0" # ... your existing configuration }
-
Run Terraform init:
terraform init -upgrade
-
Move resources in state (adjust based on your configuration):
CSPM Resources (always present):
terraform state mv \ 'module.aikido_security.aws_iam_policy.aikido_security_audit' \ 'module.aikido_security.module.iam_roles.aws_iam_policy.aikido_security_audit' terraform state mv \ 'module.aikido_security.aws_iam_role.aikido_security_cspm' \ 'module.aikido_security.module.iam_roles.aws_iam_role.aikido_security_cspm' terraform state mv \ 'module.aikido_security.aws_iam_role_policy_attachment.aikido_security_audit_aws' \ 'module.aikido_security.module.iam_roles.aws_iam_role_policy_attachment.aikido_security_audit_aws' terraform state mv \ 'module.aikido_security.aws_iam_role_policy_attachment.aikido_security_audit_custom' \ 'module.aikido_security.module.iam_roles.aws_iam_role_policy_attachment.aikido_security_audit_custom'
ECR Resources (if
enable_ecr_scanning = true):terraform state mv \ 'module.aikido_security.aws_iam_policy.aikido_security_ecr_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_policy.aikido_security_ecr_scan[0]' terraform state mv \ 'module.aikido_security.aws_iam_role.aikido_security_ecr_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_role.aikido_security_ecr_scan[0]' terraform state mv \ 'module.aikido_security.aws_iam_role_policy_attachment.aikido_security_ecr_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_role_policy_attachment.aikido_security_ecr_scan[0]'
EBS Resources (if
enable_ebs_scanning = true):terraform state mv \ 'module.aikido_security.aws_iam_policy.aikido_security_ebs_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_policy.aikido_security_ebs_scan[0]' terraform state mv \ 'module.aikido_security.aws_iam_role.aikido_security_ebs_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_role.aikido_security_ebs_scan[0]' terraform state mv \ 'module.aikido_security.aws_iam_role_policy_attachment.aikido_security_ebs_scan[0]' \ 'module.aikido_security.module.iam_roles.aws_iam_role_policy_attachment.aikido_security_ebs_scan[0]'
-
Verify with Terraform plan:
terraform plan
The output should show "No changes" if migration was successful.
If you prefer not to migrate, you can continue using v1.0.0:
module "aikido_security" {
source = "github.com/AikidoSec/aws-native-terraform-module//source?ref=v1.0.0"
# ... your configuration
}Version 1.0.0 will continue to work but won't receive new features.
Symptom: Terraform tries to create resources that already exist in AWS.
Solution: This means state migration didn't complete. Use Option 2 (Manual State Migration) to move resources in your state file.
Symptom: Terraform can't find resources to move.
Cause: Your module might be named differently or resources might already be migrated.
Solution:
- List your current state to find exact resource addresses:
terraform state list | grep aikido - Adjust the state move commands to match your actual resource names.
Symptom: Automated migration (Option 1) doesn't move resources.
Cause: Older Terraform versions may not support moved blocks (requires Terraform 1.0+).
Solution:
- Upgrade Terraform to 1.0 or later
- Or use Option 2 (Manual State Migration)
After migration, verify everything is working:
-
Check Terraform plan shows no changes:
terraform plan
Expected output:
No changes. Your infrastructure matches the configuration. -
Verify IAM roles in AWS Console:
AikidoSecurityReadonlyRoleshould existAikidoSecurityEcrScanningRole(if ECR scanning enabled)AikidoSecurityEbsScanningRole(if EBS scanning enabled)
-
Verify outputs:
terraform output
Should show the same role ARNs as before migration.
If you encounter issues during migration:
- Check this guide's Troubleshooting section
- Review the CHANGELOG.md for detailed changes
- Open an issue in the GitHub repository
A new standalone submodule is now available for deploying Aikido to individual AWS accounts without AWS Organizations:
module "aikido_iam" {
source = "github.com/AikidoSec/aws-native-terraform-module//modules/iam-roles?ref=v2.0.0"
external_id = "your-external-id"
enable_ecr_scanning = true
enable_ebs_scanning = true
}See modules/iam-roles/README.md for details.