Treasure Data - Support Engineering Team blog

トレジャーデータのサポートエンジニアリングチームのブログです。

TARGET_NOT_FOUNDによりWorkflowの実行が失敗する

こんにちは。サポートチームの大村です。

今回もWorkflowでしばしば見かけるTARGET_NOT_FOUNDについてご紹介します。

事例

まずは以下のサンプルでどのようなエラーが表示されるか確認してみましょう。

次のworkflowを作成、実行します。ただし、td_runオペレータで指定するSaved Queryは実際には存在しないものとしてください。

_export:
  td:
    database: sample_datasets

+task1:
  td_run>: foo

実行してどのようなエラーメッセージが表示される確認してみましょう。

エラーメッセージを抜粋すると…

  :
2022-10-18 04:31:00.765 +0000 [WARN] (0458@[10452:o_mura_20221018_01:100657287:530139342]+o_mura_20221018_01+task1) io.digdag.standards.operator.td.TDOperator: failed to start job: domainKey=23200e06-304b-4499-8a6e-92d70649e0c0
com.treasuredata.client.TDClientHttpNotFoundException: [TARGET_NOT_FOUND] [404:Not Found] API request to /v3/schedule/run/foo/1666067452 has failed: Resource not found
    at com.treasuredata.client.TDRequestErrorHandler.defaultHttpResponseErrorResolver(TDRequestErrorHandler.java:119)
  :

[TARGET_NOT_FOUND] [404:Not Found]という形でTDへのAPIリクエストが失敗しています。

これは実際にそのターゲットとなっているもの(DataBase/Table/Sources/Saved Queryなど)が存在しないという場合(1)と存在はしているが権限がなく参照できない(2)というパターンが存在します。

存在しないターゲットを指定している場合にはそのターゲットの名前を確認し、修正すればよいのですが、存在しているが権限がないという場合はWorkflowが一体どのユーザで動作しているかを意識する必要があります。

解決方法

では、実際にどのような手順で解決していくべきか確認していきます。前述の通り、ターゲットが存在していないということであれば、修正方法が明確ですので、ターゲットが存在しているが参照できていないというパターンを詳しく見ていきます。

このパータンでは実際にどのユーザでWorkflowが実行されているかが重要になりますので、当該Workflowが一体どのユーザで実行されたのかを確認する必要があります。 Workflowは最終更新者またはtd.apikeyというシークレットで登録されたユーザの権限で動作しますので、td.apikeyというシークレットが存在しているかどうかを確認しましょう。

td.apikeyが存在しない場合

この場合にはWorkflowは最終保存者のユーザ権限で動作します。最終保存者を確認するにはWorkflowのProject Revisionsタブの最新リビジョンのEditorを確認してください。 Workflowはこちらに記載されているユーザで動作します。そのため、このユーザ(今回の場合はyuu ohmura)がターゲットに対して権限を持っているかを確認する必要があります。

例えば、前述のような"[404:Not Found] API request to /v3/schedule/run/foo/1666067452"というエラーの場合で、かつ"foo"というSaved Queryが存在する場合には、この"foo"に対して最終保存者であるyuu ohmuraがアクセス権限を持っているいるかどうかを確認する必要があります。 持っていない場合には最終保存者に対象のターゲットへのアクセス権限を付与するか他のアクセス権限を有しているユーザでWorkflowを保存し直してあげる必要があります。

td.apikeyが存在する場合

こちらの場合には残念ながらWorkflowの実行者を直接確認する方法はありません。なぜなら、シークレットに登録した情報というのは登録した本人であっても後から参照することはできないからです。 そのため、td.apikeyが存在する場合には、一旦既存のtd.apikeyを削除して、ターゲットに対してアクセス権限を有しているユーザのapikeyを再登録する必要があります。

まとめ

このようにしてTARGET_NOT_FOUNDというエラーを解消することが可能になります。Workflowはどのユーザで実行されるのかというのが少々ややこしいところがありますが、順番に確認していくことでエラーの解消はできますので、まずはサンプルを試してみてください。