Как программно настроить ведение журнала Airflow 1.10 с конечной точкой localstack s3?

Пытаясь настроить ведение журнала воздушного потока в бакеты s3 localstack для локальных сред и сред разработки kubernetes, я следую документация по воздушному потоку для входа в s3. Чтобы дать небольшой контекст, localstack - это локальный облачный стек AWS с сервисами AWS, включая s3, работающими локально.

Я добавил следующие переменные среды в свои контейнеры с воздушным потоком аналогично этому другому Сообщение о переполнении стека при попытке войти в мои локальные ведра s3. Вот что я добавил в docker-compose.yaml для всех контейнеров с воздушным потоком:

       - AIRFLOW__CORE__REMOTE_LOGGING=True
       - AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://local-airflow-logs
       - AIRFLOW__CORE__REMOTE_LOG_CONN_ID=MyS3Conn
       - AIRFLOW__CORE__ENCRYPT_S3_LOGS=False

Я также добавил свои кредиты s3 localstack в airflow.cfg

[MyS3Conn]
aws_access_key_id = foo
aws_secret_access_key = bar
aws_default_region = us-east-1
host = http://localstack:4572    # s3 port. not sure if this is right place for it 

Кроме того, я установил apache-airflow [hooks] и apache-airflow [s3], хотя неясно, какой из них действительно нужен, исходя из документация.

Я выполнил шаги из предыдущего сообщения о переполнении стека, пытаясь проверить, S3Hook может писать в мой экземпляр s3 localstack:

from airflow.hooks import S3Hook
s3 = S3Hook(aws_conn_id='MyS3Conn')
s3.load_string('test','test',bucket_name='local-airflow-logs')

Но я получаю botocore.exceptions.NoCredentialsError: Unable to locate credentials.

После добавления учетных данных в консоль воздушного потока под /admin/connection/edit, как показано:  введите описание изображения здесь это новое исключение, возвращается botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.. Другие люди сталкивались с этой же проблемой, и это могло быть связано с сетью.

Тем не менее, требуется программная настройка, а не ручная.

Мне удалось получить доступ к корзине с помощью автономного скрипта Python (явно вводя учетные данные AWS с помощью boto), но он должен работать как часть воздушного потока.

Есть ли правильный способ настроить хост / порт / учетные данные для S3Hook, добавив MyS3Conn к airflow.cfg?

На основе исходного кода airflow s3 hooks, похоже, что пользовательский URL-адрес s3 еще не поддерживается Airflow. Однако на основе потока воздуха source code (родительский) кажется, что должна быть возможность установить endpoint_url, включая порт, и он должен быть прочитан из airflow.cfg.

Я могу проверять и записывать в свою корзину s3 в localstack, используя только boto. Кроме того, curl http://localstack:4572/local-mochi-airflow-logs возвращает содержимое ведра из контейнера воздушного потока. И aws --endpoint-url=http://localhost:4572 s3 ls возвращает Could not connect to the endpoint URL: "http://localhost:4572/".

Какие еще шаги могут потребоваться для входа в ведра localstack s3 из воздушного потока, запущенного в докере, с автоматической настройкой, и поддерживается ли это еще?


person oasisPolo    schedule 16.02.2020    source источник


Ответы (1)


Я думаю, вы должны использовать localhost, а не localstack для конечной точки, например. host = http://localhost:4572.

В Airflow 1.10 вы можете переопределить конечную точку для каждого соединения, но, к сожалению, он поддерживает только одну конечную точку за раз, поэтому вы можете изменить ее для всех хуков AWS, использующих соединение. Чтобы переопределить его, отредактируйте соответствующее соединение и в поле «Дополнительно» введите:

{"host": "http://localhost:4572"}

Я верю, что это исправит?

person Diego    schedule 31.03.2020
comment
Это помогло мне решить проблему с другим провайдером. - person Alexander Bogushov; 28.05.2020