Amazon MWAA の実践的な共有 – タスクの粒度に基づいたアラームの監視

e28db21829dd26ef4550aaae680f0eab.gif

サービスとシナリオの紹介

アマゾンMWAA

Amazon MWAA (Amazon Managed Workflows for Apache Airflow) は、Apache Airflow のマネージド サービスであり、これを使用すると、使い慣れた Apache Airflow プラットフォームを使用してワークフローを調整できます。基盤となるインフラストラクチャの管理という運用上の負担を負うことなく、スケーラビリティ、可用性、セキュリティが向上します。

アマゾンSNS

Amazon Simple Notice Service (Amazon SNS) は、パブリッシャーからサブスクライバー (プロデューサーおよびコンシューマーとも呼ばれる) へのメッセージ配信を提供するマネージド サービスです。パブリッシャーは、トピック、論理アクセス ポイント、および通信チャネルにメッセージを送信することにより、サブスクライバーと非同期で通信します。クライアントは、Amazon Kinesis Data Firehose、Amazon SQS、Amazon Lambda、HTTP、電子メール、モバイル プッシュ通知、モバイル テキスト メッセージ (SMS) などのサポートされているエンドポイント タイプを使用して、SNS トピックにサブスクライブし、公開されたメッセージを受信できます。

アマゾンラムダ

Amazon Lambda は、サーバーレスのイベント駆動型コンピューティング サービスであり、サーバーのプロビジョニングや管理を行わずに、事実上あらゆる種類のアプリケーションまたはバックエンド サービスのコードを実行できます。200 を超えるアマゾン ウェブ サービスおよび Software-as-a-Service (SaaS) アプリケーションから Lambda をトリガーでき、使用した分だけお支払いいただけます。

シーン紹介

本記事では、従来のデータウェアハウスのスケジューリングタスク監視において、Airflowのタスク粒度(タスクオーナー、DAG ID、タスクID、実行時間)に基づいた監視を実装し、同時にアラーム情報をサードパーティメッセージに通知する方法を説明します。ツール (この記事では例として Airflow ブックを使用します)。

ソリューションアーキテクチャ

aa8a7b114e7cf18abfcb79e8fa01bf58.png

このスキームは 2 つの部分的な実装で構成されます (詳細は以下で説明します)。

  • 縦線の左側は Amazon MWAA タスク監視で、アラーム情報はカスタム コールバック関数を通じて Amazon SNS にプッシュされます

  • 垂直線の右側は、既存の Feish Notifier ワンクリック展開ソリューションです。これは、メッセージ形式をカスタマイズし、Webhook API を介してサードパーティのクライアントにプッシュする役割を果たします。

導入プロセス

フェイシュ通知リンク搭載

  • Feishu は事前に Webhook API を作成し、後で使用できるように記録しました (この記事では作成手順は無視します)

  • コンソールの検索バーでキーワード「sar」を検索します

982b40da78aa62c16d76cb9c2d312bb8.png

  • 左側の「利用可能なアプリケーション」をクリックし、キーワード「フェイシュ」を検索してください

9da28d31b6b832edd010bc77087eab0d.png

  • 「Feish-Notifier」をクリックし、作成したFeishu Webhook URLを入力し、必要なリソースのデプロイを開始します

ディー4d069103a573abd5a508c90f79d9d.png

  • デプロイが完了したら、後で使用するために「リソース」から Amazon SNS の完全な ARN をコピーします。

73040d75801b8598e1fe48142c0e1af7.png

これまでに、フェイシュ通知リンクの展開が完了しました。

Amazon MWAA タスクモニタリング設定

  • タスク監視設定。Airflow DAG 設定パラメータでは、「on_failure_callback」パラメータは、タスクの実行が失敗した後に、このパラメータで指定されたカスタム コールバック関数を実行するために使用されます。このパラメータを使用して、タスクベースの粒度を監視し、非常に柔軟に処理するアラームをカスタマイズできます。

default_args = {
    "owner": "JerryWONG",
    "depends_on_past": False,
    #"retries": 1,
    #"retry_delay": timedelta(minutes=5),
    "on_failure_callback": on_failure_callback
}

左にスワイプするとさらに表示されます

  • コールバック関数のサンプル。この例の中心となる処理ロジックは、コールバック コンテキスト (context) からタスク オブジェクト (TaskInstance) を抽出し、対応する owner、task_id、dag_id、execution_date の値を取得し、それらをメッセージ コンテンツとして、で確立された Amazon SNS に送信することです。上記の手順により、チャネルが Feishu クライアントにプッシュされます。

def on_failure_callback(context):
    # Initiate TaskInstance object
    ti = context.get('ti')


    # Get Task attributes
    owner = ti.task.owner
    execution_date = ti.execution_date
    task_id = ti.task_id
    dag_id = ti.task.dag_id


    op = SnsPublishOperator(
        task_id='dag_failure',
        target_arn=sns_topic_arn,
        subject="DAG FAILED",
        message_attributes={"MessageStructure": 'string'},
        message=f"MWAA(Airflow) task has failed, please check the task details:\n\n- Owner: {owner},\n- Execution_Date: {execution_date},\n- Task_ID: {task_id},\n- DAG_ID: {dag_id}"
    )
    op.execute(context)

左にスワイプするとさらに表示されます

  • 完全な DAG コード サンプル

from airflow import DAG
from airflow.providers.amazon.aws.operators.glue import GlueJobOperator
from airflow.providers.amazon.aws.operators.sns import SnsPublishOperator
from airflow.utils.dates import days_ago
from airflow.models import TaskInstance
from airflow.sensors.external_task import ExternalTaskSensor
import os
from datetime import datetime as dt, timedelta




# Define AWS SNS Topic ARN
# sns_topic_arn = os.getenv('SNS_TOPIC_ARN')
sns_topic_arn = 'arn:aws:sns:us-west-2:xxx:serverlessrepo-jerry-demo-Feishu-Notifier-ServerlessNotifierSNSTopic-XTDxij194UZp'




# Task failure callback function
# Call AWS SNS API to send notification
def on_failure_callback(context):
    # Initiate TaskInstance object
    ti = context.get('ti')


    # Get Task attributes
    owner = ti.task.owner
    execution_date = ti.execution_date
    task_id = ti.task_id
    dag_id = ti.task.dag_id


    op = SnsPublishOperator(
        task_id='dag_failure',
        target_arn=sns_topic_arn,
        subject="DAG FAILED",
        message_attributes={"MessageStructure": 'string'},
        message=f"MWAA(Airflow) task has failed, please check the task details:\n\n- Owner: {owner},\n- Execution_Date: {execution_date},\n- Task_ID: {task_id},\n- DAG_ID: {dag_id}"
    )
    op.execute(context)




# Default settings applied to all tasks
default_args = {
    "owner": "JerryWONG",
    "depends_on_past": False,
    #"retries": 1,
    #"retry_delay": timedelta(minutes=5),
    "on_failure_callback": on_failure_callback
}




DAG_ID = os.path.basename(__file__).replace(".py", "")
hour = dt.now().strftime("%Y%m%d%H")


with DAG(
        dag_id=DAG_ID,
        schedule_interval="0 * * * *",
        catchup=False,
        start_date=days_ago(1),
        default_args=default_args,
) as dag:
    submit_glue_job = GlueJobOperator(
        task_id="jerry-demo-redshift-msk-updated",
        job_name="jerry-demo-redshift-msk-updated",
        script_location=f"s3://aws-glue-assets-xxx-us-west-2/scripts/jerry-demo-redshift-msk.py",
        s3_bucket="aws-glue-assets-xxx-us-west-2",
        iam_role_name="glue_s3_full_access",
        create_job_kwargs={
            "GlueVersion": "4.0",
            "NumberOfWorkers": 2,
            "WorkerType": "G.1X",
            "Connections": {"Connections": ["jerry-demo-redshift-connection"]},
            "DefaultArguments": {
                "--enable-auto-scaling": "true",
                "--max-num-workers": "10",
                "--enable-metrics": "true",
                "--metrics-sample-rate": "1",
                "--job-bookmark-option": "job-bookmark-disable",
                "--enable-continuous-cloudwatch-log": "true",
                "--log-level": "INFO",
                "--enable-glue-datacatalog": "true",
                "--enable-spark-ui": "true",
                "--enable-job-insights": "true",
                "--TempDir": "s3://aws-glue-assets-xxx-us-west-2/temporary/",
                "--spark-event-logs-path": "s3://aws-glue-assets-xxx-us-west-2/sparkHistoryLogs/"
            }
        }
    )


    # wait for external dag to finish
    wait_for_external_task = ExternalTaskSensor(
        task_id="wait_for_external_dag",
        external_dag_id="jerry-demo-mysql-redshift-dag",
        external_task_id=None,
        check_existence=True,
        # @与执行的external任务的时间差
        # execution_delta=timedelta(minutes=40),
        # allowed_states=["success"],
        # failed_states=["failed", "skipped"],
        mode="reschedule",
        timeout=60
    )


    wait_for_external_task >> submit_glue_job

左にスワイプするとさらに表示されます

最後に、作成者は効果を検証するために、構成エラーによりタスクが失敗する原因となった DAG を意図的に実行しました。タスクが失敗すると、Feishu クライアントでカスタム アラーム通知をすぐに受信できます。

3842423a6f1fb53c065572ba27478a98.png

これまで、タスク所有者とタスクの粒度に基づいて Amazon MWAA のアラーム通知スキームを実装する方法を十分に説明してきました。

この記事の著者

5fe5d2f13e0e98f1b4838f622e9b2d2f.jpeg

黄佳西

Amazon クラウド テクノロジー ソリューション アーキテクト。Amazon クラウド テクノロジーに基づくクラウド コンピューティング ソリューションのコンサルティングと設計を担当します。以前は Cisco と China Telecom に勤務しており、ネットワークおよびキャリア バックボーン ネットワークに豊富な経験を持ち、ビッグ データの分野に熱心で、EMR、Kinesis、Athena、Glue などのデータ分析サービスとソリューション設計に精通しています。 。

65b6dbd50d8190306ee94b5370bc7cd5.gif

4b76944ffb9d22ea74541b1687d2c290.gif

聞いたので、下の 4 つのボタンをクリックしてください

バグに遭遇することはありません!

926a41ca2e0ff6608415b4e094cb47d9.gif

おすすめ

転載: blog.csdn.net/u012365585/article/details/131486140