목차 (Table of Contents)
소개 (Introduction)
Terraform은 고객들이 AWS에서 인프라 및 서비스를 프로비저닝하고 관리하는 데 널리 사용됩니다. <br>
Terraform 모듈은 함께 사용되는 여러 리소스의 컨테이너입니다. 모듈은 가벼운 추상화(abstractions)를 생성하는 데 사용되어야 하며, 이를 통해 물리적 객체 자체에 대한 설명이 아닌 아키텍처 관점에서 인프라를 기술할 수 있습니다. <br>
아티팩트 범위 (Scope of the artifact):
고품질의 신뢰성 있는 모듈을 제공하기 위해서는 이들 모든 모듈이 테스트되어야 합니다.
인프라스트럭처 애즈 코드(Infrastructure as Code)의 특성상, 설명된 리소스에 대한 자동화된 테스트는 항상 복잡했으며, 종종 개발자들이 배포 후 자신들의 솔루션에 대해 수동 테스트를 수행하도록 강요해 왔습니다.
이 리포지토리에 제시된 모듈은 CodePipeline, CodeBuild 및 Terratest 라이브러리를 기반으로 하는 지속적 통합(CI) 솔루션을 배포하는 코드를 포함하고 있으며, Terraform 모듈에 대한 E2E 테스트를 자동화 방식으로 실행할 수 있는 기능을 제공합니다.
대상 사용자 (Target Audience)
이 아티팩트의 주요 대상 사용자는 Terraform 경험이 있는 Infrastructure as Code 개발자입니다.
간단한 기본 테스트의 경우 golang에 대한 경험은 필요하지 않습니다.
사용 사례 (UseCase)
이 아티팩트는 Terraform이 주된 IaC 도구로 사용되는 여러 프로젝트에서의 저희 경험을 바탕으로 구축되었습니다.
저희는 고객 측에서 팀과 프로젝트 전반에 걸쳐 재사용 가능한 모듈에 대한 수요가 증가하는 것을 관찰했습니다.
그 결과, 고객들은 높은 품질의 신뢰할 수 있는 Terraform 코드를 요구하고 있습니다.
더욱이 이러한 시나리오에서는 해당 모듈들이 지속적으로 개발됩니다.
따라서 새로운 기능 배포를 보장하고 시스템 안정성을 확보하며 높은 표준을 강제하기 위해 자동화된 E2E 테스트가 필요하게 됩니다.
아키텍처 (Architecture)
다음 아키텍처 다이어그램은 제안된 솔루션을 단순화하여 보여줍니다. 언급된 E2E 테스트는 제공된 Terraform 모듈을 기반으로 독립적인 계정을 사용하여 실행된다는 점에 유의하십시오.
pic1
리포지토리 구조 (Repository Structure)
.
|-- README.md
`-- terraform
...
이 디렉토리는 다음을 포함합니다:
./examples: 모듈에 대한 재사용 가능한 예제.
./modules: CodeBuild 빌드 스크립트를 포함한 CI 파이프라인용 Terraform 모듈.
리포지토리의 내용은 재사용 가능한 Terraform 모듈을 제공하는 구조로 되어 있습니다. 이 모듈과 그 내용은 추출하여 재사용할 수 있습니다.
모듈을 배포할 때 작동하는 예제를 함께 제공하는 것이 좋은 관행입니다.
이러한 예제들은 모듈 디렉토리와 같은 레벨에 있는 전용 디렉토리에 저장될 수 있습니다.
이 저장소에는 예시 cicd_account가 제공됩니다. 이 예시는 /terraform/modules/cicd에 위치한 모듈을 사용합니다. 이 예시는 CodePipeline, CodeBuild, 그리고 CodeCommit 기반의 CI를 구현하며, 같은 저장소를 소스로 사용합니다.
제안된 동작은 변경하고 특정 요구 사항에 맞게 조정할 수 있습니다.
이 디렉터리에는 Terraform 모듈, 테스트 코드, 그리고 CodeBuild가 실행하는 코드가 포함되어 있습니다.
CodeBuild와 buildspec.yaml 파일을 해석하는 방법에 대한 정보는 여기에서 찾을 수 있습니다. 이 문서의 범위가 아니므로 자세히 설명하지 않습니다.
CodeBuild 워크플로우:
modules/cicd/test에 기술된 테스트를 실행합니다.
- 각 실행에 대한 테스트 보고서는 AWS CodeBuild 콘솔의
Reports 탭에서 접근할 수 있습니다.
가이드
전제 조건 (Prerequisites)
예시를 실행하려면 다음 전제 조건들이 필요합니다.
1. CI 파이프라인 배포.
제공된 코드 예시를 사용하여 CI 파이프라인을 배포할 수 있습니다. 교차 계정 설정(cross account setup)을 배포할지 선택할 수 있는데, 이 경우 CI는 하나의 AWS 계정에서 실행되고 테스트는 다른 AWS 계정에서 수행됩니다. 단순화를 위해 본 가이드에서는 단일 AWS 계정 내에서 솔루션을 설정하는 방법을 안내합니다.
CI를 배포하려면 다음 단계를 따르세요:
- 필요에 맞게 terraform/examples/cicd_account/inventories/variables.tfvars 파일을 수정하세요. 사용 가능한 모든 변수 목록과 각 변수의 범위에 대한 간략한 설명은 terraform/examples/cicd_account/variables.tf에서 확인할 수 있습니다.
- AWS CLI를 구성하세요. 더 자세한 내용은 여기를 참고하세요.
- 리소스를 배포하세요:
cd terraform/examples/cicd_account
./run_terraform.sh
제공되는 지침을 따르세요.
오류가 발생하면 Troubleshooting 섹션을 확인하세요.
모듈 내부의 README.md에는 프로비저닝된 리소스에 대한 정보가 제공됩니다.
2. 테스트 코드를 검토하고 조정하기
모듈 디렉터리 내에 cicd_test.go라는 테스트 예제가 있습니다. 이 파일은 원하는 요구 사항을 충족하도록 조정할 수 있습니다.
전체 가이드는 모듈의 README.md에서 확인할 수 있습니다.
3. 코드를 새 CodeCommit 리포지토리에 푸시하기
이 테스트를 위해 현재 사용하고 있는 것과 동일한 코드를 푸시할 수 있습니다.
- 이 첫 번째 단계는 선택 사항이지만, 권장됩니다: git이 Terraform 상태 파일을 추적하는 것을 방지하기 위해 리포지토리 루트 레벨에
.gitignore 파일을 생성하세요.
echo "*.tfstate*
.terraform
plan.out" >> .gitignore
-
리포지토리 원격 주소 가져오기:
-
AWS 콘솔의 CodeCommit으로 이동합니다.
-
리포지토리 이름을 클릭하세요.
-
Clone URL을 클릭하고 선호하는 방식을 선택하세요 (저는 HTTPS (GRC)를 추천합니다).
설정 방법에 대한 문서는 connection steps를 클릭하여 확인할 수 있습니다.
-
git 리포 설정하기:
git remote add origin <THE_URL_YOU_GOT_ON_STEP2>
git checkout -b dev
...
- dev 브랜치에 레포지토리를 푸시하면 파이프라인 실행(Pipeline)이 시작됩니다.
CodePipeline 콘솔에 연결하여 파이프라인 실행을 확인합니다.
4. 정리 (Clean Up)
작업을 완료했다면, 추가 비용이 발생하는 것을 방지하기 위해 환경을 정리해야 합니다.
다음 명령어를 실행하여 진행할 수 있습니다:
cd terraform/examples/cicd_account
./run_terraform.sh -d
이 절차를 따르면 S3 버킷의 모든 객체를 제거하는지 확인하는 메시지가 더 이상 표시되지 않습니다.
버킷 이름은 이전 명령어의 출력에서 확인할 수 있습니다.
CodeBuild_S3_bucket = "artifact-cicd-test-12345678910-codebuild"
CodePipeline_S3_bucket = "artifact-cicd-test-12345678910-codepipeline"
...
이 절차는 수동으로 수행해야 합니다. 다음 단계를 따르세요:
- AWS 콘솔에 접속하여 S3로 이동합니다.
- 버킷을 선택하고
Empty를 클릭합니다.
문제 해결 (Troubleshooting)
S3 버킷 삭제 오류 (BucketNotEmpty)
Terraform은 정리하거나 배포를 업데이트할 때 이 오류와 함께 종료될 수 있습니다.
이유는 Terraform이 비어있지 않은(non-empty) S3 버킷을 제거하지 못하기 때문입니다.
문제를 해결하려면 버킷 내의 객체를 수동으로 제거해야 합니다:
- AWS 콘솔에 접속하여 S3로 이동합니다.
- 오류가 발생한 버킷을 선택하고
Empty를 클릭합니다.
보안 (Security)
더 자세한 정보는 CONTRIBUTING를 참조하세요.
라이선스 (License)
이 라이브러리는 MIT-0 License 하에 라이선스가 부여되었습니다. LICENSE 파일을 참고하세요.