Treasure Data - Support Engineering Team blog

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

Workflowのtdオペレータの実行でAUTHENTICATION_FAILUREが出て実行に失敗する

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

今回はWorkflowで時々見かけるAUTHENTICATION_FAILUREについて、その原因と解消方法についてご紹介します。

事例

まずは実際にどんなエラーメッセージが出るか確認していきましょう。

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

  :
2022-09-16 07:42:45.743 +0000 [WARN] (0394@[11869:y_case_1:96314825:507237553]+y_case_1+task1) io.digdag.standards.operator.td.TDOperator: failed to start job: domainKey=d357cbcc-73be-4c4c-8897-a46199c95b93
com.treasuredata.client.TDClientHttpUnauthorizedException: [AUTHENTICATION_FAILURE] [401:Unauthorized] API request to /v3/job/issue/presto/l0_access_log has failed: null
  :

[AUTHENTICATION_FAILURE] [401:Unauthorized] という形でTDへのAPIリクエストがエラーになっています。

Workflowではtd*オペレータ(td>,td_load>,td_run>などなど)を使って、Treasure Dataに対してクエリを実行したり、外部サービスからデータを投入したり、逆にデータを出力したりしているかと思います。 その際には一体どのユーザとしてTreasure Dataに対してリクエスト送っているのでしょうか?

Workflowの実行ではrunボタン(手動実行の場合)をクリックしたユーザやWorkflowを最初に作成したユーザではなく、Workflowの最終保存者またはシークレットのtd.apikeyに保存されたキーのユーザが実行者になります。最終保存者が削除されていたり、指定したAPI keyが間違っていたりすると上記のエラーが出力されます。

再現方法

この事例を再現させてみましょう。 以下のような単純なWorkflowを作成し、実行してみましょう。(Project名やWorkflow名はなんでも構いません)

_export:
  td:
    database: sample_datasets

+task1:
  td>:
  query: select * from nasdaq limit 10

このWorkflowでは sample_datasets データベースの nasdaq テーブルにクエリを実行しています。このWorkflowを実行すると以下のように問題なく実行できます。

次に間違ったシークレットを登録してみましょう。td.apikeyという名前のシークレットを作成し、中身を"abc"などとしてみましょう。

この設定でWorkflowを実行すると以下のように、"[AUTHENTICATION_FAILURE] [401:Unauthorized] API request to /v3/job/issue/presto/sample_datasets has failed: null"というエラーが発生し、Workflowが失敗することになります。

解決方法

この事例の原因はユーザ認証がうまくいっていないことにあるのですが、Workflowプロジェクトにtd.apikeyをシークレットとして設定しているかしていないかで解決方法が多少異なります。

1. td.apikeyを設定している場合

この場合はtd.apikeyの中身が間違っているということになります。シークレットは既存の設定内容を確認したり、更新することは出来ませんので、一旦削除して、再登録する必要があります。

2. td.apikeyを設定していない場合

この場合は最終保存者が削除されている可能性が高いです。(1)解決方法としては既存のユーザで保存しなおすか、(2)既存のユーザのAPIキーをtd.apikeyという名前のシークレットで登録することで解決が可能です。

(1)のやり方は少々アドホックな上、複数人で開発を行っている場合にはまた同じような状況が生じる可能性があります。そこで(2)の方法であるシークレットにtd.apikeyを設定するという方法をおすすめ致します。(2)の方法であれば、ユーザを削除してもAPIキーを引き継ぐことでエラーになることはありません。(デフォルトではaccount ownerにAPIキーを引き継ぎますが、他のユーザに移行することも可能です)

こちらを設定すれば、今後、Workflowの更新を行ってもWorkflowの実行者が変わることはありませんので、安心してWorkflowの更新が可能です。 是非、活用ください。

シークレットの設定方法についてはこちらをご確認ください。 docs.treasuredata.com

ユーザ削除時のAPIキーの引き継ぎに関しましてはこちらのドキュメントを確認ください。 docs.treasuredata.com