다음을 통해 공유


Azure에서 Terraform 프로젝트에 대한 통합 테스트 구현

Terraform은 클라우드 인프라를 정의하고 미리 보기 및 배포를 가능하게 합니다. Terraform을 사용하여 HCL 구문사용하여 구성 파일을 만듭니다. HCL 구문을 사용하면 클라우드 공급자(예: Azure)와 클라우드 인프라를 구성하는 요소를 지정할 수 있습니다. 구성 파일을 만든 후에는 인프라 변경 내용을 배포하기 전에 미리 볼 수 있는 실행 계획 만듭니다. 변경 내용을 확인하면 실행 계획을 적용하여 인프라를 배포합니다.

통합 테스트는 새로 도입된 코드 변경이 기존 코드를 중단하지 않는지 확인합니다. DevOps에서 CI(연속 통합)는 코드 베이스가 변경될 때마다 전체 시스템을 빌드하는 프로세스(예: PR을 Git 리포지토리에 병합하려는 사용자)를 나타냅니다. 다음 목록에는 통합 테스트의 일반적인 예제가 포함되어 있습니다.

  • Lint 및 Formatter와 같은 정적 코드 분석 도구.
  • terraform을 실행하여 유효성을 검사하여 구성 파일의 구문을 확인합니다.
  • terraform plan 명령어를 실행하여 구성이 예상대로 작동하는지 확인합니다.

이 문서에서는 다음 방법을 알아봅니다.

  • Terraform 프로젝트에 대한 통합 테스트의 기본 사항을 알아봅니다.
  • Azure DevOps를 사용하여 연속 통합 파이프라인을 구성합니다.
  • Terraform 코드에서 정적 코드 분석을 실행합니다.
  • terraform validate 실행하여 로컬 컴퓨터에서 Terraform 구성 파일의 유효성을 검사합니다.
  • terraform plan 실행하여 원격 서비스 관점에서 Terraform 구성 파일의 유효성을 검사합니다.
  • Azure Pipeline을 사용하여 연속 통합을 자동화합니다.

1. 환경 구성

  • Azure 구독: Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
  • Azure DevOps 조직 및 프로젝트 : 없는 경우 Azure DevOps 조직을 만드세요.

  • Terraform Build & 릴리스 작업 확장: Azure DevOps 조직에 Terraform 빌드/릴리스 작업 확장 설치합니다.

  • Azure 구독에 대한 Azure DevOps 액세스 권한 부여: Azure Pipelines가 Azure 구독에 연결할 수 있도록 명명된 Azure terraform-basic-testing-azure-connection 만들기

  • 예제 코드 및 리소스: GitHub에서 통합 테스트 프로젝트다운로드합니다. 샘플을 다운로드하는 디렉터리를예제 디렉터리라고 합니다.

2. 로컬 Terraform 구성의 유효성 검사

terraform validate 명령어는 Terraform 파일이 포함된 디렉터리에서 명령줄을 통해 실행됩니다. 이 명령의 주요 목표는 구문의 유효성을 검사하는 것입니다.

  1. 예제 디렉터리 내에서 src 디렉터리로 이동합니다.

  2. terraform init 실행하여 작업 디렉터리를 초기화합니다.

    terraform init
    
  3. terraform을 실행하여 구성 파일의 구문을 유효성 검사하기 위한 유효성 검사를 수행합니다.

    terraform validate
    

    주요 정보:

    • Terraform 구성이 유효하다는 메시지가 표시됩니다.
  4. main.tf 파일을 편집합니다.

  5. 줄 5에서 구문을 무효화하는 오타를 삽입합니다. 예를 들어 var.locationvar.loaction으로 교체하세요.

  6. 파일을 저장합니다.

  7. 유효성 검사를 다시 실행합니다.

    terraform validate
    

    주요 정보:

    • 오류 코드 줄을 나타내는 오류 메시지와 오류에 대한 설명이 표시됩니다.

보듯이 Terraform은 구성 코드 구문에서 문제를 감지했습니다. 이 문제로 인해 구성이 배포되지 않습니다.

버전 제어 시스템에 푸시하기 전에 항상 Terraform 파일에 대해 terraform validate 실행하는 것이 좋습니다. 또한 이 유효성 검사 수준은 연속 통합 파이프라인의 일부여야 합니다. 이 문서의 뒷부분에서는자동으로 유효성을 검사하도록 Azure 파이프라인을 구성하는 방법을 살펴보겠습니다.

3. Terraform 구성 유효성 검사

이전 섹션에서는 Terraform 구성의 유효성을 검사하는 방법을 알아보았습니다. 이러한 테스트 수준은 구문과 관련이 있습니다. 이 테스트는 Azure에 이미 배포된 내용을 고려하지 않았습니다.

