DAG ที่เสียหาย: [/airflow/dags/a.py] ไม่สามารถถอดรหัสพารามิเตอร์ 'พิเศษ' สำหรับการเข้าสู่ระบบ = ไม่มี การกำหนดค่า FERNET_KEY หายไป

ฉันเริ่ม Airflow โดยไม่มี FERNET_KEY เมื่อฉันตระหนักได้ ฉันก็ทำสิ่งต่อไปนี้: 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)

หยิบกุญแจไปวางไว้ที่ airflow.cfg แล้วเรียก airflow initdb แต่ข้อผิดพลาดยังคงปรากฏ

ผมทำอะไรผิดหรือเปล่า?

เมื่อฉันทำ:

airflow webserver -D

ฉันเข้าใจ:

  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

บันทึกระบุว่ามีปัญหากับรหัสนี้:

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 แหล่งที่มา
comment
คุณได้ทำการเปลี่ยนแปลงใดๆ กับคีย์ fernet หลังจากเพิ่มลงใน airflow.cfg เป็นครั้งแรกหรือไม่   -  person cwurtz    schedule 13.06.2018
comment
@CJWurtz นี่เป็น DAG แรกที่ฉันทานอาหารกลางวัน หลังจากที่ฉันติดตั้ง Airflow และอัปโหลด DAG ฉันก็ได้รับข้อความที่คล้ายกัน จากนั้นฉันก็ทำการแก้ไขตามรายการในคำถาม   -  person jack    schedule 13.06.2018
comment
@ tobi6 เอกสารบอกว่าหากไม่ได้ติดตั้งแพ็คเกจ crypto ในตอนแรก คุณยังคงสามารถเปิดใช้งานการเข้ารหัสสำหรับการเชื่อมต่อโดยทำตามขั้นตอนด้านล่างเพื่อให้มีวิธีแก้ไข หลังจากที่ฉันติดตั้ง ฉันได้ลบการเชื่อมต่อและสร้างใหม่ ยังไม่ได้ผล ฉันจะทำอะไรได้อีก?   -  person jack    schedule 13.06.2018
comment
@ tobi6 ไม่มีเครื่องหมายคำพูด .. จริงๆ แล้วมีคีย์ก่อนหน้าอยู่ที่นั่น (ไม่รู้ว่ามาจากไหน) ฉันแค่แทนที่มัน ไม่มีเครื่องหมายคำพูดและไม่มีเครื่องหมายคำพูดเดี่ยว   -  person jack    schedule 13.06.2018
comment
@ tobi6 ปัญหาคือส่วนที่ 6 บอกว่ารีสตาร์ทเว็บเซิร์ฟเวอร์ AirFlow แต่ฉันไม่สามารถรีสตาร์ทเซิร์ฟเวอร์ได้เนื่องจากข้อผิดพลาดของ Python   -  person jack    schedule 13.06.2018
comment
@ tobi6 ไม่ได้เปลี่ยนการเข้ารหัสใด ๆ อีกครั้ง ฉันสร้างคีย์เพียงครั้งเดียว .. หลังจากเกิดข้อผิดพลาด... แต่ไฟล์ cfg มีค่าอยู่ที่นั่นก่อนหน้านี้   -  person jack    schedule 13.06.2018


คำตอบ (5)


โดยปกติแล้วการไหลเวียนของอากาศจะสร้างสิ่งหนึ่งขึ้นมาสำหรับคุณ

นี่คือตัวอย่าง:

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

มีการเปลี่ยนแปลง:

# 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=

ตรวจสอบว่าตั้งค่าตามที่คาดไว้หรือไม่ (หรือจะสร้างแบบสุ่มในแต่ละครั้ง)

$ 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='
>>>

ข้างต้นควรเป็นไวยากรณ์ v1.9.0 & v1.8.2 [แก้ไขแล้ว] ฉันได้ตรวจสอบสิ่งนี้อีกครั้งด้วยอันหลัง

เมื่อใดก็ตามที่คุณเปลี่ยนคีย์เฟอร์เน็ต คุณจะต้องลบการเชื่อมต่อและตัวแปรทั้งหมดที่ใช้การเข้ารหัส เนื่องจากจะไม่ถอดรหัสอีกต่อไป

