Dockerコンテナを使って手元でさくっとEmbulkを実行しAzure SQL Database間でデータを転送させる

業務でよくAzure SQL Databaseを使っていて、DB間でさくっとデータを転送したい場面が度々あり、以前はAzure Data Factoryとか使っていたのだが たまにしか使わないし設定面倒だしなぁとか思っていた。

Embulkだと環境用意するの大変かなとか思っていたが、割とDocker使えばいけるじゃんと思ったので、自分用でとりあえずリポジトリ作ってすぐ使えるように用意した

github.com

使い方

まずはgit clone

$ git clone git@github.com:rnakamine/docker-embulk-sqlserver.git

次にそれぞれDBの接続情報やテーブル情報などを書いていく。

config.yml

in:
  type: sqlserver
  host: localhost
  user: myuser
  password: ""
  database: my_database
  table: my_table
  select: "col1, col2, col3"
  where: "col4 != 'a'"
  order_by: "col1 DESC"

out:
  type: sqlserver
  host: localhost
  user: myuser
  password: ""
  database: my_database
  table: my_table
  mode: insert

今回はSQLServerのEmbulkプラグインを使っており、その他のオプションはこちらを参考にすると良い

Docker Composeで実行できるようにしたので、以下のコマンドを実行するだけ

$ docker-compose run --rm embulk run config.yml

Dockerfileの中身

OpenJDKのベースイメージを用意してEmbulkをwgetでインストールする。

ちなみにEmbulkのv0.9およびv0.10はJava8で動かす必要があるようでJava9は公式にはサポートされていない。

FROM openjdk:8-jre-alpine

ENV EMBULK_VERSION=0.9.23
RUN wget -q https://dl.embulk.org/embulk-${EMBULK_VERSION}.jar -O /usr/local/bin/embulk \
    && chmod +x /usr/local/bin/embulk

RUN apk add --no-cache libc6-compat \
    && embulk gem install \
    embulk-input-sqlserver \
    embulk-output-sqlserver

ENV TZ=Asia/Tokyo

WORKDIR /work

ENTRYPOINT ["java", "-jar", "/usr/local/bin/embulk"]

今回はAzure SQL Databaseを使うためにSQL Serverのinput/outputプラグインをインストールしているが、 そこは用途に合わせて必要なプラグインをインストールすれば良い。

参考文献

qiita.com