AFT Modules Deployment Checklist

NOTE: https://github.com/aws-ia/terraform-aws-control_tower_account_factory.git

Step 1: Deploy Packaging Module

  • Module: packaging

  • Source: ./modules/aft-archives

  • Purpose: Package Lambda archives and artifacts.

  • Command:

      terraform apply -target=module.packaging
    
  • Outcome: Artifact files (Lambda zips) uploaded and ready.


Step 2: Deploy Account Request Framework

  • Module: aft_account_request_framework

  • Source: ./modules/aft-account-request-framework

  • Purpose: Manage account request lifecycle (DynamoDB, queues, SNS, VPC).

  • Dependencies: Needs packaging artifacts from Step 1.

  • Command:

      terraform apply -target=module.aft_account_request_framework
    
  • Outcome: Core request infrastructure deployed.


Step 3: Deploy Lambda Layer Module

  • Module: aft_lambda_layer

  • Source: ./modules/aft-lambda-layer

  • Purpose: Create shared Lambda layer.

  • Dependencies: Uses keys, VPC, archives from Steps 1 and 2.

  • Command:

      terraform apply -target=module.aft_lambda_layer
    
  • Outcome: Shared Lambda layer ready for provisioning Lambdas.


Step 4: Deploy Account Provisioning Framework

  • Module: aft_account_provisioning_framework

  • Source: ./modules/aft-account-provisioning-framework

  • Purpose: Step Functions and Lambdas that provision accounts.

  • Dependencies: Needs SNS, KMS, Lambda layer, archives.

  • Command:

      terraform apply -target=module.aft_account_provisioning_framework
    
  • Outcome: Account provisioning automation deployed.


Step 5: Deploy Backend Infrastructure

  • Module: aft_backend

  • Source: ./modules/aft-backend

  • Purpose: S3 buckets and DynamoDB tables for state and config.

  • Dependencies: Independent but needed early.

  • Command:

      terraform apply -target=module.aft_backend
    
  • Outcome: Persistent backend storage ready.


Step 6: Deploy Code Repositories

  • Module: aft_code_repositories

  • Source: ./modules/aft-code-repositories

  • Purpose: Create/configure repos for provisioning/customization code.

  • Dependencies: Needs VPC info and backend from Steps 2 and 5.

  • Command:

      terraform apply -target=module.aft_code_repositories
    
  • Outcome: Code repos provisioned.


Step 7: Deploy Customizations

  • Module: aft_customizations

  • Source: ./modules/aft-customizations

  • Purpose: Pipelines and orchestration for account customizations.

  • Dependencies: Needs backend, provisioning framework, repos.

  • Command:

      terraform apply -target=module.aft_customizations
    
  • Outcome: Customization pipelines set.


Step 8: Deploy Feature Options

  • Module: aft_feature_options

  • Source: ./modules/aft-feature-options

  • Purpose: Optional features (CloudTrail, support, default VPC deletion).

  • Dependencies: After provisioning framework and customizations.

  • Command:

      terraform apply -target=module.aft_feature_options
    
  • Outcome: Optional features enabled.


Step 9: Deploy IAM Roles

  • Module: aft_iam_roles

  • Source: ./modules/aft-iam-roles

  • Purpose: IAM roles for cross-account access.

  • Dependencies: Needs foundational accounts ready.

  • Command:

      terraform apply -target=module.aft_iam_roles
    
  • Outcome: IAM roles deployed.


Step 10: Deploy SSM Parameters

  • Module: aft_ssm_parameters

  • Source: ./modules/aft-ssm-parameters

  • Purpose: Store configs in SSM Parameter Store.

  • Dependencies: Needs outputs from nearly all other modules.

  • Command:

      terraform apply -target=module.aft_ssm_parameters
    
  • Outcome: Configuration parameters stored centrally.


Optional: Full deployment

Once you have tested the modules individually in order, you can deploy all with:

terraform apply

Make sure your terraform.tfvars and backend config are correctly set up.


If you want, I can help prepare a sample Terraform workflow or scripts to automate these steps! Would you like that?

You said:

yes, please

ChatGPT said:

Awesome! Hereโ€™s a simple Bash script you can run in your AFT Terraform root folder to deploy the modules in the correct order automatically.


