AWS Glue ジョブが再試行に失敗したときに、Lambda 関数を使用して SNS アラートを受信するにはどうすればよいですか?

最終更新日: 2021 年 3 月 30 日

AWS Glue ジョブが再試行に失敗したときに、Amazon Simple Notification Service (Amazon SNS) アラートで通知を受けたいと考えています。

簡単な説明

AWS Glue の Amazon EventBridge イベントを使用して Amazon SNS アラートを作成できますが、アラートは特定の状況では十分に具体的でない場合があります。AWS Glue ジョブが再試行時に失敗するなど、特定の AWS Glue イベントに対して SNS 通知を受信するには、AWS Lambda を使用できます。Lambda 関数を作成して、次の操作を実行できます。

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

AWS Lambda 関数を使用して、AWS Glue ジョブのいずれかが再試行に失敗したときに SNS から E メールを受信するには、次の手順を実行します。

  1. Amazon SNS トピックを作成します。
  2. AWS Lambda 関数を作成します。
  3. Lambda 関数を使用して E メール通知を開始する Amazon EventBridge イベントを作成します。

解決方法

次の項目があることを確認してください。

  • AWS Glue の抽出、変換、およびロード (ETL) ジョブ
  • SNS 通知を発行する権限を持つ AWS Lambda の AWS Identity and Access Management (IAM) ロール

Amazon SNS トピックを作成する

  1. Amazon SNS コンソールを開きます。
  2. [トピック] を選択し、[ トピックの作成] を選択します。
  3. [タイプ] で、[標準] を選択します。
  4. [名前] に、トピック名を入力します。
  5. (オプション) [表示名] に、トピックの表示名を入力します。
  6. [トピックの作成] を選択します。
    トピックが作成されます。
  7. [サブスクリプションの作成] を選択します。
    [トピック ARN] で、作成したトピックを選択します。
    [プロトコル] で、目的のプロトコルを選択します。
    [エンドポイント] では SNS 通知を受信するアドレスを入力します。
  8. [サブスクリプションの作成] を選択します。
    サブスクリプションが作成されます。

AWS Lambda 関数を作成する

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

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

3.    [関数の作成 ] ページで、次の操作を行います。

[一から作成] を選択します。
[関数名] に関数の名前を入力します。
[ランタイム] で、Python オプションの 1 つを選択します (スクリプトとの互換性のために、Python 3.7 をお勧めします)。
[デフォルトの実行ロールの変更] ドロップダウンリストを展開します。
[実行ロール] で [既存のロールを使用する] を選択します。
[既存のロール] で、SNS 通知を送信する権限を持つ IAM ロールを選択します。

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

5.    [コード] タブの [コードソース] セクションで、[ファイル] を選択してから、[新しいファイル] をクリックします。
新しいファイルに、次のようなコードを入力します。

# Import modules
import boto3
import json
import os
import logging
# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
# Set up Boto 3 client for SNS
client = boto3.client('sns')
# Variables for the SNS:
snsTopicARN = "arn:aws:sns:us-east-1:012345627499:Glue_Job_Failure_Notification"
# Define Lambda function
def lambda_handler(event, context):
    logger.info('## INITIATED BY EVENT: ')
    logger.info(event['detail'])
    # Define variables based on the event
    glueJobName = event['detail']['jobName']
    jobRunId = event['detail']['jobRunId']
    # Only send SNS notification if the event pattern contains _attempt_1
    if event['detail']['jobRunId'].endswith('_attempt_1'):
        logger.info('## GLUE JOB FAILED RETRY: ' + glueJobName)
    message = \
        "A Glue Job has failed after attempting to retry. JobName: " \
        + glueJobName + ", JobRunID: " + jobRunId
    print(message)
    response = client.publish(
        TargetArn=snsTopicARN,
        Message=json.dumps({'default': json.dumps(message)}),
        Subject='An AWS Glue Job has failed',
        MessageStructure='json')

注: snsTopicARN をお使いの SNS トピックの ARN に置き換えてください。
[ファイル] を選択し、[保存] をクリックします。
[ファイル名] に、任意のファイル名を入力します。

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

(オプション) 次の操作を実行して、イベントをテストできます。

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

[名前] に、イベント名を入力します。次のような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 ジョブの名前に置き換えます。

2.    [変更を保存] を選択します。

3.    [テスト] を選択します。

4.    テスト完了後に開く実行結果を表示します。

5.    SNS 通知を受け取ったことを確認します。

Amazon EventBridge を使用して E メール通知を開始する

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

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

3.    [ロールを作成] ページで、次の手順を実行します。

[名前] に、ルール名を入力します。
(オプション) [ 説明 - オプション] に、ルールの説明を入力します。
[パターン定義] で、[イベントパターン] を選択します。
[イベント一致パターン] で、[カスタムパターン] を選択します。
[イベントパターン] で、次のパターン、または任意のパターンを入力します。

{
    "detail-type": [
        "Glue Job State Change"
    ],
    "source": [
        "aws.glue"
    ],
    "detail": {
        "state": [
            "FAILED"
        ]
    }
}

[保存] を選択します。
[ターゲットを選択] セクションで、次の操作を行います。
[ターゲット] で、[Lambda 関数] を選択します
[関数] で、作成した関数を選択します。

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

AWS Glue ジョブで通知をテストする

  1. AWS Glue コンソールを開きます。
  2. ナビゲーション ペインで [ジョブ] を選択します。
  3. 通知をテストする Glue ジョブを選択します。
  4. [アクション] ドロップダウンリストを選択し、[ジョブの編集] をクリックします。
  5. [セキュリティ設定、スクリプトライブラリおよびジョブパラメータ (オプション)] を展開します。
  6. [セキュリティ設定] の [再試行回数] に「1」と入力します。
  7. [保存] を選択します。
  8. [ジョブ] ページで、通知をテストする Glue ジョブを選択します。
  9. [アクション] ドロップダウンリストを選択し、[スクリプトの編集] を選択します。
  10. ジョブが失敗するように、コードの要素を変更します。(例: テーブル名に「_BROKEN」という単語を追加します)。
  11. [保存] を選択します。
  12. [ジョブ] ページで、通知をテストする Glue ジョブを選択します。
  13. [アクション] ドロップダウンリストを選択し、[ジョブの実行] をクリックします。
    2 回目の試行が失敗すると、通知を受け取るはずです。
  14. テストが完了したら、Glue ジョブを編集し、変更を元に戻します。

この記事は役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?