คุณสามารถรีเซ็ตฐานข้อมูลของคุณได้ แต่นั่นอาจเป็นการกระทำที่มากเกินไป

person dlamblin    schedule 14.06.2018
comment
เมื่อฉันทำ c=AirflowConfigParser(default_config=AIRFLOW_CONFIG) ฉันจะได้รับ : TypeError: __init__() got an unexpected keyword argument 'default_config' - person jack; 14.06.2018
comment
นอกจากนี้ $EDITOR $AIRFLOW_HOME/airflow.cfg ไม่ได้ผลสำหรับฉัน ฉันต้องทำ cd airflow แล้วก็ nano airflow.cfg - person jack; 14.06.2018
comment
@jack ใช่ คุณสามารถเลือกโปรแกรมแก้ไขของคุณได้ หากคุณอ่าน man man และ man crontab คุณจะเห็นว่า posix แนะนำให้ตั้งค่า EDITOR ให้เท่ากับเส้นทางไปยังโปรแกรมแก้ไขที่คุณชื่นชอบ ความผิดพลาดของฉันใน default_config นั่นคือโพสต์ v1.9.0 จริงๆ แล้วคุณต้องการการอัปเดตที่ฉันทำข้างต้น - person dlamblin; 14.06.2018
comment
ใช้งานได้กับ 1.10 เช่นกัน ขอบคุณ! - person Leo; 22.10.2018

การใช้ Fernet ช่วยให้ Airflow เข้ารหัสรหัสผ่านทั้งหมดสำหรับการเชื่อมต่อในฐานข้อมูลแบ็กเอนด์

ในกรณีของคุณ แบ็กเอนด์ Airflow กำลังใช้คีย์เฟอร์เน็ตก่อนหน้า และคุณได้สร้างคีย์ที่ใช้ซึ่งคุณได้สร้างการเชื่อมต่อใหม่

คำแนะนำของฉันคือทำสิ่งต่อไปนี้ก่อน

airflow resetdb

สิ่งนี้จะช่วยในการลบบันทึกที่มีอยู่ในฐานข้อมูลแบ็กเอนด์ของคุณ

แล้ว,

airflow initdb

สิ่งนี้จะเริ่มต้นแบ็กเอนด์เหมือนใหม่

จากนั้นเริ่มเว็บเซิร์ฟเวอร์และตัวกำหนดเวลาของ airflow

airflow web server -p {port}
airflow scheduler