#!/bin/bash

set -e  # Exit on any error

echo "Starting AFT modules deployment..."

declare -a modules=(
  "module.packaging"
  "module.aft_account_request_framework"
  "module.aft_lambda_layer"
  "module.aft_account_provisioning_framework"
  "module.aft_backend"
  "module.aft_code_repositories"
  "module.aft_customizations"
  "module.aft_feature_options"
  "module.aft_iam_roles"
  "module.aft_ssm_parameters"
)

for mod in "${modules[@]}"
do
  echo "Deploying $mod ..."
  terraform apply -auto-approve -target=$mod
  echo "$mod deployed successfully."
done

echo "All AFT modules deployed!"

How to use:

  1. Save this script as deploy_aft_modules.sh in your Terraform root directory.

  2. Make it executable:

bashCopyEditchmod +x deploy_aft_modules.sh
  1. Run the script:
bashCopyEdit./deploy_aft_modules.sh

Notes:

  • The script uses -auto-approve to avoid manual confirmation at each step.

  • It deploys modules one by one in the exact order required by dependencies.

  • If any step fails, the script will exit immediately (set -e).

  • Make sure your Terraform backend is configured and terraform init has been run before this.

  • Adjust module names if your Terraform module blocks use different names.

0
Subscribe to my newsletter

Read articles from Chinnayya Chintha directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Chinnayya Chintha
Chinnayya Chintha

