بررسی اسکریپتهای راهاندازی شل در گردشهای کاری مدیریتشده برای Apache Airflow (MWAA) و mwaa-local-runner
Managed Workflows for Apache Airflow (MWAA) اخیراً ویژگی جدیدی را راهاندازی کرده است که بسیاری از افراد درخواست کرده بودند، و آن توانایی اضافه کردن کتابخانهها، باینریها یا متغیرهای محیطی اضافی هنگام راهاندازی کارگران Airflow بود. اگر اعلامیه را از دست داده اید، آمازون MWAA اکنون از Shell Launch Scripts پشتیبانی می کند، این قابلیت جدید به شما این امکان را می دهد که به راحتی این کار را با ایجاد یک اسکریپت و سپس پیکربندی محیط های MWAA خود برای استفاده از آن اسکریپت در مرحله راه اندازی انجام دهید. اسناد MWAA به روز شده است تا به شما نشان دهد چگونه می توانید از آن استفاده کنید، و می توانید در مورد آن در صفحه با استفاده از یک اسکریپت راه اندازی با آمازون MWAA بخوانید. این یک ماده مرجع ضروری برای درک بیشتر در مورد کارهایی است که می توانید با این ویژگی جدید انجام دهید.
در این پست، میخواستم نحوه استفاده از این و همچنین نحوه استفاده از mwaa-local-runner را برای اعتبارسنجی/تست اسکریپتهای راهاندازی به اشتراک بگذارم. آخرین نسخه mwaa-local-runner (2.4.3 و 2.5.1) برای پشتیبانی از این به روز رسانی شده است.
من فرض میکنم که شما در حال حاضر موفق به کسب جایزه محلی شدهاید، بنابراین اگر این کار را نکردهاید، اکنون زمان مناسبی برای انجام این کار است ;-).
نیاز به اسکریپت های راه اندازی
قبل از اینکه محیط را بهروزرسانی کنیم، میتوانیم نگاهی گذرا به یک مثال بیندازیم که به شما نشان میدهد چگونه این کار میکند. تصور کنید که چند متغیر محیطی استاندارد دارید که باید هنگام اجرای وظایف خود تنظیم کنید. این یک نیاز رایج است، و بنابراین در این مثال فرض کنید که باید به یک متغیر محیطی جدید (به نام BUILD_ON_OPEN_SOURCE=”عالی!”) دسترسی داشته باشیم. Will یک DAG ساده ایجاد می کند که این متغیر محیطی جدید را چاپ می کند و می بیند که چه خروجی دریافت می کنیم. اگر مقداری کد جاوا داشتیم که میخواستیم اجرا کنیم و به نسخه جاوا خاصی نیاز داشتیم. ما یک DAG دیگر خواهیم داشت که جزئیات نسخه جاوا را خروجی می دهد و سپس به دنبال نصب آخرین نسخه Amazon Corretto خواهد بود.
این DAG نمونه ما است.
from datetime import datetime
from airflow import DAG
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperator
import os
def print_hello():
print(os.environ['BUILD_ON_OPEN_SOURCE'])
return 'os.environ["BUILD_ON_OPEN_SOURCE"]'
dag = DAG('startup_script_demo', description='Showing Startup Scripts', schedule_interval=None, start_date=datetime(2017, 3, 20), catchup=False)
java_env = BashOperator(
task_id="java_env",
bash_command="java --version",
dag=dag)
env_variable = PythonOperator(
task_id='env_variable',
python_callable=print_hello,
dag=dag)
java_env >> env_variable
وقتی این DAG را آپلود می کنیم و آن را اجرا می کنیم، خروجی زیر را دریافت می کنیم.
برای متغیرهای محیط پایتون که می بینیم
File "/usr/local/airflow/dags/simple-dag.py", line 9, in print_hello
print(os.environ['BUILD_ON_OPEN_SOURCE'])
File "/usr/lib/python3.10/os.py", line 680, in __getitem__
raise KeyError(key) from None
KeyError: 'BUILD_ON_OPEN_SOURCE'
[2023-04-14, 13:13:04 UTC] {{taskinstance.py:1401}} INFO - Marking task as FAILED.
و برای وظیفه جاوا
[2023-04-14, 13:12:29 UTC] {{subprocess.py:75}} INFO - Running command: ['/usr/bin/bash', '-c', 'java --version']
[2023-04-14, 13:12:29 UTC] {{subprocess.py:86}} INFO - Output:
[2023-04-14, 13:12:29 UTC] {{subprocess.py:93}} INFO - Unrecognized option: --version
[2023-04-14, 13:12:29 UTC] {{subprocess.py:93}} INFO - Error: Could not create the Java Virtual Machine.
[2023-04-14, 13:12:29 UTC] {{subprocess.py:93}} INFO - Error: A fatal exception has occurred. Program will exit.
[2023-04-14, 13:12:29 UTC] {{subprocess.py:97}} INFO - Command exited with return code 1
[2023-04-14, 13:12:29 UTC] {{taskinstance.py:1851}} ERROR - Task failed with exception
Traceback (most recent call last):
File "/usr/local/airflow/.local/lib/python3.10/site-packages/airflow/operators/bash.py", line 196, in execute
raise AirflowException(
airflow.exceptions.AirflowException: Bash command failed. The command returned a non-zero exit code 1.
همانطور که می بینیم، وظایف شکست می خورند. ما از اسکریپت های راه اندازی برای کمک به رفع هر دو مشکل استفاده خواهیم کرد. قبل از انجام این کار، من به شما نشان خواهم داد که چگونه آن اسکریپت را ایجاد می کنید.
چگونه اسکریپت های راه اندازی با mwaa-local-runner کار می کنند
هنگام استفاده از MWAA، اکنون می توانید یک اسکریپت راه اندازی را از طریق صفحه پیکربندی محیط تعیین کنید. با این حال، تمرین خوبی است که از mwaa-local-runner برای آزمایش این موضوع قبل از ایجاد تغییرات استفاده کنید. mwaa-local-runner به روز شده است تا شامل برخی از اسکریپت های جدید باشد که نحوه عملکرد سرویس مدیریت شده MWAA را تقلید می کند. ما میتوانیم یک پوشه جدید در ریشه فهرست mwaa-local-runner (به نام startup) ببینیم و در اینجا یک اسکریپت به نام startup.sh وجود دارد. این اسکریپت است که باید اصلاح کنیم. وقتی برای اولین بار mwaa-local-runner را بررسی میکنید، فقط با یک مکاننما خالی میشود.
میتوانیم ببینیم که در حالی که فقط باید تغییرات خود را به اسکریپت startup.sh اضافه کنیم (در سمت راست در نمودار بالا)، تعدادی اسکریپت دیگر نیز درگیر هستند. از اسکریپت enterpoint.sh، execute_startup_script فراخوانی می شود که پس از طی یک سری مراحل، محتویات startup.sh را که ایجاد کرده اید اجرا می کند. اگر متغیرهای محیطی تعریف کردهاید، این متغیرها در فایلی به نام stored_env باقی میمانند و پس از شروع Airflow به محیط وارد میشوند.
با انتشار این قابلیت جدید، دستور جدیدی به دستور mwaa-local-env به نام “test-startup-script” وجود دارد که به شما امکان می دهد اسکریپت های راه اندازی خود را در تنظیم mwaa-local-runner خود تأیید کنید.
در حال به روز رسانی mwaa-local-runner موجود شما
در زمان نوشتن، یک “ویژگی” کوچک با mwaa-local-runner وجود دارد، به این معنی که قبل از استفاده از آن باید یک تغییر کوچک در mwaa-local-runner خود ایجاد کنیم. ما باید اسکریپت “entrypoint.sh” را در پوشه docker/scripts تغییر دهیم و با افزودن یک خط جدید “source stored_env” بین execute_start_script و ariflow db init، آن را بهروزرسانی کنیم:
install_requirements
execute_startup_script
source stored_env <-- added this
airflow db init
ما باید تصویر mwaa-local-runner خود را بازسازی کنیم، اما از آنجایی که ما به تازگی در حال تغییر enterpoint.sh هستیم، این کار نباید خیلی طول بکشد.
./mwaa-local-env build-image
نسخه جدید ما اکنون برای رفتن باید خوانده شود.
تست اسکریپت راه اندازی
ما اکنون آماده ایجاد و سپس آزمایش اولین اسکریپت راه اندازی خود هستیم. ما قبلاً یک پوشه و اسکریپت خالی ایجاد کردهایم (در بالا) بنابراین فایل “startup_script/startup.sh” را باز کرده و ویرایش میکنیم.
mwaa-local-runner از یک تصویر پایه لینوکس آمازون استفاده می کند، بنابراین ما می توانیم از راهنمای Amazon Corretto در اینجا در مورد مراحل صحیح نصب آن استفاده کنیم.
#!/bin/sh
echo "Running sample startup script."
export BUILD_ON_OPEN_SOURCE="awesome"
sudo yum install java-17-amazon-corretto-headless -y
ما این فایل را ذخیره میکنیم و اکنون میتوانیم از دستور جدید “mwaa-local-runner test-startup-script” استفاده کنیم تا ببینیم آیا مشکلی ندارد
./mwaa-local-env test-startup-script
که خروجی زیر را خواهیم دید
Container amazon/mwaa-local:2_4 exists. Skipping build
Running sample startup script.
awesome
Loaded plugins: ovl, priorities
amzn2-core | 3.7 kB 00:00:00
(1/3): amzn2-core/2/x86_64/group_gz | 2.5 kB 00:00:00
(2/3): amzn2-core/2/x86_64/updateinfo | 586 kB 00:00:00
(3/3): amzn2-core/2/x86_64/primary_db | 71 MB 00:00:24
Resolving Dependencies
--> Running transaction check
---> Package java-17-amazon-corretto-headless.x86_64 1:17.0.6+10-1.amzn2.1 will be installed
--> Processing Dependency: dejavu-sans-mono-fonts for package: 1:java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64
--> Processing Dependency: dejavu-serif-fonts for package: 1:java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64
--> Running transaction check
---> Package dejavu-sans-mono-fonts.noarch 0:2.33-6.amzn2 will be installed
---> Package dejavu-serif-fonts.noarch 0:2.33-6.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===============================================================================================================================================================================
Package Arch Version Repository Size
===============================================================================================================================================================================
Installing:
java-17-amazon-corretto-headless x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core 94 M
Installing for dependencies:
dejavu-sans-mono-fonts noarch 2.33-6.amzn2 amzn2-core 433 k
dejavu-serif-fonts noarch 2.33-6.amzn2 amzn2-core 777 k
Transaction Summary
===============================================================================================================================================================================
Install 1 Package (+2 Dependent packages)
Total download size: 95 M
Installed size: 240 M
Is this ok [y/d/N]: ^C/entrypoint.sh: line 70: stored_env: No such file or directory
(base) @094459 ~/Projects/airflow/cicd/demos/local-airflow-dev/mwaa-local ./mwaa-local-env test-startup-script
Container amazon/mwaa-local:2_4 exists. Skipping build
Running sample startup script.
Loaded plugins: ovl, priorities
amzn2-core | 3.7 kB 00:00:00
(1/3): amzn2-core/2/x86_64/group_gz | 2.5 kB 00:00:00
(2/3): amzn2-core/2/x86_64/updateinfo | 586 kB 00:00:00
(3/3): amzn2-core/2/x86_64/primary_db | 71 MB 00:00:22
Resolving Dependencies
--> Running transaction check
---> Package java-17-amazon-corretto-headless.x86_64 1:17.0.6+10-1.amzn2.1 will be installed
--> Processing Dependency: dejavu-sans-mono-fonts for package: 1:java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64
--> Processing Dependency: dejavu-serif-fonts for package: 1:java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64
--> Running transaction check
---> Package dejavu-sans-mono-fonts.noarch 0:2.33-6.amzn2 will be installed
---> Package dejavu-serif-fonts.noarch 0:2.33-6.amzn2 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
Installing:
java-17-amazon-corretto-headless x86_64 1:17.0.6+10-1.amzn2.1 amzn2-core 94 M
Installing for dependencies:
dejavu-sans-mono-fonts noarch 2.33-6.amzn2 amzn2-core 433 k
dejavu-serif-fonts noarch 2.33-6.amzn2 amzn2-core 777 k
Transaction Summary
===============================================================================================================================================================================
Install 1 Package (+2 Dependent packages)
Total download size: 95 M
Installed size: 240 M
Downloading packages:
(1/3): dejavu-sans-mono-fonts-2.33-6.amzn2.noarch.rpm | 433 kB 00:00:00
(2/3): dejavu-serif-fonts-2.33-6.amzn2.noarch.rpm | 777 kB 00:00:00
(3/3): java-17-amazon-corretto-headless-17.0.6+10-1.amzn2.1.x86_64.rpm | 94 MB 00:00:30
Complete!
Finished running startup script. Execution time: 75.612s.
Running verification
Verification completed
همانطور که می بینیم، اسکریپت راه اندازی بدون هیچ خطایی پردازش شده است. به خروجی “awesome” در ابتدا و همچنین خروجی نصب بسته توجه کنید.
اگر اسکریپت را خراب کنیم و در پایان یک “s” اضافه کنیم تا یک اشتباه تایپی را شبیه سازی کنیم. اگر این کار را انجام دهیم، می بینیم که خروجی متفاوتی دریافت می کنیم
No package java-17-amazon-corretto-headlesss available.
Error: Nothing to do
Finished running startup script. Execution time: 29.105s.
Running verification
Verification completed
این بدان معناست که ما میتوانیم قبل از ایجاد آن تغییر در محیطهای MWAA، این مشکل را برطرف کنیم. فوو، این صید خوبی است.
DAG خود را اجرا می کنیم و تغییرات اسکریپت راه اندازی را مشاهده می کنیم
اکنون می توانیم mwaa-local-runner را به صورت محلی اجرا کنیم و آن DAG ها را دوباره اجرا کنیم. همانطور که شروع می شود باید متوجه شوید که اسکریپت اجرا شده است و خواهید دید (در این مثال) Amazon Corretto در حال نصب است.
./mwaa-local-env start
..
..
aws-mwaa-local-runner-2_4-local-runner-1 | Requirement already satisfied: anyio==3.* in ./.local/lib/python3.10/site-packages (from httpcore<0.16.0,>=0.15.0->httpx->apache-airflow>=2.3.0->apache-airflow-providers-amazon==7.3.0->-r /usr/local/airflow/requirements/requirements.txt (line 4)) (3.6.2)
aws-mwaa-local-runner-2_4-local-runner-1 | Requirement already satisfied: h11<0.13,>=0.11 in ./.local/lib/python3.10/site-packages (from httpcore<0.16.0,>=0.15.0->httpx->apache-airflow>=2.3.0->apache-airflow-providers-amazon==7.3.0->-r /usr/local/airflow/requirements/requirements.txt (line 4)) (0.12.0)
aws-mwaa-local-runner-2_4-local-runner-1 | Running sample startup script.
aws-mwaa-local-runner-2_4-local-runner-1 | Loaded plugins: ovl, priorities
aws-mwaa-local-runner-2_4-local-runner-1 | Resolving Dependencies
aws-mwaa-local-runner-2_4-local-runner-1 | --> Running transaction check
aws-mwaa-local-runner-2_4-local-runner-1 | ---> Package java-17-amazon-corretto-headless.x86_64 1:17.0.6+10-1.amzn2.1 will be installed
..
اگر اکنون منتظر بمانیم تا دنباله بوت خود را تمام کند، وقتی DAGS خود را دوباره امتحان می کنیم، خروجی زیر را دریافت می کنیم.
برای متغیرهای محیط پایتون که می بینیم
[2023-04-17, 18:13:29 UTC] {{logging_mixin.py:137}} اطلاعات - عالی
[2023-04-17, 18:13:29 UTC] {{python.py:177}} اطلاعات - انجام شد. مقدار برگشتی: os.environ بود["BUILD_ON_OPEN_SOURCE"]
[2023-04-17, 18:13:29 UTC] {{taskinstance.py:1401}} اطلاعات - علامت گذاری کار به عنوان SUCCESS. dag_id=startup_script_demo، task_id=env_variable، execution_date=20230417T181324، start_date=20230417T181328، end_date=20230417T181329
[2023-04-17, 18:13:29 UTC] {{local_task_job.py:159}} اطلاعات - کار با کد برگشتی 0 خارج شد
[
and for the Java task
[2023-04-14, 13:56:05 UTC] {{subprocess.py:75}} اطلاعات - دستور در حال اجرا: ['/usr/bin/bash', '-c', 'java --version']
[2023-04-14, 13:56:05 UTC] {{subprocess.py:86}} اطلاعات - خروجی:
[2023-04-14, 13:56:05 UTC] {{subprocess.py:93}} اطلاعات - openjdk 17.0.6 2023-01-17 LTS
[2023-04-14, 13:56:05 UTC] {{subprocess.py:93}} اطلاعات - OpenJDK Runtime Environment Corretto-17.0.6.10.1 (build 17.0.6+10-LTS)
[2023-04-14, 13:56:05 UTC] {{subprocess.py:93}} اطلاعات - OpenJDK 64-bit Server VM Corretto-17.0.6.10.1 (build 17.0.6+10-LTS، حالت ترکیبی، اشتراک گذاری)
[2023-04-14, 13:56:05 UTC] {{subprocess.py:97}} اطلاعات - فرمان با کد برگشتی 0 خارج شد
نتیجه
این پست کوتاه ویژگی جدید MWAA را به شما یادآوری میکند که به شما امکان میدهد ابزارها، کتابخانهها و جزئیات پیکربندی محیط مورد نیاز را برای کارگران Airflow خود تنظیم کنید. شما می توانید از mwaa-local-runner به عنوان یک ابزار توسعه عالی برای کمک به تست اسکریپت های راه اندازی خود استفاده کنید، و این پست به شما نشان می دهد که چگونه می توانید این را با استفاده از یک مثال ساده تنظیم کنید. مطمئن شوید که اسناد MWAA را بررسی کرده اید. با استفاده از یک اسکریپت راه اندازی با آمازون MWAA، برای غوطه ور شدن بیشتر در این قابلیت. این یک ماده مرجع ضروری برای درک بیشتر در مورد کارهایی است که می توانید با این ویژگی جدید انجام دهید.
اگر این پست وبلاگ را مفید یافتید، لطفاً با تکمیل این نظرسنجی بسیار کوتاه در اینجا، بازخوردی به من بدهید