TreasureDataのWrite-only keyについて


概要

Write-only keyで参照権限しかないテーブルへのINSERTができるか調べたメモを残しておきます。

GUI (web-console)

よく利用するwebコンソールから実行できるか確認してみると

どうやら、API Keyを指定して実行する設定画面が見当たらない。
API KEYを使ってのクエリ実行はできないみたい・・・

tdコマンド

次にtdコマンドを使って、できないか確認する。

ターミナル
$ td
usage: td [options] COMMAND [args]

options:
  -c, --config PATH                path to the configuration file (default: ~/.td/td.conf)
  -k, --apikey KEY                 use this API key instead of reading the config file

       ・
       ・
       ・

-k オプションで API KEYが指定可能なようです。
早速実行してみる。

ターミナル
$ td -k {Write-only key} query -d hoge_db -T hive -w "INSERT OVERWRITE TABLE users SELECT td_global_id FROM fuga_db.access_log LIMIT 1;"
List databases failed: Access denied
Use 'td database:list' to show the list of databases.

エラーとなりました。
アクセスできないと言われているようです。

マスターキーを使ったら、問題なく実行できました。
キー指定はできるが、Write-only keyでは無理なようです。

Treasure Workflow

次にTreasureWorkflowを使ってみる。
「td wf secrets」コマンドで、apikeyをセットする。

ターミナル
$ td wf secrets --project hoge-pjt --set write-only.apikey
write-only.apikey:******************

secret keyを指定したdigファイルを作成する。

./hoge-pjt.dig
timezone: Asia/Tokyo

schedule:
  daily>: 06:00:00

_export:
  td:
    database: hoge

+update_users:
  _secrets:
    td:
      apikey:write-only.apikey
  td>: sql/users.sql
  engine: hive
  create_table: users

実行するクエリを作成する。

./sql/users.sql
WITH tmp AS (
  SELECT
    td_global_id 
  FROM
    fuga.access_log
  WHERE
    TD_TIME_RANGE(time, td_time_add(TD_SCHEDULED_TIME(), '-1d'), TD_SCHEDULED_TIME())
    AND td_global_id IS NOT NULL AND td_global_id <> ''
)

-- DIGDAG_INSERT_LINE
SELECT * FROM tmp

workflowを登録する。

ターミナル
$ td wf push hoge-pjt

workflowを実行してみる。

ターミナル
$ td wf start hoge-pjt hoge-pjt --session now

エラーになりました。

ログ
[403:Forbidden] API request to /v3/job/issue/hive/hoge has failed: Access denied

apikeyをmasterキーに変えてみるとWorkflowが正常に実行できる。
やはり、Write-only keyではダメなようです。

マニュアルと見てみると確かにimportはNGとなっている見たい。

Notice:
1. ...
2. ...
3. INSERT INTO requires the ability to execute a query, which is not allowed using a Write-only API key.

気づかなかった...

まとめ

javascript SDKやアプリからのログ書き込みの時だけ、Write-onlyキーを使い、それ以外は、masterキーが必要となる。

参考サイト