カピバラ好きなエンジニアブログ

ITのこととか趣味のカメラのことなどを赴くままに書いていきます。カピバラの可愛さこそ至高。

digdag v0.10.0でdigdag serverへの認証を設定する

以前digdag serverに認証をつける以下のような記事を書きました。
www.capybara-engineer.com


最近digdagのVersion0.10.0が新しく出ていることに遅ればせながら気づいたのですが、リリースノートを見ると認証設定が変更されたとのことなので、新しいVersionでdigdag serverに認証が設定できるか試してみます。


【実施環境】

  • Cloud:AWS
  • OS:Windows Server 2019
  • IIS:Version 10.0.17763.1
  • digdag:0.10.0

※前回同様ある程度は過去使用した設定を流用しています


尚、英語が苦手なため英文にはDeepL翻訳を使用しています。

この記事でわかること

  • v0.9.42からv0.10.0にアップデートしても、server.propertiesファイルの設定そのままで認証済みdigdag serverは動く
  • ただし、v0.10.0で非推奨になった認証パラメータがあるので、その箇所のみ修正がしたほうがよい(動作は変わらない)
  • workflowファイルのアップロード時に--basic-authオプションでユーザ/パスで設定可能
  • client.propertiesファイルで認証設定serverにworkflowファイルをアップロードしたいときは、"ユーザ名:パスワード"をbase64変換した文字列を設定する


実施作業

Version 0.10.0での変更点

新しいバージョンでの変更点は以下のリリースノートに書いています。
docs.digdag.io


日本語訳版

