AWS Glue ジョブが再試行に失敗したときに、Lambda 関数を使用して SNS アラートを受信するにはどうすればよいですか?
最終更新日: 2021 年 3 月 30 日
簡単な説明
AWS Glue の Amazon EventBridge イベントを使用して Amazon SNS アラートを作成できますが、アラートは特定の状況では十分に具体的でない場合があります。AWS Glue ジョブが再試行時に失敗するなど、特定の AWS Glue イベントに対して SNS 通知を受信するには、AWS Lambda を使用できます。Lambda 関数を作成して、次の操作を実行できます。
- 特定の文字列で受信イベントを確認します。
- イベント内の文字列が Lambda 関数の文字列と一致する場合は、Amazon SNS にメッセージを発行します。
AWS Lambda 関数を使用して、AWS Glue ジョブのいずれかが再試行に失敗したときに SNS から E メールを受信するには、次の手順を実行します。
- Amazon SNS トピックを作成します。
- AWS Lambda 関数を作成します。
- Lambda 関数を使用して E メール通知を開始する Amazon EventBridge イベントを作成します。
解決方法
次の項目があることを確認してください。
- AWS Glue の抽出、変換、およびロード (ETL) ジョブ
- SNS 通知を発行する権限を持つ AWS Lambda の AWS Identity and Access Management (IAM) ロール
Amazon SNS トピックを作成する
- Amazon SNS コンソールを開きます。
- [トピック] を選択し、[ トピックの作成] を選択します。
- [タイプ] で、[標準] を選択します。
- [名前] に、トピック名を入力します。
- (オプション) [表示名] に、トピックの表示名を入力します。
- [トピックの作成] を選択します。
トピックが作成されます。 - [サブスクリプションの作成] を選択します。
[トピック ARN] で、作成したトピックを選択します。
[プロトコル] で、目的のプロトコルを選択します。
[エンドポイント] では SNS 通知を受信するアドレスを入力します。 - [サブスクリプションの作成] を選択します。
サブスクリプションが作成されます。
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 ジョブで通知をテストする
- AWS Glue コンソールを開きます。
- ナビゲーション ペインで [ジョブ] を選択します。
- 通知をテストする Glue ジョブを選択します。
- [アクション] ドロップダウンリストを選択し、[ジョブの編集] をクリックします。
- [セキュリティ設定、スクリプトライブラリおよびジョブパラメータ (オプション)] を展開します。
- [セキュリティ設定] の [再試行回数] に「1」と入力します。
- [保存] を選択します。
- [ジョブ] ページで、通知をテストする Glue ジョブを選択します。
- [アクション] ドロップダウンリストを選択し、[スクリプトの編集] を選択します。
- ジョブが失敗するように、コードの要素を変更します。(例: テーブル名に「_BROKEN」という単語を追加します)。
- [保存] を選択します。
- [ジョブ] ページで、通知をテストする Glue ジョブを選択します。
- [アクション] ドロップダウンリストを選択し、[ジョブの実行] をクリックします。
2 回目の試行が失敗すると、通知を受け取るはずです。 - テストが完了したら、Glue ジョブを編集し、変更を元に戻します。