[Документация Yandex Cloud](../../../index.md) > [Yandex Cloud Stackland](../../index.md) > [Пошаговые инструкции](../index.md) > Оркестрация данных > Managed Service for Apache Airflow™ > Сохранить и восстановить Connections и Variables в Apache Airflow™

# Сохранить и восстановить Connections и Variables в Apache Airflow™

Перед [удалением кластера](delete-cluster.md) или переносом DAG сохраните Connections и Variables из его базы метаданных. Для полной выгрузки значений в Apache Airflow™ 3.1.8 используйте CLI. В UI нет экспорта Connections, а экспорт Variables может содержать замаскированные значения.

Выгрузка включает настройки из базы метаданных. История запусков, DAG-файлы, логи, конфигурация кластера и значения из окружения или внешнего хранилища секретов в нее не входят. Сохраните их отдельно, если они нужны для переноса.

## Перед началом {#before-you-begin}

Подготовьте `kubectl` с доступом к установке и локальный Python 3 для проверки JSON. Нужны права на чтение `AirflowCluster`, получение списка подов и выполнение команд в подах (`pods/exec`). Учетных данных веб-интерфейса Apache Airflow™ для этой операции недостаточно; при отсутствии доступа обратитесь к администратору установки.

1. Убедитесь, что исходный кластер находится в состоянии `Ready`. При необходимости [возобновите его](pause-resume.md#resume).
1. На время выгрузки прекратите изменение Connections и Variables: две команды экспорта не создают общий атомарный снимок.
1. Получите UID кластера:

    ```bash
    kubectl get airflowcluster <имя_кластера> \
      -n <пространство_имен> \
      -o jsonpath='{.metadata.uid}'
    ```

1. Найдите работающий под API server:

    ```bash
    kubectl get pods -n <пространство_имен> \
      -l 'tier=airflow,component=api-server,airflow.stackland.yandex.cloud/owner-uid=<UID_кластера>'
    ```

    Используйте имя пода со всеми готовыми контейнерами в следующих командах.

## Экспортировать настройки {#export}

{% note warning %}

Файлы экспорта содержат расшифрованные пароли и секретные значения. Сохраняйте их в каталоге с ограниченным доступом, не добавляйте в репозиторий и не передавайте через логи или сообщения.

{% endnote %}

1. Создайте новый локальный каталог для копии и перейдите в него. Выполните команды в одном терминале:

    ```bash
    umask 077
    mkdir airflow-settings-backup
    cd airflow-settings-backup
    ```

1. Экспортируйте Connections:

    ```bash
    kubectl exec <имя_пода> -n <пространство_имен> \
      -c api-server -- \
      airflow connections export - --file-format json > connections.json
    ```

1. Экспортируйте Variables:

    ```bash
    kubectl exec <имя_пода> -n <пространство_имен> \
      -c api-server -- \
      airflow variables export - > variables.json
    ```

    Обе команды должны завершиться успешно. Сообщение о количестве экспортированных записей выводится отдельно от JSON.

1. Проверьте, что файлы содержат корректный JSON, не выводя значения на экран:

    ```bash
    python3 -m json.tool connections.json > /dev/null
    python3 -m json.tool variables.json > /dev/null
    ```

1. Сопоставьте количество выгруженных записей с ожидаемым. Пустой JSON-объект `{}` допустим только в том случае, если в базе действительно нет соответствующих настроек. Для проверки переноса восстановите копию в подготовленном кластере и проверьте использующие ее DAG до удаления исходного кластера.

## Восстановить настройки {#restore}

1. [Создайте целевой кластер](create-cluster.md), установите нужные [providers и зависимости](edit-cluster.md#console-dependencies) и дождитесь `Ready`. Найдите его под API server [так же, как для исходного кластера](#before-you-begin). В следующих командах используйте пространство имен и под именно целевого кластера.
1. Из локального каталога с копией передайте JSON-файлы в под:

    ```bash
    kubectl exec -i <под_целевого_кластера> -n <пространство_имен> \
      -c api-server -- sh -c 'umask 077; cat > /tmp/airflow-connections.json' < connections.json
    kubectl exec -i <под_целевого_кластера> -n <пространство_имен> \
      -c api-server -- sh -c 'umask 077; cat > /tmp/airflow-variables.json' < variables.json
    ```

1. Импортируйте настройки:

    ```bash
    kubectl exec <под_целевого_кластера> -n <пространство_имен> \
      -c api-server -- airflow connections import /tmp/airflow-connections.json
    kubectl exec <под_целевого_кластера> -n <пространство_имен> \
      -c api-server -- airflow variables import \
      --action-on-existing-key skip /tmp/airflow-variables.json
    ```

    Эти команды сохраняют существующие записи при совпадении идентификаторов. Прочитайте результат импорта: отдельные записи могут быть пропущены или завершиться ошибкой. Если требуется намеренно заменить существующие настройки, предварительно сохраните их, затем используйте `--overwrite` для Connections и `--action-on-existing-key overwrite` для Variables.

1. В веб-интерфейсе целевого кластера откройте **Admin** → **Connections** и **Admin** → **Variables**. Проверьте наличие нужных идентификаторов. [Загрузите DAG](upload-dags.md) и выполните проверочный запуск, чтобы подтвердить доступ к внешним системам и чтение переменных.
1. После импорта удалите временные файлы из пода:

    ```bash
    kubectl exec <под_целевого_кластера> -n <пространство_имен> \
      -c api-server -- rm /tmp/airflow-connections.json /tmp/airflow-variables.json
    ```

Храните локальную копию в соответствии с правилами вашей организации. Подробнее о командах — в [справочнике CLI Apache Airflow™](https://airflow.apache.org/docs/apache-airflow/3.1.8/cli-and-env-variables-ref.html#connections).