Terraform은 선언적 언어 최종 결과로 원하는 것을 선언한다는 의미입니다. 예를 들어 리소스 그룹에 가상 머신이 10개 있다고 가정해 보겠습니다. 그런 다음, 3개의 가상 머신을 정의하는 Terraform 파일을 만듭니다. 이 계획을 적용해도 총 개수는 13으로 증가하지 않습니다. 대신 Terraform은 7개의 가상 머신을 삭제하므로 3개로 끝납니다. terraform plan 실행하면 놀라움을 피하기 위해 실행 계획을 적용할 때 발생할 수 있는 결과를 확인할 수 있습니다.

Terraform 실행 계획을 생성하려면 terraform 계획실행합니다. 이 명령은 대상 Azure 구독에 연결하여 구성의 어떤 부분이 이미 배포되어 있는지 확인합니다. 그런 다음 Terraform은 Terraform 파일에 명시된 요구 사항을 충족하는 데 필요한 변경 내용을 결정합니다. 이 단계에서 Terraform은 아무것도 배포하지 않습니다. 계획을 적용하면 어떤 일이 일어날지 알려주고 있습니다.

문서와 함께 팔로우하고 이전 섹션의 단계를 수행한 경우 terraform plan 명령을 실행합니다.

terraform plan

terraform plan실행한 후 Terraform은 실행 계획을 적용할 때 발생할 수 있는 결과를 표시합니다. 출력은 추가, 변경 및 소멸될 Azure 리소스를 나타냅니다.

기본적으로 Terraform은 Terraform 파일과 동일한 로컬 디렉터리에 상태를 저장합니다. 이 패턴은 단일 사용자 시나리오에서 잘 작동합니다. 그러나 여러 사람이 동일한 Azure 리소스에서 작업하는 경우 로컬 상태 파일이 동기화에서 벗어날 수 있습니다. 이 문제를 해결하기 위해 Terraform은 Azure Storage와 같은 원격 데이터 저장소에 상태 파일 쓰기를 지원합니다. 이 시나리오에서는 로컬 컴퓨터에서 terraform plan 실행하고 원격 머신을 대상으로 지정하는 것이 문제가 될 수 있습니다. 따라서 이 유효성 검사 단계를 연속 통합 파이프라인의 일부로 자동화하는 것이 합리적일 수 있습니다.

4. 정적 코드 분석 실행

정적 코드 분석은 실행하지 않고 Terraform 구성 코드에서 직접 수행할 수 있습니다. 이 분석은 보안 문제 및 규정 준수 불일치와 같은 문제를 검색하는 데 유용할 수 있습니다.

다음 도구는 Terraform 파일에 대한 정적 분석을 제공합니다.

정적 분석은 연속 통합 파이프라인의 일부로 실행되는 경우가 많습니다. 이러한 테스트는 실행 계획 또는 배포를 만들 필요가 없습니다. 따라서 다른 테스트보다 더 빠르게 실행되며 일반적으로 연속 통합 프로세스에서 먼저 실행됩니다.

5. Azure Pipeline을 사용하여 통합 테스트 자동화

