Databricks Terraform 공급자

HashiCorp Terraform은 여러 클라우드 제공업체에서 안전하고 예측 가능한 클라우드 인프라를 만드는 데 널리 사용되는 오픈 소스 도구입니다. Databricks Terraform 공급자를 사용하여 유연하고 강력한 도구를 사용하여 Azure Databricks 작업 영역 및 관련 클라우드 인프라를 관리할 수 있습니다. Databricks Terraform 공급자의 목표는 데이터 플랫폼을 배포하고 관리하는 가장 복잡한 측면의 자동화를 지원하는 모든 Databricks REST API를 지원하는 것입니다. Databricks 고객은 Databricks Terraform 공급자를 사용하여 클러스터와 작업을 배포 및 관리하고 데이터 액세스를 구성합니다. Azure 공급자를 사용하여 Azure Databricks 작업 영역을 프로비저닝합니다.

시작

이 섹션에서는 로컬 개발 머신에서 Terraform 및 Databricks Terraform 공급자를 사용하도록 요구 사항을 설치하고 구성합니다. 그런 다음, Terraform 인증을 구성합니다. 이 섹션에 따라 이 문서에서는 Azure Databricks Notebook, 클러스터 및 기존 Azure Databricks 작업 영역의 클러스터에서 Notebook을 실행하는 작업을 프로비전하기 위해 실험할 수 있는 샘플 구성을 제공합니다.

요구 사항

  1. Terraform CLI가 있어야 합니다. Terraform 웹 사이트에서 Terraform 다운로드를 참조하세요.

  2. Terraform 프로젝트가 있어야 합니다. 터미널에서 빈 디렉터리를 만든 다음, 해당 디렉터리로 전환합니다. (각각의 개별 Terraform 구성 파일 집합은 Terraform 프로젝트라고 하는 자체 디렉터리에 있어야 합니다.) 예: mkdir terraform_demo && cd terraform_demo.

    mkdir terraform_demo && cd terraform_demo
    

    Terraform 프로젝트의 하나 이상의 구성 파일에 프로젝트에 대한 Terraform 구성을 포함합니다. 구성 파일 구문에 대한 자세한 내용은 Terraform 웹 사이트의 Terraform 언어 설명서를 참조하세요.

  3. Databricks Terraform 공급자에 대한 종속성을 Terraform 프로젝트에 추가해야 합니다. Terraform 프로젝트의 구성 파일 중 하나에 다음을 추가합니다.

    terraform {
      required_providers {
        databricks = {
          source = "databricks/databricks"
        }
      }
    }
    
  4. Terraform 프로젝트에 대한 인증을 구성해야 합니다. Databricks Terraform 공급자 설명서의 인증을 참조하세요.

샘플 구성

