Объединение sql_alchemy_conn_cmd воздушного потока (в файле airflow.cfg) с аутентификацией базы данных AWS IAM - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь объединить аутентификацию базы данных IAM (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html) с sql_alchemy_conn_cmd Airflow (https://airflow.apache.org/howto/set-config.html#)) со сценарием оболочки подключения, чтобы попытаться защитить соединение.

connect.sh

#!/bin/bash
token=`aws rds generate-db-auth-token --hostname  an_rds_endpoint --port 3306 --region us-east-1 --username airflow`
url=“mysql://airflow:'$token'@an_rds_endpoint/airflow”
sed  "s/%/%%/g" <<< "$url”

В настоящее время у меня есть экземпляр EC2 с инструментами mysql dev, успешно подключающимися к базе данных RDS MySQL с помощью аутентификации IAM DB с помощью этих шагов (https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.AWSCLI.html)

Проблема, с которой я столкнулся, заключается в том, что я получаю следующую ошибку:

super(Connection, self).__init__(*args, **kwargs2)
OperationalError: (OperationalError) (1045, "Access denied for user ‘airflow’@‘ip_address_of_ec2_instance’ (using password: YES)")

… после того, как я попытаюсь запустить initdb воздушного потока с моим sql_alchemy_conn_cmd = connect.sh в моем файле airflow.cfg.

Мое первоначальное предположение состоит в том, что проблема заключается в кодировании «безумно многословного токена, генерируемого AWS», но мне было интересно, пошел ли кто-нибудь еще по этому пути и может ли он помочь.

Это часть токена, которыйдля справки.

rdsmysql.cdgmuqiadpid.us-west-2.rds.amazonaws.com:3306/?Action=connect&DBUser=jane_doe&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Expires=900...

1 Ответ

0 голосов
/ 30 октября 2018

Мои первоначальные предположения состоят в том, что одинарные кавычки не помогают с токеном, но, возможно, они необходимы, я не очень разбираюсь в использовании токенов.

Моя вторая проблема с connect.sh - этосинтаксис тройного угла HEREDOC.Я думаю, что вы хотите:

- sed  "s/%/%%/g" <<< "$url”
+ sed  "s/%/%%/g" << "$url”

Но, возможно, вы только что сделали опечатку в StackOverflow, потому что это не поможет вам установить соединение.

Так что может быть еще несколько вещей: выне следует обращать внимание на то, что вы специально предоставили доступ пользователю airflow и что это пользователь, которого вы используете с инструментами mysql (который работает).

Планировщик и веб-сервер могут устанавливать несколько соединений с БД.поскольку они зацикливаются на файлах, чтобы заполнить пакет dag (iirc - это одно соединение на файл, проанализированный, что происходит в цикле как можно чаще).AWS говорит, что этот токен не работает для большого количества соединений.

Токен ограничен по времени, но он вам нужен для пары длительных процессов и рабочих тоже (они устанавливают новое соединение для каждогозадание выполнено).Но это должно работать как минимум для команды initdb.

Хорошая новость заключается в том, что connect.sh выполняется, и вы получаете сообщение об ошибке от MySQL.

Возможнодобавьте небольшую отладку:

sed  "s/%/%%/g" << "$url” | tee debug_connect_sh.txt

Затем отредактируйте airflow.cfg с этим выводом, назначенным на sql_alchemy_conn, немного (удаляя sql_alchemy_conn_cmd), и повторите попытку airflow initdb, пока вы не сможете вычислитьиз того, что плохо разбирается в строке подключения.Затем вернитесь назад, чтобы исправить connect.sh.Пожалуйста, поделитесь результатами.

...