지속적인 통합에는 변경이 도입될 때 전체 시스템을 테스트하는 작업이 포함됩니다. 이 섹션에서는 연속 통합을 구현하는 데 사용되는 Azure Pipeline 구성을 확인합니다.

  1. 선택한 편집기를 사용하여 GitHubTerraform 샘플 프로젝트의 로컬 복제본으로 이동합니다.

  2. samples/integration-testing/src/azure-pipeline.yaml 파일을 엽니다.

  3. 다양한 설치 및 유효성 검사 루틴을 실행하는 데 사용되는 표준 단계 집합이 표시되는 단계 섹션까지 아래로 스크롤합니다.

  4. "1단계: Checkov 정적 코드 분석을 실행하기"라는 줄을 검토합니다. 이 단계에서 앞에서 언급한 Checkov 프로젝트는 샘플 Terraform 구성에 대한 정적 코드 분석을 실행합니다.

    - bash: $(terraformWorkingDirectory)/checkov.sh $(terraformWorkingDirectory)
      displayName: Checkov Static Code Analysis
    

    주요 정보:

    • 이 스크립트는 Docker 컨테이너 내에 탑재된 Terraform 작업 영역에서 Checkov를 실행합니다. Microsoft 관리 에이전트는 Docker를 사용할 수 있습니다. Docker 컨테이너 내에서 도구를 실행하는 것이 더 쉬우며 Azure Pipeline 에이전트에 Checkov를 설치할 필요가 없습니다.
    • $(terraformWorkingDirectory) 변수는 azure-pipeline.yaml 파일에 정의됩니다.
  5. "" 줄을 검토하십시오: 2단계 - Azure Pipelines 에이전트에 Terraform 설치." 이전에 설치한 Terraform Build & 릴리스 작업 확장에는 Azure Pipeline을 실행하는 에이전트에 Terraform을 설치하는 명령이 포함되어 있습니다. 이 작업은 이 단계에서 수행되는 작업입니다.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-installer.TerraformInstaller@0
      displayName: 'Install Terraform'
      inputs:
        terraformVersion: $(terraformVersion)
    

    주요 정보:

    • 설치할 Terraform 버전은 terraformVersion Azure Pipeline 변수를 통해 지정되고 azure-pipeline.yaml 파일에 정의됩니다.
  6. "3단계: Terraform init를 실행하여 작업 영역초기화"라는 줄을 검토합니다. 이제 Terraform이 에이전트에 설치되었으므로 Terraform 디렉터리를 초기화할 수 있습니다.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform init'
      inputs:
        command: init
        workingDirectory: $(terraformWorkingDirectory)
    

    주요 정보:

    • command 입력은 실행할 Terraform 명령을 지정합니다.
    • workingDirectory 입력은 Terraform 디렉터리의 경로를 나타냅니다.
    • $(terraformWorkingDirectory) 변수는 azure-pipeline.yaml 파일에 정의됩니다.
  7. "다음과 같이 읽는 줄을 검토합니다: 4단계: Terraform 'validate'를 실행하여 HCL 구문 유효성을 검사하기." 프로젝트 디렉터리가 초기화되면 terraform validate 실행되어 서버에서 구성의 유효성을 검사합니다.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform validate'
      inputs:
        command: validate
        workingDirectory: $(terraformWorkingDirectory)
    
  8. 5단계: Terraform 계획을 실행하여 HCL 구문유효성을 검사하는 읽는 줄을 검토합니다. 앞에서 설명한 대로 실행 계획을 생성하여 Terraform 구성이 배포 전에 유효한지 확인합니다.

    - task: charleszipp.azure-pipelines-tasks-terraform.azure-pipelines-tasks-terraform-cli.TerraformCLI@0
      displayName: 'Run terraform plan'
      inputs:
        command: plan
        workingDirectory: $(terraformWorkingDirectory)
        environmentServiceName: $(serviceConnection)
        commandOptions: -var location=$(azureLocation)
    

    주요 정보:

    • 입력은환경 구성 에서 만든 Azure 서비스 연결의 이름을 나타냅니다. 이 연결을 통해 Terraform은 Azure 구독에 액세스할 수 있습니다.
    • commandOptions 입력은 Terraform 명령에 인수를 전달하는 데 사용됩니다. 이 경우 위치를 지정합니다. $(azureLocation) 변수는 YAML 파일의 앞부분에서 정의됩니다.

Azure DevOps로 파이프라인 가져오기

  1. Azure DevOps 프로젝트를 열고 Azure Pipelines 섹션으로 이동합니다.

  2. 파이프라인 만들기 단추를 선택합니다.

  3. 당신의 코드는 어디에 있나요? 옵션에서 GitHub(YAML)을 선택하세요.

    코드는 어디에 있나요?

  4. 이 시점에서 조직에 액세스하려면 Azure DevOps에 권한을 부여해야 할 수 있습니다. 자세한 내용은 문서 GitHub 리포지토리 빌드를 참조하세요.

  5. 리포지토리 목록에서 GitHub 조직에서 만든 리포지토리의 포크를 선택합니다.

  6. 파이프라인 구성 단계에서 기존 YAML 파이프라인에서 시작하도록 선택합니다.

    기존 YAML 파이프라인

  7. 기존 YAML 파이프라인 선택 페이지가 표시되면, 분기 master를 지정하고 YAML 파이프라인의 경로 samples/integration-testing/src/azure-pipeline.yaml를 입력합니다.

    기존 YAML 파이프라인 선택

  8. 계속을 선택하여 GitHub에서 Azure YAML 파이프라인을 로드합니다.

  9. 파이프라인 YAML 페이지가 표시되면, 실행을 선택하여 파이프라인을 처음으로 만들고 수동으로 트리거합니다.

    Azure Pipeline 실행

결과 확인

Azure DevOps UI에서 파이프라인을 수동으로 실행할 수 있습니다. 그러나 이 문서의 요점은 자동화된 연속 통합을 표시하는 것입니다. 포크된 리포지토리의 samples/integration-testing/src 폴더에 대한 변경 내용을 커밋하여 프로세스를 테스트합니다. 변경 내용이 코드를 푸시하는 분기에서 새 파이프라인을 자동으로 트리거합니다.

GitHub에서 실행되는 파이프라인

해당 단계를 완료한 후에는 Azure DevOps의 세부 정보에 액세스하여 모든 항목이 올바르게 실행되었는지 확인합니다.

Azure DevOps 녹색 파이프라인

Azure에서 Terraform 문제 해결

Azure에서 Terraform을 사용할 때의 일반적인 문제 해결 방법

다음 단계