이 섹션에서는 Azure Databricks Notebook, 클러스터, 기존 Azure Databricks 작업 영역의 클러스터에서 Notebook을 실행하는 작업을 프로비저닝하기 위해 실험할 수 있는 샘플 구성을 제공합니다. 이전 섹션에서 설명한 대로 이미 요구 사항을 설정하고 Terraform 프로젝트를 만들고 Terraform 인증을 사용하여 프로젝트를 구성한 것으로 가정합니다.

  1. Terraform 프로젝트에 이름이 지정된 me.tf 파일을 만들고 다음 코드를 추가합니다. 이 파일은 현재 사용자(귀하)에 대한 정보를 가져옵니다.

    # Retrieve information about the current user.
    data "databricks_current_user" "me" {}
    
  2. notebook.tf라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 Notebook을 나타냅니다.

    variable "notebook_subdirectory" {
      description = "A name for the subdirectory to store the notebook."
      type        = string
      default     = "Terraform"
    }
    
    variable "notebook_filename" {
      description = "The notebook's filename."
      type        = string
    }
    
    variable "notebook_language" {
      description = "The language of the notebook."
      type        = string
    }
    
    resource "databricks_notebook" "this" {
      path     = "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
      language = var.notebook_language
      source   = "./${var.notebook_filename}"
    }
    
    output "notebook_url" {
     value = databricks_notebook.this.url
    }
    
  3. notebook.auto.tfvars라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 Notebook의 속성을 지정합니다.

    notebook_subdirectory = "Terraform"
    notebook_filename     = "notebook-getting-started.py"
    notebook_language     = "PYTHON"
    
  4. notebook-getting-started.py라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 Notebook의 콘텐츠를 나타냅니다.

    display(spark.range(10))
    
  5. cluster.tf라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 클러스터를 나타냅니다.

    variable "cluster_name" {
      description = "A name for the cluster."
      type        = string
      default     = "My Cluster"
    }
    
    variable "cluster_autotermination_minutes" {
      description = "How many minutes before automatically terminating due to inactivity."
      type        = number
      default     = 60
    }
    
    variable "cluster_num_workers" {
      description = "The number of workers."
      type        = number
      default     = 1
    }
    
    # Create the cluster with the "smallest" amount
    # of resources allowed.
    data "databricks_node_type" "smallest" {
      local_disk = true
    }
    
    # Use the latest Databricks Runtime
    # Long Term Support (LTS) version.
    data "databricks_spark_version" "latest_lts" {
      long_term_support = true
    }
    
    resource "databricks_cluster" "this" {
      cluster_name            = var.cluster_name
      node_type_id            = data.databricks_node_type.smallest.id
      spark_version           = data.databricks_spark_version.latest_lts.id
      autotermination_minutes = var.cluster_autotermination_minutes
      num_workers             = var.cluster_num_workers
    }
    
    output "cluster_url" {
     value = databricks_cluster.this.url
    }
    
  6. cluster.auto.tfvars라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 클러스터의 속성을 지정합니다.

    cluster_name                    = "My Cluster"
    cluster_autotermination_minutes = 60
    cluster_num_workers             = 1
    
  7. job.tf라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 클러스터에서 Notebook을 실행하는 작업을 나타냅니다.

    variable "job_name" {
      description = "A name for the job."
      type        = string
      default     = "My Job"
    }
    
    variable "task_key" {
      description = "A name for the task."
      type        = string
      default     = "my_task"
    }
    
    resource "databricks_job" "this" {
      name = var.job_name
      task {
        task_key = var.task_key
        existing_cluster_id = databricks_cluster.this.cluster_id
        notebook_task {
          notebook_path = databricks_notebook.this.path
        }
      }
      email_notifications {
        on_success = [ data.databricks_current_user.me.user_name ]
        on_failure = [ data.databricks_current_user.me.user_name ]
      }
    }
    
    output "job_url" {
      value = databricks_job.this.url
    }
    
  8. job.auto.tfvars라는 다른 파일을 만들고 다음 코드를 추가합니다. 이 파일은 작업의 속성을 지정합니다.

    job_name = "My Job"
    task_key = "my_task"
    
  9. terraform plan를 실행합니다. 오류가 있으면 수정한 다음, 명령을 다시 실행합니다.

  10. terraform apply를 실행합니다.

  11. Notebook, 클러스터, 작업이 생성되었는지 확인합니다. terraform apply 명령의 출력에서 notebook_url, cluster_url, job_url의 URL을 찾아 이동합니다.

  12. 작업을 실행합니다. 작업 페이지에서 지금 실행을 클릭합니다. 작업이 완료되면 전자 메일 받은 편지함을 검사.

  13. 이 샘플을 완료하면 terraform destroy를 실행하여 Azure Databricks 작업 영역에서 Notebook, 클러스터, 작업을 삭제합니다.

    참고 항목

    terraform applyterraform destroy 명령에 대한 terraform plan자세한 내용은 Terraform 설명서의 Terraform CLI 설명서를 참조하세요.

  14. Notebook, 클러스터, 작업이 삭제되었는지 확인합니다. Notebook, 클러스터, 작업 페이지를 새로 고쳐 각각 리소스를 찾을 수 없다는 메시지를 표시합니다.

테스팅

Terraform 구성을 배포하기 전이나 후에 테스트합니다. 리소스를 배포하기 전에 단위 테스트와 유사한 테스트를 실행할 수 있습니다. 리소스를 배포한 후 통합 테스트와 유사한 테스트를 실행할 수도 있습니다. Terraform 설명서의 테스트를 참조하세요.

이 프로세스에 따라 이 문서의 샘플 구성에 대한 통합 테스트와 유사한 테스트를 실행합니다.

  1. 이름이 지정된 cluster.tftest.hcl파일을 만들고 다음 코드를 추가합니다. 이 파일은 배포된 클러스터에 예상 클러스터 이름이 있는지 여부를 테스트합니다.

    # Filename: cluster.tftest.hcl
    
    run "cluster_name_test" {
      command = apply
    
      assert {
        condition     = databricks_cluster.this.cluster_name == var.cluster_name
        error_message = "Cluster name did not match expected name"
      }
    }
    
  2. 이름이 지정된 job.tftest.hcl파일을 만들고 다음 코드를 추가합니다. 이 파일은 배포된 작업에 예상된 작업 이름이 있는지 테스트합니다.

    run "job_name_test" {
      command = apply
    
      assert {
        condition     = databricks_job.this.name == var.job_name
        error_message = "Job name did not match expected name"
      }
    }
    
  3. 이름이 지정된 notebook.tftest.hcl파일을 만들고 다음 코드를 추가합니다. 이 파일은 배포된 Notebook에 예상 작업 영역 경로가 있는지 테스트합니다.

    run "notebook_path_test" {
      command = apply
    
      assert {
        condition     = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
        error_message = "Notebook path did not match expected path"
      }
    }
    
  4. terraform test를 실행합니다. Terraform은 각 리소스를 Azure Databricks 작업 영역에 배포하고, 각 관련 테스트를 실행하고, 테스트 결과를 보고한 다음, 배포된 리소스를 중단합니다.