I am ๐—–๐—ต๐—ถ๐—ป๐—ป๐—ฎ๐˜†๐˜†๐—ฎ ๐—–๐—ต๐—ถ๐—ป๐˜๐—ต๐—ฎ, ๐—ฎ ๐—ฟ๐—ฒ๐˜€๐˜‚๐—น๐˜๐˜€-๐—ฑ๐—ฟ๐—ถ๐˜ƒ๐—ฒ๐—ป ๐—ฆ๐—ถ๐˜๐—ฒ ๐—ฅ๐—ฒ๐—น๐—ถ๐—ฎ๐—ฏ๐—ถ๐—น๐—ถ๐˜๐˜† ๐—˜๐—ป๐—ด๐—ถ๐—ป๐—ฒ๐—ฒ๐—ฟ (๐—ฆ๐—ฅ๐—˜) with proven expertise in ๐—ฎ๐˜‚๐˜๐—ผ๐—บ๐—ฎ๐˜๐—ถ๐—ป๐—ด, ๐—ฎ๐—ป๐—ฑ ๐—บ๐—ฎ๐—ป๐—ฎ๐—ด๐—ถ๐—ป๐—ด ๐˜€๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ, ๐˜€๐—ฐ๐—ฎ๐—น๐—ฎ๐—ฏ๐—น๐—ฒ, ๐—ฎ๐—ป๐—ฑ ๐—ฟ๐—ฒ๐—น๐—ถ๐—ฎ๐—ฏ๐—น๐—ฒ ๐—ถ๐—ป๐—ณ๐—ฟ๐—ฎ๐˜€๐˜๐—ฟ๐˜‚๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ ๐˜€๐—ผ๐—น๐˜‚๐˜๐—ถ๐—ผ๐—ป๐˜€. My experience spans ๐—ฐ๐—น๐—ผ๐˜‚๐—ฑ-๐—ป๐—ฎ๐˜๐—ถ๐˜ƒ๐—ฒ ๐˜๐—ฒ๐—ฐ๐—ต๐—ป๐—ผ๐—น๐—ผ๐—ด๐—ถ๐—ฒ๐˜€, ๐—–๐—œ/๐—–๐—— ๐—ฎ๐˜‚๐˜๐—ผ๐—บ๐—ฎ๐˜๐—ถ๐—ผ๐—ป, ๐—ฎ๐—ป๐—ฑ ๐—œ๐—ป๐—ณ๐—ฟ๐—ฎ๐˜€๐˜๐—ฟ๐˜‚๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ ๐—ฎ๐˜€ ๐—–๐—ผ๐—ฑ๐—ฒ (๐—œ๐—ฎ๐—–), enabling me to deliver ๐—ต๐—ถ๐—ด๐—ต-๐—ฝ๐—ฒ๐—ฟ๐—ณ๐—ผ๐—ฟ๐—บ๐—ถ๐—ป๐—ด ๐˜€๐˜†๐˜€๐˜๐—ฒ๐—บ๐˜€ that enhance operational efficiency and drive innovation. As a ๐—™๐—ฟ๐—ฒ๐—ฒ๐—น๐—ฎ๐—ป๐—ฐ๐—ฒ ๐—ฆ๐—ถ๐˜๐—ฒ ๐—ฅ๐—ฒ๐—น๐—ถ๐—ฎ๐—ฏ๐—ถ๐—น๐—ถ๐˜๐˜† ๐—˜๐—ป๐—ด๐—ถ๐—ป๐—ฒ๐—ฒ๐—ฟ, I specialize in: โœ…๐—œ๐—บ๐—ฝ๐—น๐—ฒ๐—บ๐—ฒ๐—ป๐˜๐—ถ๐—ป๐—ด ๐˜€๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ฒ ๐—ฎ๐—ป๐—ฑ ๐˜€๐—ฐ๐—ฎ๐—น๐—ฎ๐—ฏ๐—น๐—ฒ ๐—ฝ๐—ฎ๐˜†๐—บ๐—ฒ๐—ป๐˜ ๐—ด๐—ฎ๐˜๐—ฒ๐˜„๐—ฎ๐˜† ๐˜€๐—ผ๐—น๐˜‚๐˜๐—ถ๐—ผ๐—ป๐˜€ ๐˜‚๐˜€๐—ถ๐—ป๐—ด ๐—”๐—ช๐—ฆ ๐˜€๐—ฒ๐—ฟ๐˜ƒ๐—ถ๐—ฐ๐—ฒ๐˜€ ๐—น๐—ถ๐—ธ๐—ฒ ๐—”๐—ฃ๐—œ ๐—š๐—ฎ๐˜๐—ฒ๐˜„๐—ฎ๐˜†, ๐—Ÿ๐—ฎ๐—บ๐—ฏ๐—ฑ๐—ฎ, ๐—ฎ๐—ป๐—ฑ ๐——๐˜†๐—ป๐—ฎ๐—บ๐—ผ๐——๐—•.. โœ…๐—”๐˜‚๐˜๐—ผ๐—บ๐—ฎ๐˜๐—ถ๐—ป๐—ด ๐—ถ๐—ป๐—ณ๐—ฟ๐—ฎ๐˜€๐˜๐—ฟ๐˜‚๐—ฐ๐˜๐˜‚๐—ฟ๐—ฒ ๐—ฝ๐—ฟ๐—ผ๐˜ƒ๐—ถ๐˜€๐—ถ๐—ผ๐—ป๐—ถ๐—ป๐—ด with ๐—ง๐—ฒ๐—ฟ๐—ฟ๐—ฎ๐—ณ๐—ผ๐—ฟ๐—บ. โœ…๐—ข๐—ฝ๐˜๐—ถ๐—บ๐—ถ๐˜‡๐—ถ๐—ป๐—ด ๐—บ๐—ผ๐—ป๐—ถ๐˜๐—ผ๐—ฟ๐—ถ๐—ป๐—ด using ๐—–๐—น๐—ผ๐˜‚๐—ฑ๐—ช๐—ฎ๐˜๐—ฐ๐—ต. โœ…Ensuring compliance with ๐—ฃ๐—–๐—œ-๐——๐—ฆ๐—ฆ ๐˜€๐˜๐—ฎ๐—ป๐—ฑ๐—ฎ๐—ฟ๐—ฑ๐˜€ through ๐—ฒ๐—ป๐—ฐ๐—ฟ๐˜†๐—ฝ๐˜๐—ถ๐—ผ๐—ป ๐—บ๐—ฒ๐—ฐ๐—ต๐—ฎ๐—ป๐—ถ๐˜€๐—บ๐˜€ โœ…implemented with ๐—”๐—ช๐—ฆ ๐—ž๐— ๐—ฆ and ๐—ฆ๐—ฒ๐—ฐ๐—ฟ๐—ฒ๐˜๐˜€ ๐— ๐—ฎ๐—ป๐—ฎ๐—ด๐—ฒ๐—ฟ. These efforts have resulted in ๐—ฒ๐—ป๐—ต๐—ฎ๐—ป๐—ฐ๐—ฒ๐—ฑ ๐˜๐—ฟ๐—ฎ๐—ป๐˜€๐—ฎ๐—ฐ๐˜๐—ถ๐—ผ๐—ป ๐—ฟ๐—ฒ๐—น๐—ถ๐—ฎ๐—ฏ๐—ถ๐—น๐—ถ๐˜๐˜† and ๐˜€๐˜๐—ฟ๐—ฒ๐—ฎ๐—บ๐—น๐—ถ๐—ป๐—ฒ๐—ฑ ๐—ผ๐—ฝ๐—ฒ๐—ฟ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฎ๐—น ๐˜„๐—ผ๐—ฟ๐—ธ๐—ณ๐—น๐—ผ๐˜„๐˜€ for payment processing systems. I am passionate about ๐—บ๐—ฒ๐—ป๐˜๐—ผ๐—ฟ๐—ถ๐—ป๐—ด ๐—ฎ๐—ป๐—ฑ ๐—ธ๐—ป๐—ผ๐˜„๐—น๐—ฒ๐—ฑ๐—ด๐—ฒ ๐˜€๐—ต๐—ฎ๐—ฟ๐—ถ๐—ป๐—ด, having delivered ๐—ต๐—ฎ๐—ป๐—ฑ๐˜€-๐—ผ๐—ป ๐˜๐—ฟ๐—ฎ๐—ถ๐—ป๐—ถ๐—ป๐—ด in ๐—ฐ๐—น๐—ผ๐˜‚๐—ฑ ๐˜๐—ฒ๐—ฐ๐—ต๐—ป๐—ผ๐—น๐—ผ๐—ด๐—ถ๐—ฒ๐˜€, ๐—ž๐˜‚๐—ฏ๐—ฒ๐—ฟ๐—ป๐—ฒ๐˜๐—ฒ๐˜€, ๐—ฎ๐—ป๐—ฑ ๐—ฎ๐˜‚๐˜๐—ผ๐—บ๐—ฎ๐˜๐—ถ๐—ผ๐—ป. My proactive approach helps me anticipate system challenges and create ๐—ฟ๐—ผ๐—ฏ๐˜‚๐˜€๐˜, ๐˜€๐—ฐ๐—ฎ๐—น๐—ฎ๐—ฏ๐—น๐—ฒ ๐˜€๐—ผ๐—น๐˜‚๐˜๐—ถ๐—ผ๐—ป๐˜€ ๐˜๐—ต๐—ฎ๐˜ ๐—ฒ๐—ป๐—ต๐—ฎ๐—ป๐—ฐ๐—ฒ ๐˜€๐—ฒ๐—ฐ๐˜‚๐—ฟ๐—ถ๐˜๐˜†, ๐—ฐ๐—ผ๐—บ๐—ฝ๐—น๐—ถ๐—ฎ๐—ป๐—ฐ๐—ฒ, ๐—ฎ๐—ป๐—ฑ ๐—ผ๐—ฝ๐—ฒ๐—ฟ๐—ฎ๐˜๐—ถ๐—ผ๐—ป๐—ฎ๐—น ๐—ฒ๐—ณ๐—ณ๐—ถ๐—ฐ๐—ถ๐—ฒ๐—ป๐—ฐ๐˜†. Dedicated to ๐—ฐ๐—ผ๐—ป๐˜๐—ถ๐—ป๐˜‚๐—ผ๐˜‚๐˜€ ๐—น๐—ฒ๐—ฎ๐—ฟ๐—ป๐—ถ๐—ป๐—ด, I stay updated with ๐—ฒ๐—บ๐—ฒ๐—ฟ๐—ด๐—ถ๐—ป๐—ด ๐˜๐—ฒ๐—ฐ๐—ต๐—ป๐—ผ๐—น๐—ผ๐—ด๐—ถ๐—ฒ๐˜€ and thrive on contributing to ๐˜๐—ฟ๐—ฎ๐—ป๐˜€๐—ณ๐—ผ๐—ฟ๐—บ๐—ฎ๐˜๐—ถ๐˜ƒ๐—ฒ ๐—ฝ๐—ฟ๐—ผ๐—ท๐—ฒ๐—ฐ๐˜๐˜€ that push boundaries in technology.