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

最終更新日: 2023 年 1 月 12 日

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.    [Create function] (関数の作成) を選択します。

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

[一から作成] を選択します。
[Function name] (関数名) で、関数の名前を入力します。
[Runtime] (ランタイム) で、Python オプションのいずれかを選択します (スクリプトの互換性を保つため、Python 3.7 を使用するのがベストプラクティスです)。
[Change default execution role] (デフォルトの実行ロールの変更) ドロップダウンリストを展開します。
[Execution role] (実行ロール) で、[Use an existing role] (既存のロールを使用) を選択します。
[既存のロール] で、SNS 通知を送信する権限を持つ IAM ロールを選択します。

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

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

# Import modules
import json
import logging
import boto3

# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# Set up Boto3 client for SNS
client = boto3.client('sns')

# Variables for the SNS:
SNS_TOPIC_ARN = "arn:aws:sns:us-east-1:012345678901:Glue_Job_Failure_Notification"


# Define Lambda function
def lambda_handler(event, context):
    logger.info(f"## INITIATED BY EVENT: \n{event['detail']}")
    # Define variables based on the event
    glue_job_name = event['detail']['jobName']
    jobrun_id = event['detail']['jobRunId']

    # Only send SNS notification if the event pattern contains _attempt_1
    if event['detail']['jobRunId'].endswith('_attempt_1'):
        logger.info(f'## GLUE JOB FAILED RETRY: {glue_job_name}')
        message = "A Glue Job has failed after attempting to retry. "\
            + f"JobName: {glue_job_name}, JobRunID: {jobrun_id}"
        logger.info(message)
        client.publish(
            TargetArn=SNS_TOPIC_ARN,
            Message=json.dumps({'default': json.dumps(message)}),
            Subject='An AWS Glue Job has failed',
            MessageStructure='json')

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

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

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


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