[AWS Glue]トリガーが自動で起動しない時の対処方法

2020.12.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部の若槻です。

AWSのETLサービスであるAWS Glueでは、トリガーを使用してジョブやクローラーを自動的に起動させることができます。

今回は、AWS Glueのトリガーがなぜか意図通りに動作せずジョブが起動しない時の対処方法を確認してみました。

トリガーの自動起動の仕様について

まず、トリガーのステート(状態)には以下の3つがあります。トリガーが開始されるためにはステートがACTIVATEDである必要があります。

  • CREATED:トリガーの作成後
  • ACTIVATED:トリガーの開始が有効
  • DEACTIVATED:トリガーの開始が無効

そして、Glueのトリガーには以下の3つのタイプがあります。

  • Scheduled:スケジュールベースのトリガー
  • Conditional:別のジョブやクローラーのステータスを条件にしたトリガー
  • On-demand:手動実行のトリガー

このうち「Scheduled」と「Conditional」は、トリガーの自動起動を開始する場合はトリガー作成時にStartOnCreationを有効にする必要があります。これによりトリガーのステートをACTIVATEDに設定することができます。

StartOnCreation – Boolean.

Set to true to start SCHEDULED and CONDITIONAL triggers when created.

--start-on-creation | --no-start-on-creation (boolean)

Set to true to start SCHEDULED and CONDITIONAL triggers when created.

また、StartOnCreationによるトリガーの開始はトリガー作成時にしか設定できないため、作成済みのトリガーのStartOnCreationが無効の場合はトリガーを再作成する必要があります。

動作確認

CloudFormationによるトリガー作成で前述の仕様を確認してみます。

下記のようにテンプレート内でGlueジョブのトリガーが定義されています。タイプはScheduleベースですがStartOnCreationは設定していません。

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  //Other Resources

  SJIStoUTF8JobGlueTrigger:
    Type: AWS::Glue::Trigger
    Properties:
      Name: sjis-to-utf8-job-glue-trigger
      Schedule: cron(0 2 * * ? *)
      Type: SCHEDULED
      Actions:
        - JobName: !Ref SJIStoUTF8GlueJob

スタックをデプロイしてトリガーを作成します。

% aws cloudformation deploy \
  --template-file template.yaml \
  --stack-name ETL-Stack \
  --capabilities CAPABILITY_NAMED_IAM \
  --no-fail-on-empty-changeset

作成したトリガーをAWS CLIで取得してみると"State": "CREATED"となっています。よってこのトリガーはスケジュールや条件を満たしてもトリガーは起動しません。

% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger
{
    "Trigger": {
        "Name": "sjis-to-utf8-job-glue-trigger",
        "Type": "SCHEDULED",
        "State": "CREATED",
        "Schedule": "cron(0 2 * * ? *)",
        "Actions": [
            {
                "JobName": "sjis-to-utf8-job"
            }
        ]
    }
}

次にリソース定義にStartOnCreation: trueを追記してリソースを更新してみます。

template.yaml

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  //Other Resources

  SJIStoUTF8JobGlueTrigger:
    Type: AWS::Glue::Trigger
    Properties:
      Name: sjis-to-utf8-job-glue-trigger
      Schedule: cron(0 2 * * ? *)
      Type: SCHEDULED
      Actions:
        - JobName: !Ref SJIStoUTF8GlueJob
      StartOnCreation: true
% aws cloudformation deploy \
  --template-file template.yaml \
  --stack-name ETL-Stack \
  --capabilities CAPABILITY_NAMED_IAM \
  --no-fail-on-empty-changeset

更新したトリガーを取得してみると、ステータスはCREATEDのまま変わっていません。引き続きトリガーは自動で開始しないようになっています。

% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger
{
    "Trigger": {
        "Name": "sjis-to-utf8-job-glue-trigger",
        "Type": "SCHEDULED",
        "State": "CREATED",
        "Schedule": "cron(0 2 * * ? *)",
        "Actions": [
            {
                "JobName": "sjis-to-utf8-job"
            }
        ]
    }
}

そこで下記のようにしてトリガーのリソースを一度削除してから再作成してみます。

  1. スタックの記述からリソース定義を削除
  2. スタックをデプロイしてAWS上から削除
  3. スタックの記述にリソース定義を追加
  4. スタックをデプロイしてAWS上に作成

こうして再作成したトリガーを取得してみると、今度はちゃんとステートがACTIVATEDとなっています。

% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger
{
    "Trigger": {
        "Name": "sjis-to-utf8-job-glue-trigger",
        "Type": "SCHEDULED",
        "State": "ACTIVATED",
        "Schedule": "cron(0 2 * * ? *)",
        "Actions": [
            {
                "JobName": "sjis-to-utf8-job"
            }
        ]
    }
}

これでGlueのトリガーをスケジュールや条件を満たした際に自動開始できるようになりました。

まとめ

Glueのトリガーが意図した通りに自動起動しない時は以下の対処を行いましょう。

  1. トリガーのステートがACTIVATEDであることを確認する
  2. ACTIVATEDでない場合は、StartOnCreationを有効にしてトリガーの再作成を行う

おわりに

AWS Glueのトリガーがなぜか意図通りに動作せずジョブが起動しない時の対処方法を確認してみました。

Glueのトリガーを使い始めた際に必ずと言って良いほどはまるポイントなので押さえておきましょう。

参考

以上