Account Factory에 대한 테라폼(AFT) 코드를 로컬에서 검증 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Account Factory에 대한 테라폼(AFT) 코드를 로컬에서 검증

작성자: Alexandru Pop(AWS), Michal Gorniak(AWS)

환경: 프로덕션

기술: 인프라; 현대화; DevOps DevelopmentAndTesting

워크로드: 오픈 소스

AWS 서비스: AWS Control Tower

요약

이 패턴은 AWS Control Tower Account Factory for HashiCorp Terraform (AFT) 에서 관리하는 Terraform 코드를 로컬에서 테스트하는 방법을 보여줍니다. Terraform은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 오픈 소스 코드형 인프라(IaC) 도구입니다. AFT는 AWS Control Tower에서 여러 AWS 계정을 프로비저닝하고 사용자 지정하는 데 도움이 되는 Terraform 파이프라인을 설정합니다.

코드 개발 중에는 AFT 파이프라인 외부에서 로컬에서 코드형 인프라(IaC)를 테스트하는 것이 유용할 수 있습니다. 이 패턴은 다음 작업을 수행하는 방법을 보여줍니다.

  • AFT 관리 계정의 AWS CodeCommit 리포지토리에 저장된 Terraform 코드의 로컬 사본을 검색하십시오.

  • 검색된 코드를 사용하여 AFT 파이프라인을 로컬에서 시뮬레이션합니다.

이 프로시저를 사용하여 일반 AFT 파이프라인에 속하지 않는 Terraform 명령을 실행할 수도 있습니다. 예를 들어 이 메서드를 사용하여, terraform validate, terraform plan terraform destroy, terraform import 같은 명령을 실행할 수 있습니다.

사전 조건 및 제한 사항

사전 조건 

제한 사항

  • 이 패턴은 AWS Control Tower, AFT 또는 특정 Terraform 모듈에 필요한 배포 단계를 다루지 않습니다.

  • 이 절차 중에 로컬에서 생성된 출력은 AFT 파이프라인 런타임 로그에 저장되지 않습니다.

아키텍처

대상 기술 스택  

  • AWS Control Tower 배포 내에 배포된 AFT 인프라

  • Terraform

  • Git

  • CLI 버전 2

자동화 및 규모 조정

이 패턴은 단일 AFT 관리 AWS 계정에서 AFT 글로벌 계정 사용자 지정을 위한 Terraform 코드를 로컬로 호출하는 방법을 보여줍니다. Terraform 코드의 유효성이 검사되면 다중 계정 환경의 나머지 계정에 적용할 수 있습니다. 자세한 내용은 AWS Control Tower 설명서의 사용자 지정 재호출을 참조하세요.

유사한 프로세스를 사용하여 로컬 터미널에서 AFT 계정 사용자 지정을 실행할 수도 있습니다. AFT 계정 사용자 지정에서 Terraform 코드를 로컬로 호출하려면 AFT 관리 계정에서 aft-account-customizations CodeCommit 리포지토리 대신 aft-global-account-customizations리포지토리를 복제하십시오.

도구

서비스

  • AWS Control Tower는 권장 모범 사례에 따라 AWS 다중 계정 환경을 설정하고 관리할 수 있도록 지원합니다.

  • AWS Command Line Interface(AWS CLI)는 명령줄 쉘에서 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다.

기타 서비스

  • HashiCorp Terraform은 코드를 사용하여 클라우드 인프라 및 리소스를 프로비저닝하고 관리하는 데 도움이 되는 오픈 소스 IaC (코드형 인프라) 도구입니다.

  • Git은 오픈 소스 분산 버전 제어 시스템입니다.

code

다음 사항은 AFT에서 관리하는 Terraform 코드를 로컬에서 실행하는 데 사용할 수 있는 예제 bash 스크립트입니다. 스크립트를 사용하려면 이 패턴의 에픽 섹션에 있는 지침을 따르세요.

