AWS Control Tower Account Factory for Terraform(AFT) 따라하기

1. Hands On의 목적 및 기대 결과

Control Tower의 기능 중 하나인, Account Factory로 계정 관리를 유연하게 할 수 있다는 것을 이전 시간에 알아보았습니다. 여기에 IaC 도구 중 하나인 Terraform을 AWS Control Tower와 함께 사용하여 새로운 AWS 계정을 생성 및 관리할 수 있으며, Terraform을 사용하여 새로 생성된 AWS 계정을 Customization 가능합니다.

AFT(Account Factory for Terraform)는 Control Tower에서 계정을 프로비저닝하고 Customization을 위해 Terraform 파이프라인을 설정합니다. AFT는 GitOps 모델을 따라 AWS Control Tower에서 계정 프로비저닝 프로세스를 자동화하며 account-request를 생성 후 Git에 Commit하면 계정 프로비저닝을 위한 AFT 워크플로우를 트리거하는 데 필요한 Input이 제공됩니다.

지금까지 설명한 워크플로우는 다음 그림으로 설명 가능합니다.

2. 사전 요구사항

  • AWS 계정
  • 루트 이메일 및 OU
  • awscli

AWS 계정과 루트 이메일로 AFT 관리 계정을 생성해야 합니다.

AFT Management Account 생성

  1. Administrator 권한이 있는 AWS SSO 역할을 사용하여 Management 계정에 로그인
  2. AWS Control Tower 콘솔
  3. 새 OU 생성 – AFT-Management OU 생성

AFT 배포를 위한 Terraform 및 codecommit 환경 준비

또한 이번 Hands On에서는 로컬 개발 환경에서 작업을 할 예정이기에, 다음을 설치해야 합니다.

  • Terraform Cloud 및 Terraform v1.9.4
# MacOS ARM64 기반
# 기타 OS의 경우 다음을 참고
# https://developer.hashicorp.com/terraform/install

wget https://releases.hashicorp.com/terraform/1.9.4/terraform_1.9.4_darwin_arm64.zip
mv ~/Downloads/terraform /usr/local/bin
  • pip – git-remote-codecommit
virtualenv env 
source env/bin/activate 

pip install git-remote-codecommit

3. Terraform 프로젝트 설정

아래 예제로 main.tf 을 채우고, 변수로 설정된 부분을 각 환경에 맞게 설정하도록 합니다.

변경된 부분을 생성된 AFT Management Account에서 배포를 합니다.

main.tf

provider "aws" {
  region = "ap-northeast-2"
}

module "aft_pipeline" {
  source  = "aws-ia/control_tower_account_factory/aws"
  version = "1.13.1"

  # Required Variables
  ct_management_account_id    = var.ct_management_account_id
  log_archive_account_id      = var.log_archive_account_id
  audit_account_id            = var.audit_account_id
  aft_management_account_id   = var.aft_management_account_id
  ct_home_region              = var.ct_home_region
  tf_backend_secondary_region = var.tf_backend_secondary_region

  # Terraform variables
  terraform_version      = var.terraform_version
  terraform_distribution = var.terraform_distribution
  terraform_org_name     = var.terraform_org_name
  terraform_token        = var.terraform_token

  # AFT Feature flags
  aft_feature_cloudtrail_data_events      = false
  aft_feature_enterprise_support          = false
  aft_feature_delete_default_vpcs_enabled = true
  aft_enable_vpc                          = true

  # codecommit default branch
  account_request_repo_branch                     = var.account_request_repo_branch
  global_customizations_repo_branch               = var.global_customizations_repo_branch
  account_customizations_repo_branch              = var.account_customizations_repo_branch
  account_provisioning_customizations_repo_branch = var.account_provisioning_customizations_repo_branch

  # cloudwatch_log_group_retention
  cloudwatch_log_group_retention = var.cloudwatch_log_group_retention
}

AFT는 AFT Management 계정에서 Account Provisioning 요청을 처리합니다. 이를 위해 AFT는 AWS Service Catalog의 AWS Control Tower Account Factory 포트폴리오에 대한 교차 계정 액세스가 필요합니다. AFT가 AWS Control Tower 관리 계정에서 포트폴리오에 액세스할 수 있도록 하려면 AWSAFTExecution IAM 역할에 공유합니다.

