创建具有相同 DAGS 的新环境时缺少 FERNET_KEY 配置

bpg*_*eck 6 python python-3.x airflow google-cloud-composer

我在 Google Cloud 中使用 Composer (Airflow)。我想创建一个新环境,并将旧环境中相同的 DAG 和变量带到新环境中。

为此,我执行以下操作:

  • 我检查了几个变量并将它们导出到 JSON 文件。
  • 在我的新环境中,我导入了相同的 JSON 文件。
  • 我使用gsutil相同的 DAG 并将其上传到新环境

但是,在新环境中,由于FERNET_KEY configuration is missing. 我最好的猜测是,这与导入使用单独的 Fernet 密钥加密的变量有关,但我不确定。

有没有人遇到过这个问题?如果是这样,你是如何解决的?

小智 7

通过执行以下操作,我可以在 Composer 1.9 / Airflow 1.10.6 中可靠地重现该问题:

  1. 创建一个新的 Composer 集群
  2. 上传引用气流连接的 DAG
  3. 在 Composer 中设置环境变量
  4. 等待airflow-schedulerairflow-worker重新启动

除了 之外FERNET_KEY configuration is missing,该问题还表现为以下 Airflow 错误横幅:

Broken DAG: [/home/airflow/gcs/dags/MY_DAG.py] in invalid literal for int() with base 10: 'XXX'
Run Code Online (Sandbox Code Playgroud)
Broken DAG: [/home/airflow/gcs/dags/MY_DAG.py] Expecting value: line 1 column 1 (char 0)
Run Code Online (Sandbox Code Playgroud)

这个问题的根源是,添加一个新的环境变量,消除了AIRFLOW__CORE__FERNET_KEY从环境变量airflow-schedulerairflow-workerKubernetes部署规格波德模板:

 - name: AIRFLOW__CORE__FERNET_KEY
      valueFrom:
        secretKeyRef:
          key: fernet_key
          name: airflow-secrets
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,可以应用 Kubernetes 部署规范补丁:

$ cat config/composer_airflow_scheduler_fernet_key_patch.yaml
spec:
  template:
    spec:
      containers:
      - name: airflow-scheduler
        env:
        - name: AIRFLOW__CORE__FERNET_KEY
          valueFrom:
            secretKeyRef:
              key: fernet_key
              name: airflow-secrets

$ kubectl patch deployment airflow-scheduler --namespace=$AIRFLOW_ENV_GKE_NAMESPACE --patch "$(cat config/composer_airflow_scheduler_fernet_key_patch.yaml)"
Run Code Online (Sandbox Code Playgroud)

注意:此补丁也必须应用于airflow-worker.