ワークフロー実行の修復と再開 - AWS Glue

ワークフロー実行の修復と再開

ワークフロー内の 1 つ以上のノード (ジョブまたはクローラ) が正常に完了しない場合、ワークフローは部分的にしか実行されなかったことを意味します。この根本原因を見つけて修正した上で、ワークフローの実行を再開するノードを 1 つ以上選択し、対象のワークフローを再開します。選択したノードと、それらのノードの下流にあるすべてのノードが実行されます。

ワークフロー実行の再開の仕組み

次の図にある、ワークフロー W1 について考えてみます。

ここでは、トリガーは長方形内に表示され、ジョブは円内に表示されています。左側にあるトリガー T1 は、ジョブ J1 を実行することでワークフローを開始します。後続にもトリガーとジョブがありますが、ジョブ J2 と J3 が失敗するため、その下流にあるトリガーとジョブは実行されていないことが分かります。

ワークフロー実行は以下のように進行します。

  1. トリガー T1 が、ジョブ J1 を開始します。

  2. J1 が正常に完了すると、T2 と T3 がトリガーされ、それぞれジョブ J2 と J3 が実行されます。

  3. ジョブ J2 と J3 が失敗します。

  4. トリガー T4 と T5 は、J2 と J3 の正常な完了に依存するため、これらのトリガーは起動せずジョブ J4 と J5 も実行されません。ワークフロー W1 は部分的にのみ実行されます。

ここで、J2 と J3 の失敗の原因となった問題が修正されたとします。ワークフローの実行を再開する開始点として、J2 および J3 が選択されます。

ジョブ J2 と J3 には、再開するノードとしてフラグが付けられます。下流にあるトリガーとジョブが正常に実行されたことが表示されます。

ワークフローの実行は以下のように再開されます。

  1. ジョブ J2 および J3 が正常に実行されます。

  2. T4 と T5 がトリガーされます。

  3. ジョブ J4 および J5 が正常に実行されます。

実行が再開されたワークフローは、新しい実行 ID を持つ別のワークフローとして追跡されます。ワークフロー履歴を表示することで、以前に行われたすべてのワークフロー実行の実行 ID を表示できます。次のスクリーンショットの例では、実行 ID wr_c7a22... (2 行目) を持つワークフローには、完了できなかったノードがあります。ユーザーが問題を解決し、ワークフローの実行を再開しました。その結果が、実行 ID wr_a07e55... (1 行目) として示されています。

ワークフローの [History] (履歴) タブの下にあるテーブルには、ワークフロー実行ごとに 1 つずつ、2 つの行が表示されています。1 行目には、実行 ID と、以前の実行 ID の両方が含まれています。2 行目に表示されているのは、実行 ID のみです。最初の行にある以前の実行 ID は、2 行目での実行 ID と同じです。
注記

この説明の残りの部分では、「再開されたワークフロー実行」という表現は、以前のワークフロー実行が再開された際に作成されたワークフロー実行のことを指します。「元のワークフロー実行」とは、部分的にしか実行されず、再開する必要があったワークフロー実行を指します。

再開されたワークフロー実行のグラフ

再開されたワークフロー実行では、ノードのサブセットのみが実行されますが、実行のグラフは完全な形で表示されます。つまり、再開されたワークフローで実行されなかったノードは、元のワークフロー実行の実行グラフからコピーされています。元のワークフロー実行で実行され、グラフにコピーされたジョブおよびクローラーのノードには、実行の詳細が含まれます。

前の図のワークフロー W1 について、もう一度考えてみます。ワークフロー実行が J2 および J3 から再開されると、再開されたワークフロー実行の実行グラフには、すべてのジョブ (J1 ~ J5)、およびすべてのトリガー (T1 ~ T5) が表示されます。J1 の実行に関する詳細が、元のワークフロー実行からコピーされます。

ワークフロー実行のスナップショット

ワークフローの実行が開始されると、AWS Glue は、その時点でのワークフロー設計グラフのスナップショットを作成します。スナップショットの使用期間は、ワークフローの実行中です。実行の開始後にトリガーを変更した場合、その変更は、実行中のワークフローには影響しません。スナップショットを使用すると、ワークフローの実行を一貫した方法で行うことができます。

スナップショットでは、トリガーのみが不変になります。ワークフローの実行中に下流のジョブとクローラに加えた変更は、その時点の実行に対しても有効になります。

ワークフロー実行を再開する

ワークフローの実行を再開するには、以下の手順に従います。ワークフロー実行は、AWS Glue コンソール、API、または AWS Command Line Interface (AWS CLI) により再開させることができます。

