DAG Rusak: [/airflow/dags/a.py] Tidak dapat mendekripsi parameter `ekstra` untuk login=Tidak ada, konfigurasi FERNET_KEY tidak ada

Saya memulai Airflow tanpa FERNET_KEY. Setelah saya menyadarinya, saya melakukan hal berikut: https://airflow.apache.org/configuration.html#connections

pip install apache-airflow[crypto]

from cryptography.fernet import Fernet
fernet_key= Fernet.generate_key()
print(fernet_key)

mengambil kunci dan meletakkannya di airflow.cfg lalu memanggil airflow initdb, tetapi kesalahan masih muncul.

Apa yang saya lakukan salah?

Ketika saya melakukannya:

airflow webserver -D

Saya mendapat:

  File "/usr/local/lib/python2.7/dist-packages/airflow/models.py", line 713, in extra_dejson
    if self.extra:
  File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/attributes.py", line 293, in __get__
    return self.descriptor.__get__(instance, owner)
  File "/usr/local/lib/python2.7/dist-packages/airflow/models.py", line 632, in get_extra
    return fernet.decrypt(bytes(self._extra, 'utf-8')).decode()
  File "/usr/lib/python2.7/dist-packages/cryptography/fernet.py", line 101, in decrypt
    raise InvalidToken

Log menunjukkan bahwa ada masalah dengan kode ini:

def get_conn(conn_id, session=None):
    conn = (session.query(Connection)
                   .filter(Connection.conn_id == conn_id)
                   .first())
    return conn


def my_python_function():
   conn = get_conn('s3connection')
   key_id = conn.extra_dejson.get('aws_access_key_id')
   secret_key = conn.extra_dejson.get('aws_secret_access_key')
   default_region = conn.extra_dejson.get('region_name')
   return key_id,secret_key,default_region

person jack    schedule 13.06.2018    source sumber
comment
Apakah Anda membuat perubahan apa pun pada kunci fernet setelah pertama kali menambahkannya ke airflow.cfg?   -  person cwurtz    schedule 13.06.2018
comment
@CJWurtz Ini DAG pertama yang saya makan siang. Setelah saya menginstal aliran udara dan mengunggah DAG saya mendapat pesan serupa. Kemudian saya membuat modifikasi yang tercantum dalam pertanyaan.   -  person jack    schedule 13.06.2018
comment
@ tobi6 dokumen mengatakan Jika paket crypto tidak diinstal pada awalnya, Anda masih dapat mengaktifkan enkripsi untuk koneksi dengan mengikuti langkah-langkah di bawah ini sehingga ada cara untuk mengatasinya. Setelah saya menginstalnya, saya menghapus koneksi dan membuatnya kembali. Masih tidak berhasil. Apa lagi yang bisa saya lakukan?   -  person jack    schedule 13.06.2018
comment
@tobi6 tanpa tanda kutip.. Sebenarnya ada kunci sebelumnya di sana (tidak tahu dari mana) saya cukup menggantinya. Tidak ada tanda kutip dan tidak ada tanda kutip tunggal.   -  person jack    schedule 13.06.2018
comment
@ tobi6 Masalahnya adalah bagian 6 mengatakan Restart server web AirFlow. Tapi saya tidak bisa me-restart server karena kesalahan python   -  person jack    schedule 13.06.2018
comment
@tobi6 tidak mengubah pengkodean apa pun. Sekali lagi, saya membuat kunci hanya sekali.. setelah kesalahan muncul... Tetapi file cfg memiliki nilai di sana sebelumnya.   -  person jack    schedule 13.06.2018


Jawaban (5)


Aliran udara biasanya menghasilkan satu untuk Anda.

Berikut ini contohnya:

$ python
>>> from cryptography.fernet import Fernet
>>> k=Fernet.generate_key()
>>> print(k)
Z6BkzaWcF7r5cC-VMAumjpBpudSyjGskQ0ObquGJhG0=
>>> ^D
$ $EDITOR $AIRFLOW_HOME/airflow.cfg

Ada perubahan:

# Secret key to save connection passwords in the db
fernet_key = cryptography_not_found_storing_passwords_in_plain_text

to:

# Secret key to save connection passwords in the db
fernet_key = Z6BkzaWcF7r5cC-VMAumjpBpudSyjGskQ0ObquGJhG0=

Periksa apakah sudah disetel seperti yang diharapkan (atau akan menghasilkan yang acak setiap kali)

