AWS Glue ジョブが再試行に失敗したときに、Lambda 関数を使用して SNS アラートを受信するにはどうすればよいですか?
AWS Glue ジョブが再試行に失敗したときに、Amazon Simple Notification Service (Amazon SNS) アラートで通知を受けたいと考えています。
簡単な説明
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. [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 ジョブで通知をテストする
- AWS Glue コンソールを開きます。
- ナビゲーションペインで、[Jobs] (ジョブ) を選択します。
- 通知をテストする AWS Glue ジョブを選択します。
- [Action](アクション) ドロップダウンリストを選択し、[Edit job] (ジョブの編集) を選択します。
- [セキュリティ設定、スクリプトライブラリおよびジョブパラメータ (オプション)] を展開します。
- [セキュリティ設定] の [再試行回数] に「1」と入力します。
- [Save] (保存) を選択します。
- [Jobs] (ジョブ) ページで、通知をテストする AWS Glue ジョブを選択します。
- [Action] (アクション) ドロップダウンリストを選択し、[Edit Script] (スクリプトの編集) を選択します。
- ジョブが失敗するように、コードの要素を変更します。(例: テーブル名に「_BROKEN」という単語を追加します)。
- [Save] (保存) を選択します。
- [Jobs] (ジョブ) ページで、通知をテストする AWS Glue ジョブを選択します。
- [Action] (アクション) ドロップダウンリストを選択し、[Run job] (ジョブの実行) を選択します。
2 回目の試行が失敗すると、通知を受け取るはずです。 - テストが完了したら、AWS Glue ジョブを編集し、変更を元に戻します。
関連情報
関連するコンテンツ
- 質問済み 1年前lg...
- 質問済み 1年前lg...
- AWS公式更新しました 1年前
- AWS公式更新しました 3年前