本文介绍了 Databricks 既不提供也不支持的适用于 Terraform 的云开发工具包 (CDKTF)。 若要联系提供商,请参阅 Terraform 社区

本文介绍如何使用 Python 或 TypeScript 以及 Terraform CDK Databricks 提供程序 适用于 Terraform 的云开发工具包 (CDKTF) 。 CDKTF 是一个第三方基础结构即代码 (IaC) 平台,使你能够通过使用熟悉的编程语言、工具和工程实践来创建、部署和管理 Azure Databricks 资源。 虽然本文介绍的是如何使用 Python 和 TypeScript,但 CDKTF 还支持 Java、C# 和 Go 等语言。

Terraform CDK Databricks 提供程序基于 Databricks Terraform 提供程序 。 有关详细信息,请参阅 Terraform 云 。 CDKTF 基于 AWS 云开发工具包 (AWS CDK)

必须具有 Azure Databricks 工作区,因为本文会将资源部署到现有工作区中。

在本地开发计算机上,必须安装以下组件:

  • Terraform ,1.1 版或更高版本。 若要检查是否已安装 Terraform,并检查安装的版本,请从终端或通过 PowerShell 运行命令 terraform -v 安装 Terraform (如果尚未安装)。

    terraform -v
    
  • Node.js,16.13 版或更高版本,以及 npm。 若要检查是否已安装 Node.js 和 npm,并检查安装的版本,请运行命令 node -vnpm -v。 Node.js 的最新版本已包含 npm使用节点版本管理器 (nvm) 安装 Node.js 和 npm(如果尚未安装 Node.js 和 npm)。

    node -v
    npm -v
    
  • CDKTF CLI。 若要检查是否已安装 CDKTF CLI,并检查安装的版本,请运行命令 cdktf --version使用 npm 安装 CDKTF CLI(如果尚未安装)。

    cdktf --version
    

    还可以使用 Homebrew 在 macOS 上安装 CDKTF CLI。 请参阅安装 CDKTF

  • 相应的语言运行时工具,如下所示:

    Python

    Python 版本 3.7 或更高版本以及 pipenv 版本 2021.5.29 或更高版本。 若要检查是否已安装 Python 和 pipenv,并检查安装的版本,请运行命令 python --versionpipenv --version安装 Python安装 pipenv(如果尚未安装)。

    python --version
    pipenv --version
    

    Typescript

    TypeScript 版本 4.4 或更高版本。 若要检查是否已安装 TypeScript,并检查安装的版本,请运行命令 tsc -v安装 TypeScript(如果尚未安装)。

    tsc -v
    

    Java、c#、go

    安装语言必备组件

  • 下列类型作之一:

  • Databricks 命令行接口 (Databricks CLI),使用 Azure Databricks 个人访问令牌、通过运行 databricks configure --token 进行配置,或使用 Azure Active Directory (Azure AD) 令牌、通过设置 DATABRICKS_AAD_TOKEN 环境变量然后运行 databricks configure --aad-token 进行配置。 请参阅设置 CLI设置身份验证

    作为安全最佳做法,在使用自动化工具、系统、脚本和应用进行身份验证时,Databricks 建议使用属于服务主体(而不是工作区用户)的个人访问令牌。 要为服务主体创建令牌,请参阅管理服务主体的个人访问令牌

  • Azure CLI,通过 az login 命令登录。 请参阅如何安装 Azure CLI使用 Azure CLI 登录

    作为安全性方面的最佳做法,在对自动化工具、系统、脚本和应用进行身份验证时,Databricks 建议使用服务主体、通过 az login 命令登录。 请参阅 Azure Databricks 自动化的服务主体使用服务主体登录

  • 以下两个 Azure Databricks 环境变量:

  • DATABRICKS_HOST,设置为工作区实例 URL 的值,例如 https://adb-1234567890123456.7.azuredatabricks.net
  • DATABRICKS_TOKEN,设置为 Azure Databricks 个人访问令牌的值。 另请参阅管理个人访问令牌
  • 若要设置这些环境变量,请参阅操作系统文档。

    作为安全最佳做法,在使用自动化工具、系统、脚本和应用进行身份验证时,Databricks 建议使用属于服务主体(而不是工作区用户)的个人访问令牌。 要为服务主体创建令牌,请参阅管理服务主体的个人访问令牌

    在此步骤中,将在本地开发计算机上为 CDKTF 项目设置必要的目录结构。 然后在此目录结构中创建 CDKTF 项目。

  • 为 CDKTF 项目创建一个空目录,然后切换到该目录。 在终端或通过 PowerShell 运行以下命令:

    Unix、linux 和 macos

    mkdir cdktf-demo
    cd cdktf-demo
    

    Windows

    md cdktf-demo
    cd cdktf-demo
    
  • 运行以下命令创建 CDKTF 项目:

    Python

    cdktf init --template=python --local
    

    Typescript

    cdktf init --template=typescript --local
    
  • 提示输入“项目名称”时,通过按 Enter 接受 cdktf-demo 的默认项目名称。

  • 提示输入“项目描述”时,通过按 Enter 接受默认项目描述。

  • 如果提示“是否要从现有的 Terraform 项目开始”,请输入 N 并按 Enter。

  • 如果提示“是否要将故障报告发送给 CDKTF 团队”,请输入 n 并按 Enter。

    CDKTF 在 cdktf-demo 目录中创建了以下文件和子目录:

    Python

  • .gitignore,它是文件和目录列表,如果要将此项目推送到远程 Git 存储库中,Git 会忽略这些文件和目录。
  • cdktf.json,它包含 CDKTF 项目的配置设置。 有关配置设置的详细信息,请参阅配置文件
  • help,它包含可以采取的使用 CDKTF 项目的后续步骤相关信息。
  • main-test.py,它包含可为 CDKTF 项目编写的支持单元测试。 有关单元测试的详细信息,请参阅单元测试
  • main.py,它包含为 CDKTF 项目编写的 Python 代码。
  • PipfilePipfile.lock,它们管理 CDKTF 项目的代码依赖项。
  • Typescript

  • jest.config.js__tests__ 子目录,它们管理可为 CDKTF 项目编写的支持单元测试。 有关单元测试的详细信息,请参阅单元测试
  • node_modules 子目录,它包含 CDKTF 项目的代码依赖项。
  • .gitignore,它是文件和目录列表,如果要将此项目推送到远程 Git 存储库中,Git 会忽略这些文件和目录。
  • cdktf.json,它包含 CDKTF 项目的配置设置。 有关配置设置的详细信息,请参阅配置文件
  • help,它包含可以采取的使用 CDKTF 项目的后续步骤相关信息。
  • main.ts,它包含为 CDKTF 项目编写的 TypeScript 代码。
  • .npmrcpackage.jsonpackage-lock.jsonsetup.jstsconfig.json,它们管理 CDKTF 项目的代码依赖项和其他设置。
  • 步骤 2:定义资源

    在此步骤中,将使用 Terraform CDK Databricks 提供程序定义笔记本和运行该笔记本的作业。

  • 安装项目依赖项,如下所示:

    Python

    使用 pipenv,将 Terraform CDK Databricks 提供程序安装到 CDKTF 项目中,以生成 Azure Databricks 资源。 为此,请运行以下内容:

    pipenv install cdktf-cdktf-provider-databricks
    

    Typescript

    使用 npm(对于 TypeScript),将 Terraform CDK Databricks 提供程序安装到 CDKTF 项目中,以生成 Azure Databricks 资源。 此外,安装 Node.js 的 TypeScript 定义包,以使用 Buffer 类将代码写入笔记本。 为此,请运行以下内容:

    npm install @cdktf/provider-databricks --force
    npm install --save-dev @types/node
    
  • main.py 文件(对于 Python)或 main.ts 文件(对于 TypeScript)的内容替换为以下代码。 此代码使用 Azure Databricks 工作区对 CDKTF 进行身份验证,然后生成笔记本以及运行该笔记本的作业。 若要查看此代码的语法文档,请参阅适用于 PythonTypeScriptTerraform CDK Databricks 提供程序构造参考

    Python

    #!/usr/bin/env python
    from unicodedata import name
    from constructs import Construct
    from cdktf import App, TerraformStack, TerraformOutput
    from cdktf_cdktf_provider_databricks import *
    import vars
    from base64 import b64encode
    class MyStack(TerraformStack):
      def __init__(self, scope: Construct, ns: str):
        super().__init__(scope, ns)
        DatabricksProvider(
          scope = self,
          id    = "databricksAuth"
        current_user = DataDatabricksCurrentUser(
          scope     = self,
          id_       = "currentUser"
        # Define the notebook.
        notebook = Notebook(
          scope          = self,
          id_            = "notebook",
          path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
          language       = "PYTHON",
          content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
        # Define the job to run the notebook.
        job = Job(
          scope = self,
          id_   = "job",
          name  = f"{vars.resource_prefix}-job",
          new_cluster = JobNewCluster(
            num_workers   = vars.num_workers,
            spark_version = vars.spark_version,
            node_type_id  = vars.node_type_id
          notebook_task = JobNotebookTask(
            notebook_path = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py"
          email_notifications = JobEmailNotifications(
            on_success = [ current_user.user_name ],
            on_failure = [ current_user.user_name ]
        # Output the notebook and job URLs.
        TerraformOutput(
          scope = self,
          id    = "Notebook URL",
          value = notebook.url
        TerraformOutput(
          scope = self,
          id    = "Job URL",
          value = job.url
    app = App()
    MyStack(app, "cdktf-python")
    app.synth()
    

    Typescript

    import { Construct } from "constructs";
    import { App, TerraformOutput, TerraformStack } from "cdktf";
    import { DatabricksProvider, DataDatabricksCurrentUser, Notebook, Job } from "@cdktf/provider-databricks";
    import * as vars from "./vars";
    class MyStack extends TerraformStack {
      constructor(scope: Construct, name: string) {
        super(scope, name);
        new DatabricksProvider(this, "databricksAuth", {})
        const currentUser = new DataDatabricksCurrentUser(this, "currentUser", {});
        // Define the notebook.
        const notebook = new Notebook(this, "notebook", {
          path: `${currentUser.home}/CDKTF/${vars.resourcePrefix}-notebook.py`,
          language: "PYTHON",
          contentBase64: Buffer.from("display(spark.range(10))", "utf8").toString("base64")
        // Define the job to run the notebook.
        const job = new Job(this, "job", {
          name: `${vars.resourcePrefix}-job`,
          newCluster: {
            numWorkers: vars.numWorkers,
            sparkVersion: vars.sparkVersion,
            nodeTypeId: vars.nodeTypeId
          notebookTask: {
            notebookPath: `${currentUser.home}/CDKTF/${vars.resourcePrefix}-notebook.py`
          emailNotifications: {
            onSuccess: [ currentUser.userName ],
            onFailure: [ currentUser.userName ]
        // Output the notebook and job URLs.
        new TerraformOutput(this, "Notebook URL", {
          value: notebook.url
        new TerraformOutput(this, "Job URL", {
          value: job.url
    const app = new App();
    new MyStack(app, "cdktf-demo");
    app.synth();
    
  • main.py(对于 Python)或 main.ts(对于 TypeScript)所在的同一目录中创建名为 vars.py(对于 Python)或 vars.ts(对于 TypeScript)的文件。 将以下值替换为你自己的值,以指定资源前缀和群集设置,例如辅助角色数Spark 运行时版本字符串节点类型

    Python

    #!/usr/bin/env python
    resource_prefix = "cdktf-demo"
    num_workers     = 1
    spark_version   = "10.4.x-scala2.12"
    node_type_id    = "Standard_D3_v2"
    

    Typescript

    export const resourcePrefix = "cdktf-demo"
    export const numWorkers     = 1
    export const sparkVersion   = "10.4.x-scala2.12"
    export const nodeTypeId     = "Standard_D3_v2"
    

    步骤 3:部署资源

    在此步骤中,将使用 CDKTF CLI 将定义的笔记本和运行该笔记本的作业部署到现有的 Azure Databricks 工作区中。

  • 生成 CDKTF 项目的等效 Terraform 代码。 为此,请运行 cdktf synth 命令。

    cdktf synth
    
  • 在进行更改之前,可以查看挂起的资源更改。 运行以下内容:

    cdktf diff
    
  • 通过运行 cdktf deploy 命令部署笔记本和作业。

    cdktf deploy
    
  • 当提示批准时,按 Enter。 Terraform 将创建笔记本和作业并将其部署到工作区中。

    步骤 4:与资源交互

    在此步骤中,将在运行指定笔记本的 Azure Databricks 工作区中运行作业。

  • 若要查看作业将在工作区中运行的笔记本,请复制 cdk deploy 命令输出中显示的“笔记本 URL”链接,并将其粘贴到 Web 浏览器的地址栏中。
  • 若要查看在工作区中运行笔记本的作业,请复制 cdk deploy 命令输出中显示的“作业 URL”链接,并将其粘贴到 Web 浏览器的地址栏中。
  • 若要运行作业,请单击作业页上的“立即运行”按钮。
  • (可选)步骤 5:对资源进行更改

    在此可选步骤中,将更改笔记本的代码、重新部署已更改的笔记本,然后使用作业重新运行已更改的笔记本。

    如果不想对笔记本进行任何更改,请跳到步骤 6:清理

  • main.py 文件(对于 Python)或 main.ts 文件(对于 TypeScript)中,将 notebook 变量声明从以下内容:

    Python

        notebook = Notebook(
          scope          = self,
          id_            = "notebook",
          path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
          language       = "PYTHON",
          content_base64 = b64encode(b"display(spark.range(10))").decode("UTF-8")
    

    Typescript

       const notebook = new Notebook(this, "notebook", {
          path: currentUser.home + "/CDKTF/" + vars.resourcePrefix + "-notebook.py",
          language: "PYTHON",
          contentBase64: Buffer.from("display(spark.range(10))", "utf8").toString("base64")
    

    更改为以下内容:

    Python

        notebook = Notebook(
          scope          = self,
          id_            = "notebook",
          path           = f"{current_user.home}/CDKTF/{vars.resource_prefix}-notebook.py",
          language       = "PYTHON",
          content_base64 = b64encode(b'''
    data = [
      { "Category": 'A', "ID": 1, "Value": 121.44 },
      { "Category": 'B', "ID": 2, "Value": 300.01 },
      { "Category": 'C', "ID": 3, "Value": 10.99 },
      { "Category": 'E', "ID": 4, "Value": 33.87}
    df = spark.createDataFrame(data)
    display(df)
    ''').decode("UTF-8")
    

    Typescript

       const notebook = new Notebook(this, "notebook", {
          path: currentUser.home + "/CDKTF/" + vars.resourcePrefix + "-notebook.py",
          language: "PYTHON",
          contentBase64: Buffer.from(`
    data = [
    { "Category": 'A', "ID": 1, "Value": 121.44 },
    { "Category": 'B', "ID": 2, "Value": 300.01 },
    { "Category": 'C', "ID": 3, "Value": 10.99 },
    { "Category": 'E', "ID": 4, "Value": 33.87}
    df = spark.createDataFrame(data)
    display(df)`, "utf8").toString("base64")
    

    确保以倒引号 (`) 开始和结束的代码行与代码编辑器的边缘齐平。 否则,Terraform 将会在笔记本中插入空格,这可能会导致新的 Python 代码无法运行。

  • 重新生成 CDKTF 项目的等效 Terraform 代码。 为此,请运行以下内容:

    cdktf synth
    
  • 在进行更改之前,可以查看挂起的资源更改。 运行以下内容:

    cdktf diff
    
  • 通过运行 cdktf deploy 命令部署笔记本更改。

    cdktf deploy
    
  • 当提示批准时,按 Enter。 Terraform 将更改笔记本的内容。

  • 若要查看作业将在工作区中运行的已更改笔记本,请刷新先前打开的笔记本,或复制 cdk deploy 命令输出中显示的“笔记本 URL”链接,并将其粘贴到 Web 浏览器的地址栏中。

  • 若要查看在工作区中运行已更改笔记本的作业,请刷新先前打开的作业,或复制 cdk deploy 命令输出中显示的“作业 URL”链接,并将其粘贴到 Web 浏览器的地址栏中。

  • 若要运行作业,请单击作业页上的“立即运行”按钮。

    步骤 6:清理

    在此步骤中,将使用 CDKTF CLI 从 Azure Databricks 工作区中删除笔记本和作业。

  • 通过运行 cdktf destroy 命令从工作区中删除资源:

    cdktf destroy
    
  • 当提示批准时,按 Enter。 Terraform 将从工作区中删除资源。

  • 适用于 TypeScriptPythonJavaC#GoTerraform CDK Databricks 提供程序构造参考
  •