$ python
Python 2.7.13 (default, Jul 18 2017, 09:17:00)
[GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from airflow import configuration as conf
[2018-06-14 17:53:36,200] {__init__.py:57} INFO - Using executor SequentialExecutor
>>> conf.get('core','fernet_key')
'Z6BkzaWcF7r5cC-VMAumjpBpudSyjGskQ0ObquGJhG0='
>>>

Sintaks di atas seharusnya v1.9.0 & v1.8.2 [diperbaiki], saya sudah memeriksa ulang ini dengan yang terakhir.

Setiap kali Anda mengubah kunci fernet, Anda perlu menghapus semua koneksi dan variabel yang menggunakan enkripsi, karena tidak akan didekripsi lagi.

Anda dapat mengatur ulang db Anda, tetapi itu mungkin berlebihan.

person dlamblin    schedule 14.06.2018
comment
Ketika saya melakukan c=AirflowConfigParser(default_config=AIRFLOW_CONFIG) saya mendapatkan : TypeError: __init__() got an unexpected keyword argument 'default_config' - person jack; 14.06.2018
comment
Juga $EDITOR $AIRFLOW_HOME/airflow.cfg tidak berhasil untuk saya. Saya harus melakukan cd airflow dan kemudian nano airflow.cfg - person jack; 14.06.2018
comment
@jack Ya, Anda dapat memilih editor Anda. Jika Anda membaca man man dan man crontab Anda akan melihat bahwa posix merekomendasikan untuk menyetel EDITOR sama dengan jalur ke editor favorit Anda. Kesalahan saya pada default_config, itu postingan v1.9.0. Jadi sebenarnya Anda menginginkan pembaruan yang saya buat di atas. - person dlamblin; 14.06.2018
comment
Bekerja dengan 1.10 juga. Terima kasih! - person Leo; 22.10.2018

Menggunakan Fernet, Airflow mengenkripsi semua kata sandi untuk koneksinya di database backend.

Dalam kasus Anda, backend Airflow menggunakan kunci fernet sebelumnya dan Anda telah membuat kunci yang digunakan untuk membuat koneksi baru.

Rekomendasi saya adalah melakukan hal berikut Pertama,

airflow resetdb

ini akan membantu menghapus semua catatan yang ada di db backend Anda.

Kemudian,

airflow initdb

ini akan menginisialisasi backend seperti baru.

Kemudian mulai server web aliran udara dan penjadwal

airflow web server -p {port}
airflow scheduler

Kemudian buat koneksi s3 baru di UI (ekstra - {"aws_access_key_id":"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"})

Sekarang Anda seharusnya dapat menguji pengamat file s3 dengan mengikuti solusi dari - Koneksi Airflow s3 menggunakan UI

person shyam    schedule 11.09.2018

Ini juga dapat terjadi jika Anda menjalankan scheduler dan webserver di container Docker terpisah tanpa konfigurasi bersama. Setiap kontainer akan menghasilkan kunci fernetnya sendiri yang berarti mereka tidak dapat memecahkan kode rahasia satu sama lain.

Dalam hal ini Anda dapat:

  • gunakan AIRFLOW__CORE__FERNET_KEY env var untuk menyetel kunci secara eksplisit untuk kedua container
  • atur volume untuk membagikan file konfigurasi antar kontainer
  • jalankan kedua proses dalam satu wadah
person Tamlyn    schedule 11.11.2020
comment
python3 -c dari kriptografi.fernet import Fernet; cetak(Fernet.generate_key()) - person Kernelv5; 14.11.2020
comment
Saya menggunakan perintah ini untuk menghasilkan kunci. Sebelumnya saya mengetik sesuatu secara acak sebagai kunci tetapi tidak berhasil. - person Kernelv5; 14.11.2020
comment
python3 -c dari kriptografi.fernet import Fernet; cetak(Fernet.generate_key().decode()) - person Kernelv5; 14.11.2020
comment
Perintah ini untuk memeriksa Fernet berfungsi dengan baik atau terpasang - person Kernelv5; 14.11.2020

Jika Anda memulai aliran udara tanpa kunci fernet, koneksi apa pun tidak akan dienkripsi.

Jika Anda memiliki kunci fernet, menambahkan/mengedit koneksi apa pun, koneksi tersebut akan dienkripsi dengan kunci tersebut. Jika Anda mengubah kunci dengan cara apa pun, koneksi tersebut tidak akan dapat didekripsi. Jika saat ini Anda memiliki koneksi yang dienkripsi dengan kunci fernet yang berbeda, satu-satunya solusi adalah memigrasikan kunci yang dibuat dengan satu kunci ke yang lain. Atau hapus saja dan buat kembali dengan asumsi Anda masih memiliki nilainya.

person cwurtz    schedule 13.06.2018
comment
Saya hanya memiliki 1 koneksi. Saya menghapusnya dan memulai kembali... Tapi tetap saja - tidak berhasil. Ada centang pada Is Extra Encrypted tetapi tidak pada Is Encrypted - person jack; 13.06.2018
comment
CJ jika apa yang Anda katakan akan menjadi solusinya maka menghapus semua koneksi dan mendefinisikannya kembali seharusnya bisa menyelesaikannya. Tapi ternyata tidak. Saya juga tidak mengerti apa sebenarnya yang dienkripsi... Menurut saya enkripsi itu sendiri tidak berfungsi sehingga dekripsi juga tidak berfungsi. - person jack; 13.06.2018
comment
Bidang kata sandi dan bidang tambahan masing-masing dienkripsi secara terpisah. Jika Is Encrypted tidak dicentang dan Extra Ecnrypted dicentang, itu berarti kata sandi tidak dienkripsi, tetapi kata sandi tambahannya dienkripsi. Enkripsi dalam aliran udara pasti berfungsi. - person cwurtz; 13.06.2018
comment
Mungkin mencoba kunci fernet yang sangat sederhana, seperti pengujian, menambahkan koneksi menggunakannya dan melihat apakah Anda mendapatkan kesalahan yang sama. Mungkin masalahnya ada pada karakter kunci fernet yang Anda gunakan. - person cwurtz; 13.06.2018
comment
Saya tidak melakukan EXPORT AIRFLOW__CORE__FERNET_KEY = your_fernet_key karena kata dokter Alternatifnya, mungkinkah ini? - person jack; 13.06.2018
comment
Di airflow, ketika mencoba untuk mendapatkan variabel konfigurasi, pertama-tama ia akan memeriksa var ENV, diikuti dengan airflow.cnf, lalu perintah args, dan terakhir default. Anda tidak perlu menyetelnya dengan mengekspor var ENV jika Anda memilikinya di airflow.cfg. - person cwurtz; 13.06.2018
comment
sejujurnya saya tidak mengerti masalah ini. Saya membuat kunci baru. menghapus semua koneksi. menyelamatkan mereka lagi. Kenapa ini terus terjadi?! Saya melihat modul kembali: return Fernet(configuration.get('core', 'FERNET_KEY').encode('utf-8')) airflow.apache.org/_modules/airflow/models.html bagaimana cara memeriksa mengapa baris ini tidak berfungsi? - person jack; 13.06.2018
comment
Cara termudah untuk memeriksanya adalah dengan mengambil nilai koneksi dari database, buka jendela konsol python, salin dan tempel metode get_fernet() tanpa AirflowException (atau impor juga), dan coba jalankan decode fernet dengan nilai dari db . Jalankan saja setiap perintah langkah demi langkah dan lihat di mana sesuatu yang tidak terduga terjadi - person cwurtz; 13.06.2018
comment
NameError: nama 'get_fernet' tidak ditentukan - person jack; 13.06.2018
comment
Anda ingin menyalin dan menempelkannya dari models.py aliran udara dengan mengambil bagian yang Anda perlukan untuk membuat objek Fernet - person cwurtz; 13.06.2018
comment
Saya memiliki objek FERNET. sekarang apa? - person jack; 13.06.2018
comment
Saya katakan salin dan tempel, sehingga Anda dapat memodifikasi fungsinya jika perlu untuk melakukan debug. Namun jika Anda menempuh rute itu, Anda perlu melakukan from airflow.models import get_fernet. Pada dasarnya cukup lacak rute yang dilalui aliran udara saat berjalan get_extra(), meneruskan apa yang Anda perlukan untuk mendekripsi dari nilai mentah dari db - person cwurtz; 13.06.2018
comment
Ketika saya melakukannya: print Fernet(configuration.get('core', 'FERNET_KEY').encode('utf-8')).__encryption_key Saya melihat: ▒▒0▒8▒▒[Ƞ/I▒9 - person jack; 13.06.2018
comment
Masalahnya mungkin ada pada enkripsi itu sendiri? Ketika saya memeriksa Koneksi UI saya tidak melihat apa pun yang dienkripsi di sana. - person jack; 13.06.2018
comment
Jika configuration.get('core', 'FERNET_KEY').encode('utf-8') cocok dengan apa yang telah Anda konfigurasi, maka itu seharusnya benar. Tidak yakin apakah stackoverflow memformat karakter tidak, saya melakukan hal yang sama secara lokal dan memiliki b'\xad\x9e9l\x97\xe9\xd4\x1fF4Y"\t\xfcLj'. Saya akan melanjutkan dengan mencoba menggunakan objek Fernet Anda untuk memecahkan kode nilai dari db - person cwurtz; 13.06.2018

Pastikan untuk menempatkan kunci fernet terlebih dahulu dan kemudian jalankan perintah berikut:

airflow initdb

Jika masalah masih berlanjut, hapus semua tabel dari database lalu jalankan kembali perintah:

airflow initdb
person Ankit Adlakha    schedule 05.07.2019