# AWSAFTExecution IAM Role, 포트폴리오 공유
brew install jq -y
export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
export AWS_REGION=Your Home Region
export ACCOUNT_FACTORY_PORTFOLIO=`aws servicecatalog list-portfolios --region $AWS_REGION | jq -r '.PortfolioDetails[] | select (.DisplayName | contains("AWS Control Tower Account Factory Portfolio")) | .Id'`
AWSAFTEXECUTION_ROLE="arn:aws:iam::${ACCOUNT_ID}:role/AWSAFTExecution"
aws servicecatalog associate-principal-with-portfolio --portfolio-id $ACCOUNT_FACTORY_PORTFOLIO --principal-arn $AWSAFTEXECUTION_ROLE --principal-type IAM --region $AWS_REGION

# 검증
aws servicecatalog list-principals-for-portfolio --portfolio-id $ACCOUNT_FACTORY_PORTFOLIO --region $AWS_REGION | jq -r '.Principals[] | .PrincipalARN' | grep AWSAFTExecution -q && echo "Portfolio shared to AWSAFTExecution" || echo "Portfolio not shared properly"

이제 AFT를 AFT Management Account에 배포를 완료했습니다.

4. AFT 코드 배포

이제, AFT를 완벽히 사용하기 위해 다음 네 개의 별도 저장소를 관리하고 채워야 합니다.

  1. Account customizations
  2. Global customizations
  3. AFT account provisioning customizations
  4. Account requests

위 네 개의 저장소는 3. Terraform 프로젝트 설정 부분에 별도 지정한 CodeCommit 레포지토리에 있습니다. 예제를 위해 다음을 clone하여 사용할 수 있도록 합니다.

https://github.com/aws-samples/aft-workshop-sample

  • 해당 GitHub 내 switch branch로 샘플을 확인할 수 있습니다.
  • 별도로 해당 부분에 대한 배포 방법은 기술하지 않습니다.

1. Account Customizations

Account Customizations는 개별 AWS 계정마다 특정 설정을 customize하는 기능입니다. AFT를 통해 프로비저닝된 각 AWS 계정에 특정 리소스, 정책 또는 구성을 적용하고자 할 때 사용됩니다.

예를 들어, 특정 계정에만 특정 IAM 역할을 생성하거나 S3 버킷을 생성하고자 할 때 사용됩니다.

2. Global Customizations

Global Customizations는 모든 AWS 계정에 공통적으로 적용해야 하는 설정을 customize하는 기능입니다. 이 기능을 사용하면, 조직 내 모든 계정에 동일한 정책, 역할 또는 리소스를 배포할 수 있습니다.

예를 들어, 모든 계정에 공통적으로 CloudTrail 설정을 적용하거나, 공통적인 가드레일을 설정하고자 할 때 사용됩니다.

3. AFT Account Provisioning Customizations

AFT Account Provisioning Customizations는 새로운 계정을 생성할 때 적용되는 customization을 관리하는 기능입니다.

예를 들어, 새로운 계정을 만들 때, 해당 계정이 초기화되는 과정에서 실행될 특정 스크립트나 템플릿을 정의할 수 있습니다. 이를 통해 계정이 생성될 때 특정 태그를 자동으로 추가하거나, 기본적인 리소스나 설정을 자동으로 구성하는 것이 가능합니다.

4. Account Requests

Account Requests는 새로운 AWS 계정을 생성하기 위한 요청을 관리하는 기능입니다. AFT에서 새로운 계정을 만들고자 할 때, 이 요청을 통해 계정 생성 프로세스를 트리거할 수 있습니다.

Account Requests에는 계정의 이름, 이메일, 환경(dev, prod), OU 등 여러 메타데이터가 포함될 수 있으며, 이러한 요청은 계정 생성 시의 customization과 함께 사용됩니다.

5. 계정 생성

5.1. Account requests

AFT를 통해 계정 생성을 해보겠습니다.

계정을 생성할 때 필요한 파라미터들을 환경에 맞게 수정하여 모듈을 사용할 수 있습니다.