Command Executor の SPI が更新され、AWS ECS Command Executor が導入されました。[#835 #1127]
Java11 がサポートされました。(実験的) [#1256 #1361]Graaljs が ConfigEvalEngine でサポートされました。
Graaljs が ConfigEvalEngine でサポートされ、パフォーマンスが劇的に向上しました。[#1256 #1361]
AccessControllerのSPIが導入されました。(実験的) [#936]
メトリクスの改善。(実験的) [#1146]
認証設定を変更しました。[#1324]
JWT認証を廃止しました。[#1324]
一部のAPIを廃止・変更しました。[#1109 #1110 #1114 #1115 #1224 #1288 #1398 #1401]
_parallel オプションは、並列数を制御するための数値をサポートします。[#1413]
タスクの最大数と試行回数を設定できるようになりました。[#1430]
ドキュメントの追加 コミュニティへの貢献。[#1527]
Gradleを6.3にアップグレードしました。[#1391]


認証設定関連の変更点

認証設定に関連するPRは以下になります。
github.com


細かな変更点とリンクはこちらです。

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • Authenticator SPIのマージを修正

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub
[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • サーバー用のBasic Auth Authenticatorプラグインを追加しました。
  • basic-authのCLIクライアントオプションを追加しました。

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • #1098以降に追加された基本認証機能をデフォルトの認証機能として使用します。
  • システム

プラグイン機構が AuthenticatorFactory SPI に対して意図的に動作するように、ドキュメントおよびテストの変更が含まれます。
[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • Immutableのデフォルト・メソッドのビルド・エラーを修正しました。

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • 基本認証のadminパラメータを再実装し、AdminITを修正する。

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

  • JWTテストの削除

[Master to v0_10] Authenticator SPI by frsyuki · Pull Request #1324 · treasure-data/digdag · GitHub

この記事で対象としている主な変更点

今回特に気になる変更点としては以下の5つです。

  • server.authenticator-classの設定が非推奨になり、代わりにserver.authenticator.typeを使用する
  • server.authenticator .type = basicはデフォルトで有効
  • basicauth.usernameとbasicauth.passwordの非推奨
  • server.authenticator.basic.usernameが設定されていない場合は認証されない
  • --basic-authオプションの追加


digdag最新化

まずは今使用しているdigdagを最新化させます。
以下の記事を参考にさせていただきました。
www.task-notes.com


サーバは起動していないのでエラーが出ます。
f:id:live-your-life-dd18:20210412202223p:plain


実行コマンド

> digdag selfupdate



無事0.10.0にバージョンアップができました。
f:id:live-your-life-dd18:20210412203632p:plain


helpコマンドは特に差異がありませんでした。
f:id:live-your-life-dd18:20210412203815p:plain

digdag server設定

まずは前回と同じserver.propertiesの設定でサーバを起動します。

server.bind = 0.0.0.0
server.port = 65432
server.admin.bind = 0.0.0.0
server.admin.port = 65433
server.access-log.path=C:\opt\digdag\logs\accesslog
server.access-log.pattern=json
server.authenticator-class=io.digdag.standards.auth.basic.BasicAuthenticator
basicauth.username=Administrator
basicauth.password=XXXXXXXXXXXXXXXXXXXXXXXXXX
basicauth.admin = true
database.type=postgresql
database.user=digdag_role
database.password=XXXXX
database.host=127.0.0.1
database.port=50119
database.database=digdag_db
database.maximumPoolSize=32
log-server.type=local
log-server.local.path=C:\opt\digdag\tasklog
log-server.local.split_size=10240



エラーが出ました。
内容を見る限りログのパスに\を使用していることが原因のようなので、/に修正して再度実行します。

> digdag server -c .\server.properties
2021-04-12 12:47:37 +0000: Digdag v0.10.0
2021-04-12 12:47:39 +0000 [ERROR] (main): Setting server.authenticator-class is deprecated and ignored. Use server.authenticator.type instead
2021-04-12 12:47:41 +0000 [WARN] (main): Setting basicauth.username or basicauth.password works but is deprecated. It is going to be removed in a near future version. Use server.authenticator.basic.username and server.authenticator.basic.password instead.
2021-04-12 12:47:41 +0000 [INFO] (main): secret encryption engine: disabled
2021-04-12 12:47:41 +0000 [INFO] (main): Applying database migration:20200716114008
2021-04-12 12:47:41 +0000 [INFO] (main): Applying database migration:20200803184355
2021-04-12 12:47:41 +0000 [INFO] (main): 2 migrations applied.
error: com.google.inject.CreationException: Unable to create injector, see the following errors:

1) Error injecting constructor, java.nio.file.InvalidPathException: Illegal char <      > at index 11: C:optdigdag      asklog
  at io.digdag.core.log.LocalFileLogServerFactory.<init>(LocalFileLogServerFactory.java:39)
  while locating io.digdag.core.log.LocalFileLogServerFactory
  at io.digdag.core.log.LogModule.configure(LogModule.java:20) (via modules: com.google.inject.util.Modules$OverrideModule -> com.google.inject.util.Modules$OverrideModule -> io.digdag.core.log.LogModule)
  while locating io.digdag.spi.LogServerFactory annotated with @com.google.inject.internal.Element(setName=,uniqueId=3, type=MULTIBINDER, keyType=)



認証付きでログインができました。
f:id:live-your-life-dd18:20210413115409p:plain


ただログを見るとWARNINGが出ているので、これが出ないように修正します。

2021-04-12 12:50:22 +0000 [WARN] (main): Setting basicauth.username or basicauth.password works but is deprecated. It is going to be removed in a near future version. Use server.authenticator.basic.username and server.authenticator.basic.password instead.


server.properties修正

新しいバージョンでの修正点を踏まえてファイルを更新しました。

server.bind = 0.0.0.0
server.port = 65432
server.admin.bind = 0.0.0.0
server.admin.port = 65433
server.access-log.path=C:/opt/digdag/logs/accesslog
server.access-log.pattern=json
server.authenticator.type=basic
server.authenticator.basic.username=Administrator
server.authenticator.basic.password=XXXXXXXXXXXXXXXXXXXXXXXXXX
basicauth.admin = true
database.type=postgresql
database.user=digdag_role
database.password=XXXXX
database.host=127.0.0.1
database.port=55432
database.database=digdag_db
database.maximumPoolSize=32
log-server.type=local
log-server.local.path=C:/opt/digdag/tasklog
log-server.local.split_size=10240



変更箇所は以下です。

  • server.authenticator-class削除
  • server.authenticator.type追加
  • basicauth.username/basicauth.password削除
  • server.authenticator.basic.username/server.authenticator.basic.password削除



再度実行したところWARNINGは出力されなくなりました。

> digdag server -c .\server.properties
2021-04-12 13:02:16 +0000: Digdag v0.10.0
2021-04-12 13:02:18 +0000 [INFO] (main): secret encryption engine: disabled
2021-04-12 13:02:19 +0000 [INFO] (main): XNIO version 3.3.6.Final
2021-04-12 13:02:19 +0000 [INFO] (main): XNIO NIO Implementation Version 3.3.6.Final
2021-04-12 13:02:19 +0000 [INFO] (main): Starting server on 0.0.0.0:65432, 0.0.0.0:65433
2021-04-12 13:02:20 +0000 [INFO] (main): Bound on 0:0:0:0:0:0:0:0:65433 (admin)
2021-04-12 13:02:20 +0000 [INFO] (main): Bound on 0:0:0:0:0:0:0:0:65432 (api)



ブラウザからも確認ができました。
f:id:live-your-life-dd18:20210413115409p:plain

workflowファイルアップロード

認証設定されたdigdag serverに対して簡単なworkflowファイルをアップロードしてみます。
f:id:live-your-life-dd18:20210412221226p:plain


digdagコマンドに--basic-authオプションをつけて実行してみます。


パスワードに記号が入っているせいかエラーが出ました。

> $user="administrator"
> $pass='XXXXXXXXXXXXXXXXXXXXXXXXXX'
> digdag push .\sample.dig --endpoint "http://HOSTNAME:8080/" --basic-auth "${user}:${pass}"

[パスワード] の使い方が誤っています。



clientファイルを作成して、パスワードをbase64変換したパラメータを記載します。
cオプションでclientファイルを指定して実行してみます。

  • client.properties
client.http.headers.Authorization=Basic XXXXXXXXXXXXXXXXX
  • 実行結果
> digdag push test --project .\sample -c .\client\client.properties
2021-04-12 13:40:05 +0000: Digdag v0.10.0
Creating .digdag\tmp\archive-5581016028517753422.tar.gz...
  Archiving embulk_run.dig
  Archiving sample.dig
Workflows:
  embulk_run.dig
  sample.dig
error: Status code 401: HTTP 401 Unauthorized



401エラーが出ました。もう少し調べてみます。

追加調査

最初--basic-authオプションを付けたときにパスワード文字列が良くなかったのでエラーが出ましたが、新しくユーザとパスワードを発行して試してみます。


成功しました。
やっぱり問題はAdministratorのパスワードにあったようです。

> digdag push test --project .\sample --basic-auth 'digdag_user:XXXXXXX'
2021-04-12 13:47:12 +0000: Digdag v0.10.0
Creating .digdag\tmp\archive-4195561674887998245.tar.gz...
  Archiving embulk_run.dig
  Archiving sample.dig
Workflows:
  embulk_run.dig
  sample.dig
Uploaded:
  id: 1
  name: test
  revision: aee48ca1-b9ee-4d82-8655-61f0fea75346
  archive type: db
  project created at: 2020-10-27T11:38:09Z
  revision updated at: 2021-04-12T13:47:14Z

Use `digdag workflows` to show all workflows.



こうなってくると気になるのが、v0.9.42だとできていたclient.http.headers.Authorizationパラメータを使用したアップロードが何故失敗しているのかです。

client.propertiesでアップロードしようとしているときの通信をwiresharkで見てみました。

f:id:live-your-life-dd18:20210413110647p:plain

  • レスポンス

f:id:live-your-life-dd18:20210413110721p:plain


以下のURLに対してGETリクエストしようとしたときに失敗しているようです。

http://XXX.XXX.XXX.XXX:8080/api/version/check?client=0.10.0



今度は--basic-authオプションを使用した時のリクエストを見てみます。
と、ここで一つ大きなミスに気が付きました。

以下を見てもらうとわかるのですが、client.propertiesに記載したBasic文字列はパスワードだけbase64変換したものだったのですが、以下を見ると「ユーザ名:パスワード」をbase64変換する必要があるようです。
(前回も似たような問題にぶち当たったような。。)
f:id:live-your-life-dd18:20210413112330p:plain


client.propertiesファイルの記載を以下のように修正します。

client.http.headers.Authorization=Basic ["ユーザ名:パスワード"をbase64変換した文字列]
client.http.endpoint=http://XXX.XXX.XXX.XXX:8080/



修正後にpushコマンドを実行すると401エラーが出ずにアップロードができました。

> digdag push test --project .\sample -c .\client\client.properties
2021-04-13 02:27:20 +0000: Digdag v0.10.0
Creating .digdag\tmp\archive-7020465453476263200.tar.gz...
  Archiving embulk_run.dig
  Archiving sample.dig
Workflows:
  embulk_run.dig
  sample.dig
Uploaded:
  id: 1
  name: test
  revision: 1c656e89-20b8-42fd-843b-77ea62e4564a
  archive type: db
  project created at: 2020-10-27T11:38:09Z
  revision updated at: 2021-04-13T02:27:24Z

Use `digdag workflows` to show all workflows.


感想及び所感

久々に動かしてみるとpostgresが機能していなかったり等digdag以外のところでかなり苦労しました。
何とか動かすところまでできてよかったです。