#! /bin/bash # Version: 1.1 2022-06-24 Unsetting AWS_PROFILE since, when set, it interferes with script operation #          1.0 2022-02-02 Initial Version # # Purpose: For use with AFT: This script runs the local copy of TF code as if it were running within AFT pipeline. #        * Facilitates testing of what the AFT pipline will do #           * Provides the ability to run terraform with custom arguments (like 'plan' or 'move') which are currently not supported within the pipeline. # # © 2021 Amazon Web Services, Inc. or its affiliates. All Rights Reserved. # This AWS Content is provided subject to the terms of the AWS Customer Agreement # available at http://aws.amazon.com/agreement or other written agreement between # Customer and either Amazon Web Services, Inc. or Amazon Web Services EMEA SARL or both. # # Note: Arguments to this script are passed directly to 'terraform' without parsing nor validation by this script. # # Prerequisites: #    1. local copy of ct GIT repositories #    2. local backend.tf and aft-providers.tf filled with data for the target account on which terraform is to be run #       Hint: The contents of above files can be obtain from the logs of a previous execution of the AFT pipeline for the target account. #    3. 'terraform' binary is available in local PATH #    4. Recommended: .gitignore file containing 'backend.tf', 'aft_providers.tf' so the local copy of these files are not pushed back to git readonly credentials=$(aws sts assume-role \     --role-arn arn:aws:iam::$(aws sts get-caller-identity --query "Account" --output text ):role/AWSAFTAdmin \     --role-session-name AWSAFT-Session \     --query Credentials ) unset AWS_PROFILE export AWS_ACCESS_KEY_ID=$(echo $credentials | jq -r '.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $credentials | jq -r '.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $credentials | jq -r '.SessionToken') terraform "$@"

에픽

작업설명필요한 기술

예제 코드를 로컬 파일로 저장합니다.

  1. 이 패턴의 코드 섹션에 있는 예제 bash 스크립트를 복사하여 코드 편집기에 붙여넣습니다.

  2. 파일 이름을 ct_terraform.sh로 지정합니다. 그런 다음 파일을 전용 폴더(예: ~/scripts 또는~/bin)에 로컬로 저장합니다.

AWS 관리자

예제 코드를 실행 가능하게 만드세요.

터미널 창을 열고 다음 중 하나를 수행하여 AWS AFT 관리 계정을 인증합니다.

  • AFT 관리 계정에 액세스하는 데 필요한 권한으로 구성된 기존 AWS CLI 프로파일을 사용합니다. 프로파일을 사용하려면 다음 명령을 실행하시면 됩니다.

export AWS_PROFILE=<aft account profile name>
  • 조직에서 SSO를 사용하여 AWS에 액세스하려는 경우 조직의 SSO 페이지에서 AFT 관리 계정의 보안 인증 정보를 입력하세요.

참고: 조직에 AWS 환경에 인증 보안 인증 정보를 제공하는 사용자 지정 도구가 있을 수도 있습니다.

AWS 관리자

올바른 AWS 리전의 AFT 관리 계정에 대한 액세스 권한을 검증합니다.

중요: AFT 관리 계정으로 인증한 것과 동일한 터미널 세션을 사용해야 합니다.

  1. 다음 명령을 실행하여 AFT 배포의 AWS 리전으로 이동합니다.

    export AWS_REGION=<aft_region>
  2. 다음과 같은 작업을 수행하여 계정을 올바르게 사용하고 있는지 확인합니다.

    • 다음 명령을 실행합니다:

    aws code-commit list-repositories
    • 그런 다음 출력에 나열된 리포지토리가 AFT 관리 계정에 있는 리포지토리의 이름과 일치하는지 확인합니다.

AWS 관리자

AFT 리포지토리 코드를 저장할 새 로컬 디렉터리를 생성합니다.

동일한 터미널 세션에서 다음 명령을 실행합니다.

mkdir my_aft cd my_aft
AWS 관리자

