web-dev-qa-db-ja.com

AWSGlueジョブの最後にAWSLambda関数をトリガーする方法はありますか?

現在、AWS Glueジョブを使用してデータをRedShiftにロードしていますが、そのロード後、おそらくAWSLambda関数を使用していくつかのデータクレンジングタスクを実行する必要があります。 Glueジョブの最後にLambda関数をトリガーする方法はありますか? Lambda関数はSNSメッセージを使用してトリガーできますが、Glueジョブの最後にSNSを送信する方法が見つかりませんでした。

5
dd.

いいえ。現在、Glueジョブの終了時にラムダ関数をトリガーすることはできません。これは、このトリガーがLambdaのAWSによってまだ提供されていないためです。ラムダ関数を作成した後にAWSラムダトリガーのリストを見ると、ほとんどのAWSサービスがトリガーとして含まれていますが、AWSGlueは含まれていないことがわかります。したがって、現時点では不可能ですが、将来的には可能性があります。

ただし、ラムダpythonスクリプトを使用して、グルースクリプトのフローを実際に制御できることをお伝えしたいと思います(Pythonを使用して実行しました。これをサポートする他の言語があると確信しています)。私の使用例は、S3バケットにオブジェクトをアップロードするたびに、オブジェクトファイルを読み取ってグルージョブを開始するラムダ関数トリガーを取得することでした。グルージョブのステータスが完了すると、ファイルをに書き戻します。このLambda関数にリンクされたS3バケット。

4
CodeHunter

@ore​​oluwaは正しいです。これは、CloudwatchEventsを使用して実行できます。

Cloudwatchダッシュボードから:

  • 左側のメニューから「ルール」をクリックします
  • 「イベントソース」で「イベントパターン」を選択し、「サービス名」で「接着剤」を選択します
  • [イベントタイプ]で[接着剤ジョブ状態の変更]を選択します
  • ページの右側の[ターゲット]セクションで、[ターゲットの追加]-> [ラムダ関数]をクリックしてから、関数を選択します。

ラムダで開催されるイベントの形式は次のとおりです。

{
    'version': '0',
    'id': 'a9bc90be-xx00-03e0-9bc5-a0a0a0a0a0a0',
    'detail-type': 'GlueJobStateChange',
    'source': 'aws.glue',
    'account': 'xxxxxxxxxx',
    'time': '2018-05-10T16: 17: 03Z',
    'region': 'us-east-2',
    'resources': [],
    'detail': {
        'jobName': 'xxxx_myjobname_yyyy',
        'severity': 'INFO',
        'state': 'SUCCEEDED',
        'jobRunId': 'jr_565465465446788dfdsdf546545454654546546465454654',
        'message': 'Jobrunsucceeded'
    }
}
12
ace

AWS GlueがPythonのサポートを開始したので、おそらく以下のパスに従って、目的を達成できます。以下のサンプルスクリプトは、その方法を示しています-

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import boto3   ## Step-2

## @params: [JOB_NAME]
args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)

## Do all ETL stuff here

## Once the ETL completes
lambda_client = boto3.client('lambda')  ## Step-3
response = lambda_client.invoke(FunctionName='string')  ## Step-4
  1. pythonベースのGlueジョブを作成します(RedshiftでETLを実行するため)
  2. ジョブスクリプトで、boto3をインポートします(このパッケージをスクリプトライブラリとして配置する必要があります)。
  3. Boto3を使用してラムダに接続します
  4. ETLが完了したら、boto3ラムダinvoke()を使用してラムダ関数を呼び出します。

Glueジョブの作成中に使用しているロールに、ラムダ関数を呼び出す権限があることを確認してください。

ラムダについては、Boto3のドキュメントを参照してください ここ

3
Kamlesh Gallani

@aceと@adeelにはソリューションの一部がありますが、次のイベントパターンでCloudWatch Ruleを作成することで、これを解決できます。

{
  "source": [
    "aws.glue"
  ],
  "detail-type": [
    "Glue Job State Change"
  ],
  "detail": {
    "jobName": [
      "<YourJobName>"
    ],
    "state": [
      "SUCCEEDED"
    ]
  }
}
0
MikeRogers

ラムダはS3プットでトリガーできます。最後の接着ジョブとして、ダミーファイルをS3に配置できます。これにより、ラムダがトリガーされます。私はこれをテストしました。

0
Raman