🙌

Treasure DataのCLIをGoで実装

に公開

Treasure DataのCLIとしてTD Toolbeltが提供されています。
https://toolbelt.treasuredata.com/

基本的な機能はこのCLIで動作するのですが、ベースになっているtd-client-rubyが対応していないAPIも多い事もあり、CDP関連だったりPolicyだったりの対応ができていないものになります。
またToolbeltでは対応していないAPI(workflowがそうですね)については、digdagのjarを入れる必要があります。セキュリティが厳しい企業の場合はこれが問題になることもあります。

https://github.com/treasure-data/td-client-ruby

APIが公開されているのでそれを使えば良いのですが、毎度認証情報を設定して実行するのも面倒だなという事でCLI Toolを作ることにしました。Claude Codeって良いですね。

https://github.com/mickeey2525/treasuredata-go-sdk

機能

大体のAPIについて機能を実装しています。
Policy、Workflow、CDPについても機能が追加されています。

tdcli -h
Usage: tdcli <command> [flags]

Treasure Data CLI Tool

Flags:
  -h, --help                    Show context-sensitive help.
      --api-key=STRING          Treasure Data API key (format: account_id/api_key) ($TD_API_KEY)
      --region="us"             API region (us, eu, tokyo, ap02)
      --format="table"          Output format (json, table, csv)
      --output=STRING           Output to file
  -v, --verbose                 Verbose output
      --insecure-skip-verify    Skip TLS certificate verification ($TD_INSECURE_SKIP_VERIFY)
      --cert-file=STRING        Client certificate file path ($TD_CERT_FILE)
      --key-file=STRING         Client private key file path ($TD_KEY_FILE)
      --ca-file=STRING          Custom CA certificate file path ($TD_CA_FILE)

Commands:
  version                                Show version
  config show                            Show current configuration
  config set                             Set configuration value
  config get                             Get configuration value
  config init                            Initialize configuration file
  
  trino query (q)                        Execute a Trino query
  trino interactive (i,repl)             Start interactive Trino session
  trino test                             Test Trino connection
  trino describe (desc)                  Describe a table
  trino show                             Show schemas, tables, or columns
  trino explain                          Explain query execution plan
  trino version                          Show Trino version

Run "tdcli <command> --help" for more information on a command.

認証情報の設定について

tdcli config initを使うと該当のディレクトリの下にconfigが作成されます。
--global optionを使うとglobal configが作成できます。

tdcli config init -h
Usage: tdcli config init [flags]

Initialize configuration file

Flags:
  -h, --help                    Show context-sensitive help.
      --api-key=STRING          Treasure Data API key (format: account_id/api_key) ($TD_API_KEY)
      --region="us"             API region (us, eu, tokyo, ap02)
      --format="table"          Output format (json, table, csv)
      --output=STRING           Output to file
  -v, --verbose                 Verbose output
      --insecure-skip-verify    Skip TLS certificate verification ($TD_INSECURE_SKIP_VERIFY)
      --cert-file=STRING        Client certificate file path ($TD_CERT_FILE)
      --key-file=STRING         Client private key file path ($TD_KEY_FILE)
      --ca-file=STRING          Custom CA certificate file path ($TD_CA_FILE)

      --global                  Create global config (~/.tdcli/.tdcli.toml)

コマンド体系について

基本的にサブコマンドにそれぞれのAPIの機能が追加されています。
例えばworkflowについては以下のような形です。

tdcli wf
Usage: tdcli workflow (wf) <command> [flags]

Workflow management

Flags:
  -h, --help                    Show context-sensitive help.
      --api-key=STRING          Treasure Data API key (format: account_id/api_key) ($TD_API_KEY)
      --region="us"             API region (us, eu, tokyo, ap02)
      --format="table"          Output format (json, table, csv)
      --output=STRING           Output to file
  -v, --verbose                 Verbose output
      --insecure-skip-verify    Skip TLS certificate verification ($TD_INSECURE_SKIP_VERIFY)
      --cert-file=STRING        Client certificate file path ($TD_CERT_FILE)
      --key-file=STRING         Client private key file path ($TD_KEY_FILE)
      --ca-file=STRING          Custom CA certificate file path ($TD_CA_FILE)

Commands:
  workflow (wf) list (ls)              List workflows
  workflow (wf) get (show)             Get workflow details
  workflow (wf) create                 Create a new workflow
  workflow (wf) update                 Update workflow
  workflow (wf) delete (rm)            Delete workflow
  workflow (wf) start (run)            Start workflow execution
  workflow (wf) init                   Create a sample workflow project
  workflow (wf) attempts (attempt) list (ls)
                                       List workflow attempts
  workflow (wf) attempts (attempt) get (show)
                                       Get attempt details
  workflow (wf) attempts (attempt) kill
                                       Kill running attempt
  workflow (wf) attempts (attempt) retry
                                       Retry failed attempt
  workflow (wf) schedule get (show)    Get workflow schedule
  workflow (wf) schedule enable        Enable workflow schedule
  workflow (wf) schedule disable       Disable workflow schedule
  workflow (wf) schedule update        Update workflow schedule
  workflow (wf) tasks (task) list (ls)
                                       List workflow tasks
  workflow (wf) tasks (task) get (show)
                                       Get task details
  workflow (wf) logs (log) attempt     Get attempt log
  workflow (wf) logs (log) task        Get task log
  workflow (wf) projects (project,proj) list (ls)
                                       List workflow projects
  workflow (wf) projects (project,proj) get (show)
                                       Get project details
  workflow (wf) projects (project,proj) create
                                       Create a new project
  workflow (wf) projects (project,proj) push
                                       Push project from directory (alias for create)
  workflow (wf) projects (project,proj) download
                                       Download project archive and extract to directory
  workflow (wf) projects (project,proj) workflows (wf)
                                       List workflows in project
  workflow (wf) projects (project,proj) secrets (secret) list (ls)
                                       List project secrets
  workflow (wf) projects (project,proj) secrets (secret) set
                                       Set project secret
  workflow (wf) projects (project,proj) secrets (secret) delete (rm)
                                       Delete project secret
  workflow (wf) projects (project,proj) hooks (hook) show (ls,list)
                                       Show hooks configuration
  workflow (wf) projects (project,proj) hooks (hook) init
                                       Initialize hooks configuration file
  workflow (wf) projects (project,proj) hooks (hook) add
                                       Add a new hook
  workflow (wf) projects (project,proj) hooks (hook) remove (rm)
                                       Remove a hook
  workflow (wf) projects (project,proj) hooks (hook) test
                                       Validate hooks configuration

気に入ってる機能

Trinoと対話的にクエリが書ける機能
psqlのようにTreasure DataのTrinoとinteractiveにQueryをかける機能を追加しました。

❯ tdcli trino i
trino:sample_datasets> select * from www_access;
host    path    method  referer code    agent   user    size    time
----    ----    ------  ------- ----    -----   ----    ----    ----
212.201.217.44  /category/jewelry       GET     -       200     Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) -105     1412326786
188.162.87.188  /item/software/1134     GET     /category/software      200     Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)   -       118     1412326770
204.36.47.69    /category/finance       GET     /category/toys  200     Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; BTRS122159; GTB7.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; BRI/2)      -122      1412326754
24.135.92.177   /search/?c=Electronics+Electronics      POST    -       200     Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7 -       124     1412326737

最後に

Claude Codeのおかげで面倒な作業から解放されながらある程度形にできた、という気はします。
ありがたいですね。

あとこれは非公式のCLIです。
何か問題があっても公式には聞かないでください。直してほしいものや追加してほしい昨日があればIssueを立てるかPRを送ってください。

Discussion