원격 AFT 리포지토리 코드를 복제합니다.

  1. 로컬 터미널에서 다음 명령을 실행합니다.

    git clone codecommit::$AWS_REGION://aft-global-customizations

    참고: 단순화를 위해 이 프로시저와 AFT는 기본 코드 브랜치만 사용합니다. 코드 브랜치를 사용하려면 여기에도 코드 브랜칭 명령을 입력할 수 있습니다. 하지만 기본 브랜치가 아닌 브랜치에서 적용된 모든 변경 사항은 AFT 자동화가 기본 브랜치의 코드를 적용할 때 롤백됩니다.

  2. 그런 다음에는 다음과 같은명령을 실행하여 복제된 디렉터리로 이동합니다.

    cd aft-global-customizations/terraform
AWS 관리자
작업설명필요한 기술

이전에 실행한 AFT 파이프라인을 열고 Terraform 구성 파일을 로컬 폴더에 복사합니다.

참고: AFT 파이프라인이 로컬에서 실행되려면 이 에픽에서 생성된 backend.tfaft-providers.tf 구성 파일이 필요합니다. 이러한 파일은 클라우드 기반 AFT 파이프라인 내에서 자동으로 생성되지만, 파이프라인을 로컬에서 실행하려면 수동으로 생성해야 합니다. AFT 파이프라인을 로컬에서 실행하려면 단일 AWS 계정 내에서 파이프라인 실행을 나타내는 파일 세트 하나가 필요합니다.

  1. AWS Control Tower 관리 계정 보안 인증 정보를 사용하여 AWS Management Console에 로그인합니다. 그런 다음 AWS CodePipeline 콘솔을 엽니다. AFT를 배포한 동일한 AWS 리전에 있는지 확인합니다.

  2. 왼쪽 탐색 창에서 파이프라인을 클릭합니다.

  3. ###########-customizations-pipeline을 선택합니다. (############은 Terraform 코드를 로컬에서 실행하는 데 사용하는 AWS 계정 ID입니다).

  4. 가장 최근 실행 표시성공 값이 표시되는지 확인합니다. 값이 다른 경우 AFT 파이프라인에서 사용자 지정을 다시 호출해야 합니다. 자세한 내용은 AWS Control Tower 설명서의 사용자 지정 재호출을 참조하세요.

  5. 세부 정보를 불러오려면 최신 런타임을 선택하세요.

  6. Apply-AFT-Global-Customizations 섹션에서 Apply-Terraform  단계를 찾습니다.

  7. Terraform 적용 단계의 세부 정보 섹션을 선택합니다.

  8. Terraform 적용 스테이지의 런타임 로그를 찾을 수 있습니다.

  9. 런타임 로그에서   “\n\n aft-providers.tf … “\n \n backend.tf” 줄로 시작하고 끝나는 섹션을 찾아보세요. 

  10. 이 두 레이블 사이의 출력을 복사하고 로컬 Terraform 폴더(터미널 세션의 현재 작업 디렉터리) 내에 aft-providers.tf라는 이름이 지정된 로컬 파일로 저장합니다.

    자동 생성 공급자.tf 문 예시

    ## Autogenerated providers.tf ## ## Updated on: 2022-05-31 16:27:45 ## provider "aws" { region = "us-east-2" assume_role { role_arn = "arn:aws:iam::############:role/AWSAFTExecution" } default_tags { tags = { managed_by = "AFT" } } }
  11. 런타임 로그에서 “\n\n tf … “\n \n backup.tf” 줄로 시작하고 끝나는 섹션을 찾아보세요. 

  12. 이 두 레이블 사이의 출력을 복사하고 로컬 Terraform 폴더(터미널 세션의 현재 작업 디렉터리) 내에 tf라는 이름이 지정된 로컬 파일로 저장합니다.

자동 생성된 백엔드.tf 문 예제

## Autogenerated backend.tf ## ## Updated on: 2022-05-31 16:27:45 ## terraform { required_version = ">= 0.15.0" backend "s3" { region = "us-east-2" bucket = "aft-backend-############-primary-region" key = "############-aft-global-customizations/terraform.tfstate" dynamodb_table = "aft-backend-############" encrypt = "true" kms_key_id = "cbdc21d6-e04d-4c37-854f-51e199cfcb7c" kms_key_id = "########-####-####-####-############" role_arn = "arn:aws:iam::#############:role/AWSAFTExecution" } }

