Apache Airflow: Airflow s3 connection using UI
Ты заходишь в Airflow UI, чтобы добавить S3 коннектор, и понимаешь — интерфейс намекает, что ты должен уже знать, как он работает. Поля Host, Schema, Login смот
Ты заходишь в Airflow UI, чтобы добавить S3 коннектор, и понимаешь — интерфейс намекает, что ты должен уже знать, как он работает. Поля Host, Schema, Login смотрят на тебя пустотой, а в документации лишь намёки. Знакомо? Это обычный день.
Дело не в тебе. UI для коннекторов и правда сделан для тех, кто уже в теме. Но разобраться — дело пяти минут.
Быстрый ответ (TLDR)
Создаёшь новый коннектор. Заполняешь так:
Conn Id: my_conn_S3 (или любое имя, которое будешь использовать в коде)
Conn Type: S3
Extra: Всё самое важное летит сюда одним JSON-объектом.
{"aws_access_key_id":"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"}
Поля Host, Schema, Login, Port — оставляешь пустыми. Сохраняешь. Работает.
Подробно и по шагам
Идёшь в Admin -> Connections. Жмёшь +.
В форме вводишь Conn Id. Это твой уникальный ключ для доступа к этому коннекту из дага. Выбираешь S3 из выпадающего списка Conn Type.
А теперь главный трюк. Поле Extra — это не просто текстовое поле. Это JSON, куда складываются все специфичные для коннекта параметры. Для S3 это твои AWS ключи.
Копируешь JSON из примера выше, подставляешь свои aws_access_key_id и aws_secret_access_key. Всё остальное в форме можно игнорировать.
А как это потом использовать?
В коде дага просто ссылаешься на conn_id. Например, в сенсоре или операторе.
from airflow.providers.amazon.aws.sensors.s3 import S3KeySensor
s3_sensor = S3KeySensor(
task_id='check_s3_for_file',
bucket_name='my-data-bucket',
bucket_key='data/*.csv',
aws_conn_id='my_conn_S3', # Вот он, наш conn_id
timeout=18*60*60,
poke_interval=120,
)
Запускаешь даг — он будет использовать ключи из коннектора для доступа к бакету.
Но это же небезопасно?
Да, и это критически важный момент. Способ выше хранит секретный ключ в открытом виде в базе Airflow. Для продакшена это не лучшая практика.
Поэтому лучший путь — использовать поля Login и Password в той же форме коннектора. В Login кладёшь aws_access_key_id, в Password — aws_secret_access_key. Поле Extra оставляешь пустым или используешь для других параметров, например {"region_name": "us-east-1"}.
Система так же сработает, но это уже чуть безопаснее, так как поле Password в интерфейсе маскируется. В идеале — использовать внешние системы для секретов, вроде HashiCorp Vault или облачных KMS, но это уже тема для отдельного разговора.
Итог
S3-коннектор настраивается через поле Extra или через связку Login/Password. UI недружелюбен, но логичен. Главное — понять принцип: общие данные в основные поля, специфичные для провайдера — в Extra JSON.
Проверяешь коннекцию простым дагом-сенсором. Если не работает — смотри логи шедулера. И помни про безопасность — открытый секретный ключ в базе это как оставить ключи от склада под ковриком.