AWS Organizations account migration readiness guide
Disclaimer: This guide provides best-effort guidance based on commonly encountered dependencies and considerations when transferring AWS accounts between organizations. The successful completion of any migration depends on each customer's unique scenario, workloads, and dependencies. Customers are responsible for thoroughly assessing their specific environment, validating all dependencies, and testing their migration plan before execution. This guide does not cover every possible dependency or edge case.
Scope
This guide covers account migration between AWS Organizations. The approach described here uses Account Assessment for AWS Organizations and CFAT to expedite the review and assessment process. Depending on the tools or approach you decide to use, the steps may vary, but this provides one validated way to do it.
When moving accounts into an AWS Control Tower environment, use this guide as a pre-migration dependency check, then follow the Enroll an existing AWS account guide as a complement after the account has been transferred to the target organization.
Key services and dependencies at a glance
The following table summarizes the key AWS services and features that may be impacted when an account is transferred between organizations:
| Category | Service/feature | Impact on transfer |
|---|---|---|
| Access control | IAM Identity Center | Permission set assignments removed; users lose access |
| Authorization | Service control policies (SCPs) | Stop applying immediately |
| Authorization | Resource control policies (RCPs) | Stop applying immediately |
| Declarative | Declarative policies (EC2) | Stop applying immediately |
| Management | Tag, Backup, AI opt-out policies | Detached from account |
| Infrastructure | AWS CloudFormation StackSets | Resources may be deleted (depends on retention setting) |
| Resource sharing | AWS Resource Access Manager | Organization-scoped shares revoked (unless retention enabled) |
| Delegation | Delegated administrator services | Must deregister before transfer; some services delete data |
| Policy conditions | aws:PrincipalOrgID / aws:PrincipalOrgPaths | Policies referencing source organization ID will deny access |
| Billing | Reserved Instances / Savings Plans | Organization-wide sharing benefits lost |
| Billing | Cost allocation tags | Must re-activate in target organization |
| Observability | Amazon EventBridge cross-account | Event bus policies referencing organization ID will break |
| Account access | Root user / OrganizationAccountAccessRole | May lose all access if not verified before transfer |
Overview
This guide provides a step-by-step process for assessing migration readiness before transferring an AWS account between AWS Organizations. It combines automated tooling (Account Assessment for AWS Organizations + CFAT) with validated CLI commands to cover all dependencies.
Applicable for: Mergers & acquisitions, organization consolidation, account restructuring.
Key features leveraged:
- Direct Account Transfers (Nov 2025) — no standalone period required
- AWS RAM RetainSharingOnAccountLeaveOrganization (Feb 2026) — preserve resource shares during transfer
References:
- Migrate an account to another organization — AWS documentation
- Moving an account - Part 1: Policies, AWS RAM, condition keys — AWS blog
- Moving an account - Part 2: Delegated administrators — AWS blog
Phase 1: Deploy assessment tools
1.1 Deploy Account Assessment for AWS Organizations
Deploy in the management account. Provides: Policy Explorer, Delegated Admin scan, Trusted Access scan.
For simplicity, this guide shows deploying the Hub stack in the management account. For production environments, AWS recommends deploying the Hub stack in a separate member account (e.g., a shared services or security tooling account) to follow the principle of least privilege in the management account. The Org-Management stack is always deployed in the management account regardless.
Hub Stack (management account):
aws cloudformation create-stack \
--stack-name AccountAssessment-Hub \
--template-url https://solutions-reference.s3.amazonaws.com/account-assessment-for-aws-organizations/latest/account-assessment-for-aws-organizations-hub.template \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \
--parameters \
ParameterKey=DeploymentNamespace,ParameterValue=<NAMESPACE> \
ParameterKey=UserEmail,ParameterValue=<EMAIL> \
"ParameterKey=AllowListedIPRanges,ParameterValue=0.0.0.0/1\,128.0.0.0/1" \
ParameterKey=OrganizationID,ParameterValue=<ORG_ID> \
ParameterKey=ManagementAccountId,ParameterValue=<MGMT_ACCOUNT_ID> \
--region <REGION>
Org-Management Stack (management account):
aws cloudformation create-stack \
--stack-name AccountAssessment-OrgMgmt \
--template-url https://solutions-reference.s3.amazonaws.com/account-assessment-for-aws-organizations/latest/account-assessment-for-aws-organizations-org-management.template \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \
--parameters \
ParameterKey=DeploymentNamespace,ParameterValue=<NAMESPACE> \
ParameterKey=HubAccountId,ParameterValue=<HUB_ACCOUNT_ID> \
--region <REGION>
Spoke Stack (each account to assess, via StackSet):
aws cloudformation create-stack-set \
--stack-set-name AccountAssessment-Spoke \
--template-url https://solutions-reference.s3.amazonaws.com/account-assessment-for-aws-organizations/latest/account-assessment-for-aws-organizations-spoke.template \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM \
--parameters \
ParameterKey=DeploymentNamespace,ParameterValue=<NAMESPACE> \
ParameterKey=HubAccountId,ParameterValue=<HUB_ACCOUNT_ID> \
--permission-model SERVICE_MANAGED \
--auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false \
--region <REGION>
aws cloudformation create-stack-instances \
--stack-set-name AccountAssessment-Spoke \
--deployment-targets OrganizationalUnitIds=<ROOT_OR_OU_ID> \
--regions <REGION> \
--region <REGION>
Important: Also deploy the Spoke stack directly in the management account (StackSets with SERVICE_MANAGED exclude it):
aws cloudformation create-stack \
--stack-name AccountAssessment-Spoke \
--template-url https://solutions-reference.s3.amazonaws.com/account-assessment-for-aws-organizations/latest/account-assessment-for-aws-organizations-spoke.template \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM CAPABILITY_AUTO_EXPAND \
--parameters \
ParameterKey=DeploymentNamespace,ParameterValue=<NAMESPACE> \
ParameterKey=HubAccountId,ParameterValue=<HUB_ACCOUNT_ID> \
--region <REGION>
1.2 Run CFAT (Cloud Foundation Assessment Tool)
Run from CloudShell in the management account:
curl -sSL https://raw.githubusercontent.com/cloud-foundations-on-aws/cloud-foundations-templates/main/cfat/run-assessment.sh | sh
Download results: ./cfat/assessment.zip
Phase 2: Automated assessment (Account Assessment tool)
2.1 Run Scans from Web UI
- Log in to the Account Assessment web UI (check email for Cognito credentials)
- Run Delegated Admin scan → Download CSV
- Run Trusted Access scan → Download CSV
- Wait for Policy Explorer nightly scan (or trigger manually):
# Trigger Policy Explorer scan manually
aws lambda invoke \
--function-name <NAMESPACE>-PolicyExplorerStartScan-<ID> \
--payload '{"source": "manual-trigger"}' \
--region <REGION> \
/dev/null
2.2 Search Policy Explorer for organization dependencies
In the web UI Policy Explorer:
- Click "Add OrgId" button to search for your Organization ID in policy conditions
- Search for
aws:PrincipalOrgID,aws:PrincipalOrgPaths,aws:ResourceOrgID - Download results as CSV
What this finds:
- Resource-based policies with organization conditions (S3, KMS, SQS, SNS, Lambda, etc.)
- Identity-based policies referencing the organization
- SCPs with organization-specific conditions
Phase 3: Manual dependency checks (CLI commands)
The following checks cover gaps not addressed by the automated tools.
3.1 AWS CloudFormation StackSets targeting the account
Risk: Service-managed StackSets will DELETE resources from the account when it leaves the organization (unless RetainStacksOnAccountRemoval=true).
Run these commands from the management account or a delegated administrator account for CloudFormation StackSets. Service-managed StackSets can only be managed from these accounts.
# List all active StackSets
aws cloudformation list-stack-sets --status ACTIVE --region <REGION>
# For each StackSet, check if the migrating account has instances
aws cloudformation list-stack-instances \
--stack-set-name <STACKSET_NAME> \
--stack-instance-account <ACCOUNT_ID> \
--region <REGION>
# Check the retention setting
aws cloudformation describe-stack-set \
--stack-set-name <STACKSET_NAME> \
--region <REGION> \
--query "StackSet.AutoDeployment.RetainStacksOnAccountRemoval"
Action: For each StackSet with RetainStacksOnAccountRemoval=false that deploys critical resources, either:
- Update to
RetainStacksOnAccountRemoval=truebefore migration - Or document that those resources will be deleted and plan to recreate in target organization
3.2 IAM Identity Center assignments
Risk: All permission set assignments for the migrating account are removed when it leaves. Users lose IAM Identity Center access to that account.
Run these commands from the management account or the Identity Center delegated administrator account.
# Get Identity Center instance ARN
aws sso-admin list-instances --region <REGION>
# List all permission sets provisioned to the account
aws sso-admin list-permission-sets-provisioned-to-account \
--instance-arn <INSTANCE_ARN> \
--account-id <ACCOUNT_ID> \
--region <REGION>
# For each permission set, list who has access
aws sso-admin list-account-assignments \
--instance-arn <INSTANCE_ARN> \
--account-id <ACCOUNT_ID> \
--permission-set-arn <PERMISSION_SET_ARN> \
--region <REGION>
Action: Document all assignments. In the target organization's Identity Center, recreate equivalent permission sets and assignments after migration.
3.3 AWS Resource Access Manager (AWS RAM) resource shares
Risk: Organization-scoped AWS RAM shares are revoked when account leaves. New feature (Feb 2026) allows retention.
# Check shares OWNED by the migrating account (run from that account)
aws ram get-resource-shares --resource-owner SELF --region <REGION>
# Check shares consumed by the migrating account
aws ram get-resource-shares --resource-owner OTHER-ACCOUNTS --region <REGION>
# List actual resources in shares
aws ram list-resources --resource-owner OTHER-ACCOUNTS --region <REGION>
aws ram list-resources --resource-owner SELF --region <REGION>
Mitigation (Feb 2026 feature): Enable retention on AWS RAM shares before transfer:
# Run from the share OWNER account
aws ram update-resource-share \
--resource-share-arn <SHARE_ARN> \
--retain-sharing-on-account-leave-organization \
--region <REGION>
Enforce organization-wide via SCP:
{
"Effect": "Deny",
"Action": ["ram:CreateResourceShare", "ram:UpdateResourceShare"],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"ram:RetainSharingOnAccountLeaveOrganization": "false"
}
}
}
3.4 Organization Policies (Authorization, Declarative, and Management Policies)
Risk: ALL organization policies stop applying when the account transfers. This includes authorization policies (SCPs, RCPs), declarative policies (EC2), and management policies.
Run these commands from the management account or a delegated administrator account for AWS Organizations.
Important: Policy Explorer in Account Assessment only scans SCP content. It does NOT cover RCPs, declarative policies, or management policies. These must be checked manually.
Tip: CFAT provides a useful initial snapshot — it confirms whether SCPs, RCPs, Tag Policies, and Backup Policies are enabled at the organization level. Use this as a starting point to know which policy types require deeper investigation with the CLI commands below.
# First: discover all policy types enabled in the organization
aws organizations list-roots --query "Roots[0].PolicyTypes"
# --- AUTHORIZATION POLICIES ---
# SCPs applied to the account (also covered by Policy Explorer for content)
aws organizations list-policies-for-target \
--target-id <ACCOUNT_ID> \
--filter SERVICE_CONTROL_POLICY
# RCPs applied to the account (NOT covered by Policy Explorer)
aws organizations list-policies-for-target \
--target-id <ACCOUNT_ID> \
--filter RESOURCE_CONTROL_POLICY
# --- DECLARATIVE POLICIES ---
# Declarative Policies (EC2 - e.g., Allowed AMIs, block public snapshots)
aws organizations list-policies-for-target \
--target-id <ACCOUNT_ID> \
--filter DECLARATIVE_POLICY_EC2
# --- MANAGEMENT POLICIES ---
# Check each management policy type that's enabled:
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter TAG_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter BACKUP_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter AISERVICES_OPT_OUT_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter BEDROCK_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter CHATBOT_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter INSPECTOR_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter NETWORK_SECURITY_DIRECTOR_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter S3_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter SECURITYHUB_POLICY
aws organizations list-policies-for-target --target-id <ACCOUNT_ID> --filter UPGRADE_ROLLOUT_POLICY
# Get the account's parent OU (policies may be inherited)
aws organizations list-parents --child-id <ACCOUNT_ID>
# List policies at the OU level (repeat for each policy type)
aws organizations list-policies-for-target \
--target-id <OU_ID> \
--filter <POLICY_TYPE>
# Get policy content to replicate in target organization
aws organizations describe-policy --policy-id <POLICY_ID>
# Get effective management policies
aws organizations describe-effective-policy \
--policy-type TAG_POLICY \
--target-id <ACCOUNT_ID>
aws organizations describe-effective-policy \
--policy-type BACKUP_POLICY \
--target-id <ACCOUNT_ID>
aws organizations describe-effective-policy \
--policy-type AISERVICES_OPT_OUT_POLICY \
--target-id <ACCOUNT_ID>
Key distinction:
- Authorization Policies (SCPs, RCPs) — SCPs restrict what API actions principals can perform. RCPs restrict what actions can be performed ON resources (e.g., block unencrypted access to Secrets Manager). Policy Explorer scans SCPs only, not RCPs.
- Declarative Policies (EC2) — Enforce desired-state configurations for EC2 (e.g., only allowed AMIs, block public snapshots). NOT scanned by either tool.
- Management Policies — Tag, Backup, AI opt-out, Bedrock, ChatBot, Inspector, SecurityHub, S3, Network Security Director, Upgrade Rollout. Detached on transfer. NOT scanned by either tool.
Action: For each policy type enabled in your organization:
- List policies applied to the account (direct + inherited from OU/root)
- Get policy content with
describe-policy - Replicate in target organization BEFORE transfer
- For declarative policies: verify the account's resources comply with target organization policies too
3.5 Delegated administrator services
Risk: Must deregister before migration. Some services DELETE data on deregistration (Detective, Firewall Manager).
Run these commands from the management account.
# List all delegated admin accounts
aws organizations list-delegated-administrators
# List services for the migrating account
aws organizations list-delegated-services-for-account \
--account-id <ACCOUNT_ID>