Использование секрета Yandex Lockbox в PySpark-задании для подключения к Yandex Managed Service for PostgreSQL
Вы можете использовать секрет Yandex Lockbox для подключения к кластеру Yandex Managed Service for PostgreSQL из PySpark-задания в Yandex Managed Service for Apache Spark™. Для этого сервисному аккаунту кластера Yandex Managed Service for Apache Spark™ необходимо предоставить доступ к секрету. Секрет создается сервисом Yandex Connection Manager автоматически при создании пользователя Managed Service for PostgreSQL.
Для PySpark-задания используется Python-скрипт, который хранится в бакете Yandex Object Storage. Скрипт получает пароль пользователя из секрета и использует его для подключения к кластеру Managed Service for PostgreSQL.
Чтобы получить информацию из секрета и подключиться к кластеру Managed Service for PostgreSQL, выполните следующие действия:
- Подготовьте инфраструктуру.
- Настройте права доступа к секрету пользователя.
- Подготовьте PySpark-задание.
- Запустите задание и проверьте результат.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVEилиTRIAL_ACTIVE. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
- Кластер Yandex Managed Service for Apache Spark™: вычислительные ресурсы компонентов кластера (см. тарифы Yandex Managed Service for Apache Spark™).
- Кластер Managed Service for PostgreSQL: использование выделенных хостам вычислительных ресурсов, объем хранилища и резервных копий (см. тарифы Managed Service for PostgreSQL).
- Бакет Object Storage: использование хранилища и выполнение операций с данными (см. тарифы Object Storage).
- NAT-шлюз: почасовое использование шлюза и исходящий через него трафик (см. тарифы Virtual Private Cloud).
- Публичные IP-адреса, если для хостов кластера включен публичный доступ (см. тарифы Virtual Private Cloud).
Использование секретов Yandex Lockbox, созданных с помощью Connection Manager, не тарифицируется.
Подготовьте инфраструктуру
-
Создайте сервисный аккаунт
spark-agentи назначьте ему роли:- managed-spark.integrationProvider — для взаимодействия Yandex Managed Service for Apache Spark™ с другими сервисами;
- storage.editor — для доступа к файлу с PySpark-заданием в бакете Object Storage.
-
Предоставьте разрешение
READдля сервисного аккаунтаspark-agentна созданный бакет. -
Создайте облачную сеть с именем
spark-network.Вместе с ней автоматически будут созданы три подсети в разных зонах доступности.
-
В сети
spark-networkсоздайте группу безопасностиspark-sgдля кластера Yandex Managed Service for Apache Spark™, разрешающую исходящие TCP-подключения:- на порт
6432для подключения к PostgreSQL; - на порт
443для скачивания Maven-пакетов.
- на порт
-
В сети
spark-networkсоздайте группу безопасностиpg-sgдля кластера Managed Service for PostgreSQL, разрешающую входящие TCP-подключения на порт6432. -
Создайте кластер Yandex Managed Service for Apache Spark™ со следующими настройками:
- Сервисный аккаунт —
spark-agent. - Сеть —
spark-network. - Группа безопасности —
spark-sg.
- Сервисный аккаунт —
-
Настройте NAT-шлюз для подсети, в которой создан кластер Yandex Managed Service for Apache Spark™. NAT-шлюз нужен для скачивания JDBC-драйвера PostgreSQL из Maven-репозитория.
-
Создайте кластер Managed Service for PostgreSQL со следующими настройками:
- Сеть —
spark-network. - Группа безопасности —
pg-sg.
- Сеть —
Настройте права доступа к секрету пользователя Managed Service for PostgreSQL
-
В консоли управления
перейдите в каталог, в котором создана необходимая инфраструктура. -
Перейдите в сервис Managed Service for PostgreSQL.
-
Нажмите на имя нужного кластера и выберите вкладку Пользователи.
-
Нажмите на идентификатор подключения в строке нужного пользователя.
Откроется страница подключения Connection Manager для выбранного пользователя.
-
На открывшейся странице нажмите на идентификатор секрета.
Откроется страница секрета Yandex Lockbox, который хранит пароль пользователя PostgreSQL.
-
На панели слева выберите раздел
Права доступа и нажмите кнопку Назначить роли. -
Выберите сервисный аккаунт
spark-agent, которому будет предоставлен доступ к секрету. -
Нажмите кнопку
Добавить роль и выберитеlockbox.payloadViewer. -
Нажмите кнопку Сохранить.
Если у вас еще нет интерфейса командной строки Yandex Cloud (CLI), установите и инициализируйте его.
По умолчанию используется каталог, указанный при создании профиля CLI. Чтобы изменить каталог по умолчанию, используйте команду yc config set folder-id <идентификатор_каталога>. Также для любой команды вы можете указать другой каталог с помощью параметров --folder-name или --folder-id.
Чтобы настроить права доступа к секрету пользователя Managed Service for PostgreSQL:
-
Получите идентификатор секрета из подключения Connection Manager:
yc metadata-hub connection-manager connection list \ --mdb-cluster-id <идентификатор_кластера_PostgreSQL>Идентификатор кластера можно получить со списком кластеров в каталоге.
-
Настройте права доступа к секрету пользователя:
yc lockbox secret add-access-binding <идентификатор_секрета> \ --role lockbox.payloadViewer \ --service-account-name spark-agentСервисному аккаунту
spark-agentбудет предоставлен доступ к секрету пользователя Managed Service for PostgreSQL.
Подготовьте PySpark-задание
-
Создайте локально файл с именем
job-mpg-connection-with-secret.pyи скопируйте в него скрипт:job-mpg-connection-with-secret.py
import json import os import urllib.request from pyspark.sql import SparkSession def get_secret(secret_id: str) -> dict: """Получение секрета из Yandex Lockbox.""" # Получение IAM-токена через metadata service metadata_host = os.environ.get("YC_METADATA_ADDR", "169.254.169.254") token_url = f"http://{metadata_host}/computeMetadata/v1/instance/service-accounts/default/token" req = urllib.request.Request(token_url) req.add_header("Metadata-Flavor", "Google") with urllib.request.urlopen(req, timeout=10) as resp: token = json.loads(resp.read())["access_token"] # Получение секрета Yandex Lockbox secret_url = f"https://payload.lockbox.api.cloud.yandex.net/lockbox/v1/secrets/{secret_id}/payload" req = urllib.request.Request(secret_url) req.add_header("Authorization", f"Bearer {token}") with urllib.request.urlopen(req, timeout=30) as resp: payload = json.loads(resp.read()) return {e["key"]: e["textValue"] for e in payload["entries"]} # Использование функции получения секрета secrets = get_secret("<идентификатор_секрета>") # Инициализация Spark сессии spark = SparkSession.builder.appName("db-reader").getOrCreate() # Подключение к кластеру Managed Service for PostgreSQL df = spark.read \ .format("jdbc") \ .option("url", f"jdbc:postgresql://<FQDN_хоста>:6432/<имя_БД>") \ .option("driver", "org.postgresql.Driver") \ .option("user", "<имя_пользователя>") \ .option("password", secrets["postgresql_password"]) \ .option("dbtable", "<имя_таблицы>") \ .load() # Вывод первых 20 строк таблицы df.show() -
Укажите в файле скрипта следующие параметры:
- идентификатор секрета;
- FQDN хоста для подключения к кластеру Managed Service for PostgreSQL;
- имя базы данных;
- имя таблицы.
Запустите задание и проверьте результат
-
Загрузите в бакет файл
job-mpg-connection-with-secret.py. -
В кластере Yandex Managed Service for Apache Spark™ создайте задание со следующими параметрами:
- Тип задания — PySpark.
- Main python файл –
s3a://<имя_бакета>/job-mpg-connection-with-secret.py. - Пакеты —
org.postgresql:postgresql:42.7.3.
-
Дождитесь, когда созданное PySpark-задание перейдет в статус Done.
-
Получите логи выполнения задания.
В логах задания будет показан вывод строк таблицы, указанной в скрипте.
-
Загрузите в бакет файл
job-mpg-connection-with-secret.py:yc storage s3api put-object \ --body <путь_к_локальному_файлу> \ --bucket <имя_бакета> \ --key "job-mpg-connection-with-secret.py" -
Запустите задание:
yc managed-spark job create-pyspark \ --cluster-id <идентификатор_кластера> \ --name "<имя_задания>" \ --main-python-file-uri s3a://<имя_бакета>/job-mpg-connection-with-secret.py \ --packages org.postgresql:postgresql:42.7.3Идентификатор кластера можно получить со списком кластеров в каталоге.
Команда вернет идентификатор задания. Сохраните его, он понадобится для получения логов выполнения задания.
-
Получите логи выполнения задания:
yc managed-spark job log <идентификатор_задания> \ --cluster-id <идентификатор_кластера>В логах задания будет показан вывод строк таблицы, указанной в скрипте.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать: