スキップしてコンテンツを表示

AWS Glue ジョブが再試行に失敗したときに、AWS Lambda 関数を使用して SNS アラートを受信する方法を教えてください。

所要時間3分
0

AWS Glue ジョブが再試行に失敗したときに Amazon Simple Notification Service (Amazon SNS) 通知を受信するために、AWS Lambda 関数を使用したいです。

簡単な説明

Lambda 関数を作成し、受信イベントで特定の文字列をチェックします。イベント内の文字列が Lambda 関数の文字列と一致する場合、関数はメッセージを Amazon SNS に発行します。

再試行後に AWS Glue ジョブが失敗したときに Amazon SNS 通知を受信するには、Amazon SNS トピックとサブスクリプションを作成します。次に、Lambda 関数を作成します。Amazon EventBridge を使用してメール通知を起動します。

解決策

前提条件

  • 既存の AWS Glue の抽出、変換、ロード (ETL) ジョブ。
  • Amazon SNS 通知を発行するためのアクセス許可を含む、Lambda 用の AWS Identity and Access Management (IAM) ロール。

Amazon SNS トピックとサブスクリプションを作成する

次の手順を実行します。

  1. Amazon SNS コンソールを開きます。
  2. [トピック] を選択し、[トピックを作成] を選択します。
  3. [タイプ][標準] を選択します。
  4. [名前] にトピックの名前を入力します。
  5. (オプション) [表示名] にトピックの表示名を入力します。
  6. [トピックを作成] を選択します。
  7. [トピック] ページで [サブスクリプションを作成] を選択し、次の手順を実行します。
    [トピック のARN] で該当するトピックを選択します。
    [プロトコル] で通知方法を選択します (例: [メール])。
    [エンドポイント] に Amazon SNS 通知を受信するメールアドレスを入力します。
  8. [サブスクリプションを作成] を選択します。

AWS Lambda 関数を作成する

次の手順を実行します。

  1. Lambda コンソールを開きます。

  2. [関数の作成] を選択します。

  3. [関数の作成] ページで次の手順を実行します。
    [最初から作成] を選択します。
    [関数名] に、関数の名前を入力します。
    [ランタイム] で使用可能な Python バージョンを選択します。
    [デフォルト実行ロールの変更] ドロップダウンリストを展開します。
    [実行ロール] で、[既存のロールを使用する] を選択します。
    [既存のロール] で Amazon SNS 通知を送信するアクセス許可を持つ IAM ロールを選択します。

  4. [関数の作成] を選択します。

  5. [コード] タブの [コードソース] セクションで [ファイル] を選択し、[新規ファイル] を選択します。

    ファイルに名前を付けた後、次のコードを入力します。

    import json
    import logging
    import boto3
    
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    
    client = boto3.client('sns')
    
    SNS_TOPIC_ARN = "REPLACE_WITH_YOUR_SNS_TOPIC_ARN"
    
    def lambda_handler(event, context):
        logger.info(f"## INITIATED BY EVENT: \n{event['detail']}")
    
        glue_job_name = event['detail']['jobName']
        jobrun_id = event['detail']['jobRunId']
    
        if jobrun_id.endswith('_attempt_1'):
            logger.info(f'## GLUE JOB FAILED RETRY: {glue_job_name}')
            message = (
                f"A Glue job failed after retrying.\n"
                f"Job name: {glue_job_name}\n"
                f"JobRun ID: {jobrun_id}"
            )
            client.publish(
                TargetArn=SNS_TOPIC_ARN,
                Message=json.dumps({'default': json.dumps(message)}),
                Subject='AWS Glue Job Retry Failure Notification',
                MessageStructure='json'
            )

    注: SNS_TOPIC_ARN は、実際の Amazon SNS トピックの ARN に置き換えます。

  6. [ファイル] を選択し、[保存] を選択します。

  7. [ファイル名] にファイル名を入力します。

  8. [デプロイ] を選択します。

(オプション) イベントをテストするには、次の手順を実行します。

  1. [テスト] タブを選択します。

  2. [イベント名] に名前を入力します。

    イベントの JSON 本文に次のコードを入力します。

    {    "version": "0",
        "id": "abcdef01-1234-5678-9abc-def012345678",
        "detail-type": "Glue Job State Change",
        "source": "aws.glue",
        "account": "123456789012",
        "time": "2017-09-07T06:02:03Z",
        "region": "us-west-2",
        "resources": [],
        "detail": {
            "jobName": "MyTestJob",
            "severity": "ERROR",
            "state": "FAILED",
            "jobRunId": "jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef_attempt_1",
            "message": "JobName:MyTestJob and JobRunId:jr_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef failed to execute with exception Role arn:aws:iam::123456789012:role/Glue_Role should be given assume role permissions for Glue Service."
        }
    }

    注: MyTestJob は、実際の AWS Glue ジョブ名に置き換えます。

  3. [変更を保存] を選択し、[テスト] を選択します。

  4. 表示される [実行結果] を確認します。

  5. Amazon SNS アラートを受信できていることを確認します。

Amazon EventBridge を使用してメール通知を起動する

次の手順を実行します。

  1. EventBridge コンソールを開きます。

  2. ナビゲーションペインで、[ルール] を選択し、[ルールを作成] を選択します。

  3. [ルールの作成] ページで次の手順を実行します。
    [名前] にルール名を入力します。
    (オプション) [説明] にルールの説明を入力します。
    [パターンの定義][イベントパターン] を選択します。
    [イベントの一致パターン][カスタムパターン] を選択します。
    [イベントパターン] に次のパターンまたは独自のパターンを入力します。

    {  
    "detail-type": [ "Glue Job State Change"],
      "source": ["aws.glue"],
      "detail": {
        "state": ["FAILED"]
      }
    }
  4. [保存] を選択します。

  5. [ターゲットの選択] セクションで次の手順を実行します。
    [ターゲット][Lambda 関数] を選択します。
    [関数] で該当する Lambda 関数を選択します。

  6. [次へ] を選択し、[ルールの作成] を選択します。

AWS Glue ジョブで障害をテストする

次の手順を実行します。

  1. AWS Glue コンソールを開きます。
  2. ナビゲーションペインで [ジョブ] を選択し、テストする AWS Glue ジョブを選択します。
  3. [アクション] ドロップダウンリストを選択し、[ジョブの編集] を選択します。
  4. [セキュリティ設定、スクリプトライブラリ、ジョブパラメータ (オプション)] セクションを展開します。
  5. [セキュリティ構成][再試行回数]1 を入力します。
  6. [保存] を選択します。
  7. [ジョブ] ページで該当する AWS Glue ジョブを選択します。
  8. [アクション] ドロップダウンリストを選択し、[スクリプトの編集] を選択します。
  9. ジョブが失敗するようにコードの要素を変更します。たとえば、テーブル名に _BROKEN を追加します。
  10. [保存] を選択します。
  11. [ジョブ] ページで該当する AWS Glue ジョブを選択します。
  12. [アクション] ドロップダウンリストを選択し、[ジョブの実行] を選択します。

AWS Glue ジョブを 2 回失敗させた後、Amazon SNS 通知が届いていることを確認します。通知で、設定したエンドポイントを確認します。次に、ジョブを失敗させるためにコード内で変更した要素を削除します。

関連情報

Amazon EventBridge のイベント

Amazon SNS 通知のセットアップ

Amazon EventBridge のトラブルシューティング

AWS公式更新しました 8ヶ月前
コメントはありません

関連するコンテンツ