以前digdag serverに認証をつける以下のような記事を書きました。
www.capybara-engineer.com
最近digdagのVersion0.10.0が新しく出ていることに遅ればせながら気づいたのですが、リリースノートを見ると認証設定が変更されたとのことなので、新しいVersionでdigdag serverに認証が設定できるか試してみます。
【実施環境】
※前回同様ある程度は過去使用した設定を流用しています
尚、英語が苦手なため英文には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
細かな変更点とリンクはこちらです。
- Authenticator の実装をシステムのプラグインとして提供するようにしました。
- JwtAuthenticator をプラグインにリファクタリングし、すべての後方互換性を保つためにデフォルトのプラグインとしました。
[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
[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
サーバは起動していないのでエラーが出ます。
実行コマンド
> digdag selfupdate
無事0.10.0にバージョンアップができました。
helpコマンドは特に差異がありませんでした。
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=)
認証付きでログインができました。
ただログを見ると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)
ブラウザからも確認ができました。
workflowファイルアップロード
認証設定されたdigdag serverに対して簡単なworkflowファイルをアップロードしてみます。
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で見てみました。
- リクエスト
- レスポンス
以下のURLに対してGETリクエストしようとしたときに失敗しているようです。
http://XXX.XXX.XXX.XXX:8080/api/version/check?client=0.10.0
今度は--basic-authオプションを使用した時のリクエストを見てみます。
と、ここで一つ大きなミスに気が付きました。
以下を見てもらうとわかるのですが、client.propertiesに記載したBasic文字列はパスワードだけbase64変換したものだったのですが、以下を見ると「ユーザ名:パスワード」をbase64変換する必要があるようです。
(前回も似たような問題にぶち当たったような。。)
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以外のところでかなり苦労しました。
何とか動かすところまでできてよかったです。