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

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

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

  • Lint 및 형식과 같은 정적 코드 분석 도구입니다.
  • terraform 유효성 검사를 실행하여 구성 파일의 구문을 확인합니다.
  • terraform 계획을 실행하여 구성이 예상대로 작동하는지 확인합니다.

이 문서에서는 다음 방법을 설명합니다.

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

1. 환경 구성

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

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

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

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

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

terraform validate 명령은 Terraform 파일이 포함된 디렉터리의 명령줄에서 실행됩니다. 기본 이 명령은 구문의 유효성을 검사하는 것입니다.

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

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

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

    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개 있다고 가정해 보겠습니다. 그런 다음, 세 개의 가상 머신을 정의하는 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. 선택한 편집기를 사용하여 GitHub에서 Terraform 샘플 프로젝트의 로컬 복제본으로 이동합니다.

  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 & Release Task 확장에는 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. Step 4: run Terraform validate to validate HCL syntax(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)
    

    주요 정보:

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

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

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

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

  3. 코드 위치 옵션에 대해 YAML(GitHub)을 선택합니다.

    코드는 어디에 있나요?

  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을 사용할 때 일반적인 문제 해결

다음 단계