embulk に環境変数で接続情報を渡す

tl;dr;

embulk で環境変数を処理することができる.liquid

について紹介。これを使うことで、docker image を複数環境で起動することができるようになる。

公式ドキュメント

以下のような記載がある。

https://www.embulk.org/docs/built-in.html

試してみた

準備

以下のようなディレクトリ構成

“`
├── Dockerfile
└── config.yml.liquid

“`

それぞれ中身は以下の通り

FROM java:8
MAINTAINER sumito.tsukada "tsukada@sumito.jp"
 
ENV EMBULK_VERSION 0.9.23
 
RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery

COPY config.yml.liquid /work/
 
WORKDIR /work
ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]

受け取る側には {{env.}} を接頭辞として付ける。

in:
  type: mysql
  user: {{env.DB_USER}}
  password: {{env.DB_PASS}}
  database: {{env.DB_NAME}}
  host: {{env.DB_HOST}}
  query: {{env.DB_QUERY}}
out: {type: stdout}

build

docker build コマンドでビルドする。

$ docker build -t tsukada/embulk .
Sending build context to Docker daemon  3.072kB
Step 1/9 : FROM java:8
 ---> d23bdf5b1b1b
Step 2/9 : MAINTAINER sumito.tsukada "tsukada@sumito.jp"
 ---> Using cache
 ---> 5fc85815e7bd
Step 3/9 : ENV EMBULK_VERSION 0.9.23
 ---> Using cache
 ---> d449016ef749
Step 4/9 : RUN curl -L https://bintray.com/artifact/download/embulk/maven/embulk-${EMBULK_VERSION}.jar -o /opt/embulk.jar
 ---> Using cache
 ---> ea1d918c1c64
Step 5/9 : RUN java -jar /opt/embulk.jar gem install embulk-input-mysql
 ---> Using cache
 ---> e7057cd4cefe
Step 6/9 : RUN java -jar /opt/embulk.jar gem install embulk-output-bigquery
 ---> Using cache
 ---> 01d70f5dc598
Step 7/9 : COPY config.yml.liquid /work/
 ---> Using cache
 ---> 8f7529947df8
Step 8/9 : WORKDIR /work
 ---> Using cache
 ---> 7d4b1d4ea599
Step 9/9 : ENTRYPOINT ["java", "-jar", "/opt/embulk.jar", "run", "/work/config.yml.liquid"]
 ---> Using cache
 ---> 8161e0f70fde
Successfully built 8161e0f70fde
Successfully tagged tsukada/embulk:latest

使い方

環境変数に接続先情報や、クエリの情報を渡す。

$ docker run -e DB_USER=tsukada -e DB_PASS=password -e DB_NAME=database -e DB_HOST=hogehoge.ap-northeast-1.rds.amazonaws.com  -e DB_QUERY="select * from sample" --rm -it tsukada/embulk
2020-02-18 03:43:44.882 +0000: Embulk v0.9.23
(中略)
2020-02-18 03:43:52.822 +0000 [INFO] (0015:task-0000): > 0.00 seconds
1,tsukada,hoge,,2020-02-14 09:14:31,2020-02-14 09:14:32,84,004,2020-02-14 09:14:31,2020-02-14 09:14:31
2020-02-18 03:43:52.913 +0000 [INFO] (0001:transaction): {done:  1 / 1, running: 0}
2020-02-18 03:43:52.917 +0000 [INFO] (main): Committed.
2020-02-18 03:43:52.917 +0000 [INFO] (main): Next config diff: {"in":{},"out":{}}

.liquid ファイル内では env. で受け取るが、docker 起動する際に渡す環境変数には、env を付けづに実行する。

無事データを取得することができた。

所感

これを使えば、コンテナ内にcredential情報を保持しなくて済むようになるため、1つのcontainer imageで、複数環境で動かすことができそうだ。