다음 프로세스를 사용하여 이 문서의 샘플 구성에 대한 단위 테스트와 유사한 테스트를 실행합니다.

  • 이전 테스트의 각 줄을 command = apply 다음으로 command = plan변경한 다음 실행 terraform test합니다. Terraform은 각 관련 테스트를 실행하고 해당 테스트 결과를 보고하지만 리소스는 배포하지 않습니다.
  • 리소스를 배포하지 않고 인증 자격 증명을 요구하지 않고 실행할 terraform test 수 있는 Databricks Terraform 공급자를 모의합니다. Terraform 설명서에서 모의 개체를 참조하세요. 모의 테스트를 실행하기 위해 한 가지 방법은 테스트에 줄을 mock_provider "databricks" {} 추가하고 줄을 command = apply 제거하거나 command = plan다음과 같이 제거하는 것입니다.
# Filename: cluster.tftest.hcl

mock_provider "databricks" {}

run "cluster_mock_name_test" {
  assert {
    condition     = databricks_cluster.this.cluster_name == var.cluster_name
    error_message = "Cluster name did not match expected name"
  }
}
# Filename: job.tftest.hcl

mock_provider "databricks" {}

run "job_mock_name_test" {
  assert {
    condition     = databricks_job.this.name == var.job_name
    error_message = "Job name did not match expected name"
  }
}
# Filename: notebook.tftest.hcl

mock_provider "databricks" {}

run "notebook_mock_path_test" {
  assert {
    condition     = databricks_notebook.this.path == "${data.databricks_current_user.me.home}/${var.notebook_subdirectory}/${var.notebook_filename}"
    error_message = "Notebook path did not match expected path"
  }
}

다음 단계

  1. Azure Databricks 작업 영역을 만듭니다.
  2. Azure Databricks 작업 영역에 대한 작업 영역 리소스를 관리합니다.

문제 해결

참고 항목

Terraform 관련 지원은 HashiCorp 토론 웹 사이트의 최신 Terraform 항목을 참조하세요. Databricks Terraform 공급자와 관련된 문제는 databrickslabs/terraform-provider-databricks GitHub 리포지토리의 문제를 참조하세요.

오류: 공급자를 설치하지 못함

이슈: 버전 제어 시스템에 terraform.lock.hcl 파일을 체크 인하지 않고 terraform init 명령을 실행하면 Failed to install provider 메시지가 나타납니다. 추가 출력에는 다음과 유사한 메시지가 포함될 수 있습니다.

Error while installing databrickslabs/databricks: v1.0.0: checksum list has no SHA-256 hash for "https://github.com/databricks/terraform-provider-databricks/releases/download/v1.0.0/terraform-provider-databricks_1.0.0_darwin_amd64.zip"

원인: Terraform 구성이 오래된 Databricks Terraform 공급자를 참조합니다.

해결 방법:

  1. 모든 .tf 파일에서 databrickslabs/databricksdatabricks/databricks로 바꿉니다.

    이러한 대체를 자동화하려면 업데이트할 .tf 파일이 포함된 부모 폴더에서 다음 Python 명령을 실행합니다.

    python3 -c "$(curl -Ls https://dbricks.co/updtfns)"
    
  2. 다음 Terraform 명령을 실행한 다음, 메시지가 표시되면 변경 내용을 승인합니다.

    terraform state replace-provider databrickslabs/databricks databricks/databricks
    

    이 명령에 대한 자세한 내용은 Terraform 설명서에서 명령: state replace-provider를 참조하세요.

  3. 다음 Terraform 명령을 실행하여 변경 내용을 확인합니다.

    terraform init
    

오류: 사용 가능한 공급자 패키지를 쿼리하지 못함

이슈: 버전 제어 시스템에 terraform.lock.hcl 파일을 체크 인하지 않고 terraform init 명령을 실행하면 Failed to query available provider packages 메시지가 나타납니다.

원인: Terraform 구성이 오래된 Databricks Terraform 공급자를 참조합니다.

해결 방법: 오류: 공급자를 설치하지 못함의 해결 지침을 따르세요.

로깅 사용

Databricks Terraform 공급자는 환경 변수 DEBUG 를 Terraform이 지원하는 다른 로그 수준으로 설정 TF_LOG 하여 사용하도록 설정할 수 있는 로그를 출력합니다.

기본적으로 로그는 .에 stderr전송됩니다. 파일에 로그를 보내려면 환경 변수를 TF_LOG_PATH 대상 파일 경로로 설정합니다.

예를 들어 다음 명령을 실행하여 디버그 수준에서 로깅을 사용하도록 설정하고, 명령이 실행되는 동안 terraform apply 모노크롬 형식의 로그를 현재 작업 디렉터리를 기준으로 명명된 tf.log 파일에 출력할 수 있습니다.

TF_LOG=DEBUG TF_LOG_PATH=tf.log terraform apply -no-color

Terraform 로깅에 대한 자세한 내용은 Terraform 디버깅을 참조 하세요.

추가 예제

추가 리소스