จากนั้นสร้างการเชื่อมต่อใหม่ของ s3 ใน UI (เพิ่มเติม - {"aws_access_key_id///"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"})

ตอนนี้คุณควรจะสามารถทดสอบตัวดูไฟล์ s3 ได้โดยทำตามวิธีแก้ปัญหาจาก - การเชื่อมต่อ Airflow s3 โดยใช้ UI

person shyam    schedule 11.09.2018

สิ่งนี้อาจเกิดขึ้นได้หากคุณมี scheduler และ webserver ทำงานในคอนเทนเนอร์ Docker แยกกันโดยไม่มีการกำหนดค่าที่ใช้ร่วมกัน แต่ละคอนเทนเนอร์จะสร้างคีย์เฟอร์เน็ตของตัวเอง ซึ่งหมายความว่าไม่สามารถถอดรหัสความลับของกันและกันได้

ในกรณีนี้ คุณสามารถ:

  • ใช้ AIRFLOW__CORE__FERNET_KEY env var เพื่อตั้งค่าคีย์สำหรับคอนเทนเนอร์ทั้งสองอย่างชัดเจน
  • ตั้งค่าวอลุ่มเพื่อแชร์ไฟล์กำหนดค่าระหว่างคอนเทนเนอร์
  • รันทั้งสองกระบวนการในคอนเทนเนอร์เดียว
person Tamlyn    schedule 11.11.2020
comment
python3 -c จาก cryptography.fernet นำเข้า Fernet; พิมพ์ (Fernet.generate_key()) - person Kernelv5; 14.11.2020
comment
ฉันใช้คำสั่งนี้เพื่อสร้างคีย์ ก่อนหน้านี้ฉันพิมพ์บางอย่างแบบสุ่มเป็นคีย์แต่ไม่ได้ผล - person Kernelv5; 14.11.2020
comment
python3 -c จาก cryptography.fernet นำเข้า Fernet; พิมพ์ (Fernet.generate_key().decode()) - person Kernelv5; 14.11.2020
comment
คำสั่งนี้เพื่อตรวจสอบ Fernet ทำงานได้ดีหรือติดตั้งแล้ว - person Kernelv5; 14.11.2020

หากคุณเริ่มการไหลเวียนของอากาศโดยไม่มีคีย์เฟอร์เน็ต จะไม่อนุญาตให้มีการเข้ารหัสการเชื่อมต่อใดๆ

หากคุณมีคีย์เฟอร์เน็ต เพิ่ม/แก้ไขการเชื่อมต่อใดๆ การเชื่อมต่อเหล่านั้นจะถูกเข้ารหัสด้วยคีย์นั้น หากคุณเปลี่ยนคีย์ในทางใดทางหนึ่ง การเชื่อมต่อเหล่านั้นจะไม่สามารถถอดรหัสได้ หากปัจจุบันคุณมีการเชื่อมต่อที่เข้ารหัสด้วยคีย์เฟอร์เน็ตที่แตกต่างกัน ทางออกเดียวคือการย้ายคีย์ที่สร้างด้วยคีย์หนึ่งไปยังอีกคีย์หนึ่ง หรือเพียงแค่ลบออกและสร้างใหม่โดยสมมติว่าคุณยังมีค่าต่างๆ อยู่

person cwurtz    schedule 13.06.2018
comment
ฉันมีเพียง 1 การเชื่อมต่อ ฉันลบมันแล้วเริ่มต้นใหม่... แต่ก็ยัง - มันใช้งานไม่ได้ มีการทำเครื่องหมายที่ Is Extra Encrypted แต่ไม่เลือก Is Encrypted - person jack; 13.06.2018
comment
CJ ถ้าสิ่งที่คุณพูดจะเป็นวิธีแก้ปัญหา ให้ลบการเชื่อมต่อทั้งหมดแล้วกำหนดใหม่อีกครั้ง น่าจะแก้ปัญหาได้ แต่มันไม่ได้ นอกจากนี้ฉันยังไม่เข้าใจว่าอะไรเข้ารหัสกันแน่... ฉันคิดว่าการเข้ารหัสนั้นใช้งานไม่ได้ดังนั้นการถอดรหัสจึงไม่ทำงานเช่นกัน - person jack; 13.06.2018
comment
ช่องรหัสผ่านและช่องพิเศษจะถูกเข้ารหัสแยกกัน หากไม่ได้เลือก Is Encrypted และ Extra Ecnrypted เป็น นั่นหมายความว่ารหัสผ่านไม่ได้เข้ารหัส แต่ส่วนเพิ่มเติมได้รับการเข้ารหัส การเข้ารหัสในการไหลเวียนของอากาศได้ผลแน่นอน - person cwurtz; 13.06.2018
comment
บางทีลองใช้คีย์เฟอร์เน็ตง่ายๆ เช่น การทดสอบ เพิ่มการเชื่อมต่อและดูว่าคุณได้รับข้อผิดพลาดเดียวกันหรือไม่ บางทีอาจเป็นปัญหากับอักขระบางตัวของคีย์เฟอร์เน็ตที่คุณใช้อยู่ - person cwurtz; 13.06.2018
comment
ฉันไม่ได้ทำการ EXPORT AIRFLOW__CORE__FERNET_KEY = your_fernet_key เพราะเอกสารบอกว่า อีกทางหนึ่ง เป็นไปได้ไหม - person jack; 13.06.2018
comment
ในการไหลของอากาศ เมื่อพยายามรับตัวแปรการกำหนดค่า อันดับแรกจะตรวจสอบ var ENV ตามด้วย airflow.cnf จากนั้นสั่ง args และสุดท้ายเป็นค่าเริ่มต้น คุณไม่จำเป็นต้องตั้งค่าโดยส่งออก ENV var หากคุณมีใน airflow.cfg - person cwurtz; 13.06.2018
comment
โดยสุจริตฉันไม่เข้าใจปัญหานี้ ฉันสร้างคีย์ใหม่แล้ว ลบการเชื่อมต่อทั้งหมดแล้ว บันทึกพวกเขาอีกครั้ง ทำไมสิ่งนี้ถึงเกิดขึ้น! ฉันเห็นว่าโมดูลส่งคืน: return Fernet(configuration.get('core', 'FERNET_KEY').encode('utf-8')) airflow.apache.org/_modules/airflow/models.html ฉันจะตรวจสอบได้อย่างไรว่าทำไมบรรทัดนี้ถึงไม่ทำงาน - person jack; 13.06.2018
comment
วิธีที่ง่ายที่สุดในการตรวจสอบคือการดึงค่าการเชื่อมต่อจากฐานข้อมูล เปิดหน้าต่างคอนโซลหลาม คัดลอกและวางวิธี get_fernet() โดยไม่มี AirflowException (หรือนำเข้าสิ่งนั้นด้วย) และพยายามเรียกใช้การถอดรหัส fernet ด้วยค่าจาก db . เพียงเรียกใช้แต่ละคำสั่งทีละขั้นตอนและดูว่ามีเหตุการณ์ที่ไม่คาดคิดเกิดขึ้นที่ไหน - person cwurtz; 13.06.2018
comment
NameError: ไม่ได้กำหนดชื่อ 'get_fernet' - person jack; 13.06.2018
comment
คุณจะต้องคัดลอกและวางจาก models.py ของ airflow โดยเป็นส่วนที่คุณต้องการสร้างวัตถุ Fernet - person cwurtz; 13.06.2018
comment
ฉันมีวัตถุ FERNET ตอนนี้อะไร? - person jack; 13.06.2018
comment
ฉันบอกว่าให้คัดลอกและวาง เพื่อให้คุณสามารถแก้ไข funciton ได้หากจำเป็นต้องแก้ไขข้อบกพร่อง แต่ถ้าคุณไปเส้นทางนั้น คุณต้องทำ from airflow.models import get_fernet โดยพื้นฐานแล้วเพียงติดตามการไหลของอากาศในเส้นทางที่ผ่านไปเมื่อมันทำงาน get_extra() โดยส่งผ่านสิ่งที่คุณต้องถอดรหัสจากค่าดิบจาก db - person cwurtz; 13.06.2018
comment
เมื่อฉันทำ: print Fernet(configuration.get('core', 'FERNET_KEY').encode('utf-8')).__encryption_key ฉันเห็น: ▒▒0▒8▒▒[Š/I▒9 - person jack; 13.06.2018
comment
ปัญหาอาจอยู่ที่การเข้ารหัสเองใช่ไหม เมื่อฉันตรวจสอบการเชื่อมต่อ UI ฉันไม่เห็นสิ่งที่เข้ารหัสไว้ที่นั่น - person jack; 13.06.2018
comment
หาก configuration.get('core', 'FERNET_KEY').encode('utf-8') ตรงกับสิ่งที่คุณกำหนดค่าไว้ ก็ควรจะถูกต้อง ไม่แน่ใจว่า stackoverflow กำลังจัดรูปแบบอักขระของ not หรือไม่ ฉันทำสิ่งเดียวกันในเครื่องและมี b'\xad\x9e9l\x97\xe9\xd4\x1fF4Y"\t\xfcLj' ฉันจะพยายามใช้วัตถุ Fernet ของคุณเพื่อถอดรหัสค่าจาก db ต่อไป - person cwurtz; 13.06.2018

ตรวจสอบให้แน่ใจว่าได้วางคีย์ Fernet ก่อนแล้วจึงดำเนินการคำสั่งต่อไปนี้:

airflow initdb

หากปัญหายังคงมีอยู่ ให้ลบตารางทั้งหมดออกจากฐานข้อมูล จากนั้นรันคำสั่งอีกครั้ง:

airflow initdb
person Ankit Adlakha    schedule 05.07.2019