Secret Ninja Blog

Customer Experience Senior Directorしてます

Digdagでpython / ruby operator から Secret parameterを参照する

Digdagではsecretsパラメータを使って認証情報をdigファイル内に記載しないようにすることができる。

例えばローカルで動かすときには、

$ digdag secrets --local --set s3.access_key=xxxx

で実現できる。ちなみにローカルの場合には、~/.config/digdag/secrets/s3.access_keyに保持される。 一方でこの情報をpythonやrubyから呼び出したいときには、直接参照するメソッドは現状なさそう。 ちなみにdigdag内の変数を参照する場合は、下記のサンプルがある。

https://github.com/treasure-data/digdag/blob/master/examples/python_args.dig

# test.dig
timezone: "Asia/Tokyo"
+a:
  py>: python_args.required_arguments
  required1: "1"
  required2: 2
# python_args.py
from __future__ import print_function
import digdag
def required_arguments(required1, required2):
  print("required1 = " \+ str(required1))
  print("required2 = " \+ str(required2))

上記を実行すると下記のようになる。

$ digdag run test.dig --rerun
2017-06-09 12:00:52 +0900: Digdag v0.9.12
2017-06-09 12:00:54 +0900 [WARN] (main): Reusing the last session time
2017-06-09T00:00:00+09:00.
2017-06-09 12:00:54 +0900 [INFO] (main): Using session
/Users/takahashi/Downloads/testProject/.digdag/status/20170609T000000+0900.
2017-06-09 12:00:54 +0900 [INFO] (main): Starting a new session project id=1
workflow name=test session_time=2017-06-09T00:00:00+09:00
2017-06-09 12:00:55 +0900 [INFO] (0017@[0:default]+test+a): py>:
python_args.required_arguments
required1 = 1
required2 = 2

しかし、これにならっても、Secretの変数は参照できない。

# test.dig
timezone: "Asia/Tokyo"
_export:
  test: value
+a:
  py>: python_args.required_arguments
  required1: ${secret:s3.access_key}
  required2: ${test}
$ digdag run test.dig --rerun
2017-06-09 12:04:04 +0900: Digdag v0.9.12
2017-06-09 12:04:05 +0900 [WARN] (main): Reusing the last session time
2017-06-09T00:00:00+09:00.
2017-06-09 12:04:05 +0900 [INFO] (main): Using session
/Users/takahashi/Downloads/testProject/.digdag/status/20170609T000000+0900.
2017-06-09 12:04:05 +0900 [INFO] (main): Starting a new session project id=1
workflow name=test session_time=2017-06-09T00:00:00+09:00
2017-06-09 12:04:06 +0900 [INFO] (0017@[0:default]+test+a): py>:
python_args.required_arguments
required1 = ${secret:s3.access_key}
required2 = value

ではどうするかというと、環境変数を介することで、Secretを参照することができる。

timezone: "Asia/Tokyo"
_export:
  test: value
+a:
  py>: python_args.required_arguments
  _env:
    required1: ${secret:s3.access_key}
    required2: ${test}
from __future__ import print_function
import digdag
import os

def required_arguments(required2):
print("required1 = " \+ str(os.environ.get('required1')))
print("required2 = " \+ str(required2))
$ digdag run test.dig --rerun
2017-06-09 12:06:29 +0900: Digdag v0.9.12
2017-06-09 12:06:30 +0900 [WARN] (main): Reusing the last session time
2017-06-09T00:00:00+09:00.
2017-06-09 12:06:30 +0900 [INFO] (main): Using session
/Users/takahashi/Downloads/testProject/.digdag/status/20170609T000000+0900.
2017-06-09 12:06:30 +0900 [INFO] (main): Starting a new session project id=1
workflow name=test session_time=2017-06-09T00:00:00+09:00
2017-06-09 12:06:32 +0900 [INFO] (0017@[0:default]+test+a): py>:
python_args.required_arguments
required1 = xxxx
required2 = value
Success. Task state is saved at
/Users/takahashi/Downloads/testProject/.digdag/status/20170609T000000+0900
directory.
* Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the
last session time.
* Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped
tasks.

Rubyも同様にできるはず。。。