참고: backend.tfaft-providers.tf 파일은 특정 AWS 계정, AFT 배포 및 폴더에 연결되어 있습니다. 이러한 파일은 동일한 AFT 배포 내의 aft-global-customizations리포지토리와 aft-account-customizations리포지토리에 있는지에 따라 달라집니다. 동일한 런타임 목록에서 두 파일을 모두 생성해야 합니다.

AWS 관리자
작업설명필요한 기술

검증하려는 Terraform 구성 변경 사항을 구현합니다.

  1. 다음 명령을 실행하여 복제된 aft-global-customizations리포지토리로 이동합니다.

    cd aft-global-customizations/terraform

    참고: 파일은 backend.tf 및 디렉터리의 aft-providers.tf 에 있습니다. 디렉터리에는 리포지토리의 Terraform 파일도 포함되어 있습니다. aft-global-customizations

  2. 로컬에서 테스트하려는 Terraform 코드 변경 사항을 구성 파일에 통합합니다.

AWS 관리자

ct_terraform.sh 스크립트를 실행하고 출력을 검토합니다.

  1. sh 스크립트가 들어 있는 로컬 폴더로 이동합니다.

  2. 수정된 Terraform 코드의 유효성을 검사하려면 다음 명령을 실행하여 ct_terraform.sh 스크립트를 실행합니다.

    ~/scripts/ct_terraform.sh apply

    참고 : 이 단계에서 모든 Terraform 명령을 실행할 수 있습니다. Terraform 명령 전체 목록을 보려면 다음 명령을 실행하세요.

    terraform --help
  3. 명령 출력을 확인합니다. 그런 다음 코드 변경 사항을 로컬에서 디버깅한 다음 변경 사항을 커밋하여 AFT 리포지토리로 다시 푸시합니다.

중요:

  • 로컬에서 변경한 후 원격 리포지토리로 푸시하지 않은 모든 변경 사항은 일시적이며 AFT 파이프라인 자동화를 실행하여 언제든지 취소할 수 있습니다.

  • AFT 자동화는 다른 사용자와 AFT 자동화 트리거가 호출할 수 있으므로 언제든지 실행할 수 있습니다.

  • AFT는 항상 리포지토리의 기본 브랜치에서 코드를 적용하여 커밋되지 않은 변경 사항을 취소합니다.

AWS 관리자
작업설명필요한 기술

backend.tf및 aft-providers.tf 파일에 대한 참조를 .gitignore 파일에 추가합니다.

다음 명령을 실행하여 만든 backend.tf aft-providers.tf 파일을 .gitignore 파일에 추가합니다.

echo backend.tf >> .gitignore echo aft-providers.tf >>.gitignore

참고: 파일을 파일로 이동하면 .gitignore파일이 커밋되어 원격 AFT 리포지토리로 푸시되지 않습니다.

AWS 관리자

코드 변경 사항을 커밋하고 원격 AFT 리포지토리에 푸시합니다.

  1. 새 Terraform 구성 파일을 리포지토리에 추가하려면 다음 명령을 실행하세요.

    git add <filename>
  2. 변경 사항을 적용하고 CodeCommit AWS의 원격 AFT 리포지토리로 푸시하려면 다음 명령을 실행합니다.

    git commit -a git push

중요: 이 시점까지 이 절차에 따라 도입한 코드 변경 사항은 하나의 AWS 계정에만 적용됩니다.

AWS 관리자
작업설명필요한 기술

AFT에서 관리하는 모든 계정에 변경 사항을 적용하세요.

AFT에서 관리하는 여러 AWS 계정에 변경 사항을 적용하려면 AWS Control Tower 설명서의 사용자 지정 재호출에 있는 지침을 따르세요.

AWS 관리자