module "account_request" {
  source = "./modules/aft-account-request"

  control_tower_parameters = {
    AccountEmail              = "jsjeon@nongshim.co.kr"
    AccountName               = "jsjeon"
    ManagedOrganizationalUnit = "Sandbox (ou-xxxx-xxxxxxxx)"
    SSOUserEmail              = "jsjeon@nongshim.co.kr"
    SSOUserFirstName          = "Joongseok"
    SSOUserLastName           = "Jeon"
  }

  account_tags = {
    "ABC:Owner"       = "jsjeon@nongshim.co.kr"
    "ABC:Division"    = "CLOUD"
    "ABC:Environment" = "Dev"
    "ABC:CostCenter"  = "123456"
    "ABC:Vended"      = "true"
    "ABC:DivCode"     = "102"
    "ABC:BUCode"      = "ABC003"
    "ABC:Project"     = "123456"
  }

  change_management_parameters = {
    change_requested_by = "AWS Control Tower Lab"
    change_reason       = "Learn AWS Control Tower Account Factory for Terraform (AFT)"
  }

  account_customizations_name = "Sandbox"
}

5.2. Account requests 워크플로우

계정 생성 시의 예상 동작

  1. Account requests 제출새로운 계정을 생성하기 위해 계정 요청이 제출됩니다.
  2. Account factory 검증요청이 유효한지, 필요한 정보가 포함되어 있는지 확인합니다. 검증 결과가 유효하다면, 계정 요청이 승인되고 실제 계정 생성 프로세스가 시작됩니다.
  3. AFT account provisioning customizations 적용계정이 생성되는 과정에서 AFT가 정의한 provisioning customizations이 적용됩니다.이 단계에서는 계정이 처음 생성될 때 필요한 초기 설정, 리소스 구성, 태그 등이 적용됩니다.
  4. Global customizations 적용모든 계정에 공통적으로 적용되는 설정이 이 단계에서 실행됩니다.
  5. Account customizations 적용해당 계정에 맞춤화된 설정이 적용됩니다.
  6. 계정 생성 완료 및 검증모든 customizations이 적용되고 나면, 계정 생성이 완료되며 원하는 작업을 수행할 수 있습니다.

6. 마무리

AFT를 통해 추가적으로 구현할 수 있는 것은 다음과 같습니다. 개발자/관리자의 요구사항에 따라 유연하게 적용 가능하며 추가적인 설정 또한 가능합니다.

  1. 자동화된 보안 설정: 모든 신규 계정에 대해 보안 그룹, IAM 정책, CloudTrail 설정 등을 자동으로 적용하여 보안 수준을 높일 수 있습니다.
  2. 비용 관리 태그: 모든 계정에 공통적으로 비용 관리 태그를 적용하여 비용 추적 및 할당을 효율적으로 관리할 수 있습니다.
  3. 모니터링 및 로깅: 모든 계정에 대해 공통적인 모니터링 및 로깅 설정을 적용하여 운영 효율성을 높일 수 있습니다.
  4. 정책 및 규정 준수: 조직의 정책 및 규정 준수 요구 사항에 맞추어 모든 계정에 공통적으로 적용할 수 있는 정책을 관리할 수 있습니다.
  5. 리소스 프로비저닝: 특정 유형의 리소스를 자동으로 프로비저닝하여 사용자가 계정을 생성할 때 필요한 초기 설정을 간소화할 수 있습니다.

지금까지 간단하게 AFT를 통한 계정 생성 워크플로우에 대해 알아봤습니다. 초기 구축에는 다소 시간이 걸릴 수 있지만, 이를 통해 AWS 계정 관리의 효율성을 크게 향상시킬 수 있습니다. 앞으로 이 방법을 활용하여 보다 체계적이고 자동화된 방식으로 AWS 계정을 관리할 수 있기를 바랍니다.

NDS는 Control Tower 구축 경험이 있는 AWS 파트너사로, 성공적으로 프로젝트를 완수한 바 있습니다. Best practices를 기반으로 AWS의 여정을 NDS가 함께 하겠습니다.

관련하여 문의 사항이나 기술 지원이 필요하신 경우 NDS Sales팀으로 연락주시길 바랍니다.