ワークフロー実行を再開するには (コンソール)
  1. https://console.aws.amazon.com/glue/ で AWS Glue コンソール を開きます。

    ワークフローを表示し、その実行を再開するためのアクセス許可を持つユーザーとして、サインインします。

    注記

    ワークフローの実行を再開するには、glue:ResumeWorkflowRun AWS Identity and Access Management(IAM) のアクセス許可が必要です。

  2. ナビゲーションペインで、[Workflows] (ワークフロー) をクリックします。

  3. ワークフローを選択し、[History] (履歴) タブを選択します。

  4. 部分的にしか実行されていないワークフロー実行を選択し、[View run details] (実行の詳細を表示する) をクリックします。

  5. 実行グラフで、再起動しワークフロー実行の再開ポイントとする、最初の (または唯一の) ノードを選択します。

  6. グラフの右側にある詳細ペインで、[Resume] (再開) チェックボックスをオンにします。

    実行グラフには、失敗したジョブノードを含む 3 つのノードが表示されます。右側のジョブ詳細ペインには、[Resume] (再開) チェックボックスが表示されます。

    ノードの色が変わり、右上に小さな [Resume] (再開) アイコンが表示されます。

    実行グラフへの変更点に関し、説明するテキストが表示されます。[Resume ] (再開) チェックボックスはオンになっています。
  7. 再起動する追加のノードについて、前述の 2 つのステップを完了します。

  8. [Resume run] (実行を再開) をクリックします。

ワークフロー実行を再開するには (AWS CLI)
  1. glue:ResumeWorkflowRun IAM アクセス許可が付与されていることを確認します。

  2. 再起動するノードのノード ID を取得します。

    1. 元のワークフロー実行のために、get-workflow-run コマンドを実行します。ワークフロー名と実行 ID を指定し、次の例に示すように、--include-graph オプションを追加します。コンソールの [History] (履歴) タブから実行 ID を取得します。もしくは get-workflow コマンドを実行し取得します。

      aws glue get-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --include-graph

      このコマンドは、グラフのノードとエッジを大きな JSON オブジェクトとして返します。

    2. ノードオブジェクトの Type および Name プロパティごとに、対象としているノードを見つけます。

      次に、出力されるノードオブジェクトの例を示します。

      {
          "Type": "JOB",
          "Name": "test1_post_failure_4592978",
          "UniqueId": "wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd",
          "JobDetails": {
              "JobRuns": [
                  {
                      "Id": "jr_690b9f7fc5cb399204bc542c6c956f39934496a5d665a42de891e5b01f59e613",
                      "Attempt": 0,
                      "TriggerName": "test1_aggregate_failure_649b2432",
                      "JobName": "test1_post_failure_4592978",
                      "StartedOn": 1595358275.375,
                      "LastModifiedOn": 1595358298.785,
                      "CompletedOn": 1595358298.785,
                      "JobRunState": "FAILED",
                      "PredecessorRuns": [],
                      "AllocatedCapacity": 0,
                      "ExecutionTime": 16,
                      "Timeout": 2880,
                      "MaxCapacity": 0.0625,
                      "LogGroupName": "/aws-glue/python-jobs"
                  }
              ]
          }
      }
    3. ノードオブジェクトの UniqueId プロパティから、ノード ID を取得します。

  3. resume-workflow-run コマンドを実行します。次の例に示すように、ワークフロー名、実行 ID、およびノード ID のスペース区切りのリストを指定します。

    aws glue resume-workflow-run --name cloudtrailtest1 --run-id wr_a07e55f2087afdd415a404403f644a4265278f68b13ba3da08c71924ebe3c3a8 --node-ids wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3 wnode_d1b2563c503078b153142ee76ce545fe5ceef66e053628a786ddd74a05da86fd

    このコマンドは、再開された (新しい) ワークフローの実行の ID と、開始されるノードのリストを出力します。

    {
        "RunId": "wr_2ada0d3209a262fc1156e4291134b3bd643491bcfb0ceead30bd3e4efac24de9",
        "NodeIds": [
            "wnode_ca1f63e918fb855e063aed2f42ec5762ccf71b80082ae2eb5daeb8052442f2f3"
        ]
    }
    

    この例での resume-workflow-run コマンドでは再起動するノード 2 つをリストしていますが、出力例では 1 つのノードのみが再起動されると表示していることに注意してください。これは、1 つのノードが他のノードの下流にあり、いずれにせよ、この下流のノードはワークフローの通常のフローによって再開されるためです。

ワークフロー実行の再開に関する注意と制限事項

ワークフロー実行を再開する場合には、次の注意事項と制限事項に留意してください。

  • 実行を再開できるのは、COMPLETED 状態のワークフローのみです。

    注記

    ワークフロー実行の中で 1 つ以上のノードが未完了の場合でも、ワークフロー実行の状態は COMPLETED となります。実行グラフをチェックして、正常に完了しなかったノードを見つける必要があります。

  • 元のワークフロー実行により実行が試みられた任意のジョブまたはクローラのノードから、ワークフロー実行を再開することができます。トリガーノードからは、ワークフロー実行を再開することはできません。

  • ノードを再起動しても、その状態はリセットされません。処理が部分的に完了しているデータのロールバックは行われません。

  • 同じワークフロー実行を、複数回再開することが可能です。再開されたワークフローの実行が部分的にしか実行されない場合は、その問題に対処した上で実行を再開します。

  • 再起動のために 2 つのノードを選択し、それらが互いに依存している場合には、上流にあるノードが下流ノードより先に実行されます。実際、下流にあるノードはワークフローの通常のフローによって実行されるため、このノードを選択することは冗長的となります。