2016年1月13日水曜日

Embulkの設定ファイルをLiquidに対応させて、環境変数を参照させる

1月も中旬に入り、少し遅くなりましたが、明けましておめでとうございます。
私個人は新年早々、生もので当たるハメになりましたが、A-AUTO 50は元気ですので、今年もよろしくお願いいたします。


2016年の1回目は、前年末から引き続きEmbulkの話になります。
ただし、以前とは少し毛色が違い、特定のプラグインではなく、設定ファイル自体について書いていきます。

Embulkに限らず、システムを利用・運用するうえで、"環境の違い"という問題に遭遇することは少なくないと思います。
OSやアーキテクチャのように決められているものから、意図して設定している環境設定など、その種類はさまざまですが、多くの場合、問題が発生するたび、その環境に対応させるためにシステムの設定を変更することになります。

Embulkの場合も、読み込むデータの場所や、データの形式、またデータによってはアクセスの情報などを設定ファイル内に記載するため、基本的に環境が変われば、その都度設定ファイルの情報を更新することになります。

この問題の解決方法の1つとして、Embulkのバージョン0.7から設定ファイルに"Liquid"が使えるようになりました。
今回、"Liquid"の詳細は記載しませんが、重要なのは"環境変数が設定ファイル内で参照できる"ことです。


なお、今回も基となるデータはexampleコマンド⇒guessコマンドによって生成されるデータ(sample_01.csv.gz)・ymlファイル(confing.yml)です。

使用データ
id,account,time,purchase,comment
1,32864,2015-01-27 19:23:49,20150127,embulk
2,14824,2015-01-27 19:01:23,20150127,embulk jruby
3,27559,2015-01-28 02:20:02,20150128,"Embulk ""csv"" parser plugin"
4,11270,2015-01-29 11:54:36,20150129,NULL


設定ファイル内で環境変数を使うための手順


①設定ファイルの拡張子を".yml"から".yml.liquid"に変更する
まず、設定ファイルの拡張子を変更します。拡張子を変更に伴って、設定ファイル内を編集する必要はないので、単純に設定ファイルをリネーム or コピーすればいいだけです。

previewコマンド実行結果(拡張子変更前)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

拡張子変更(コピー)
[ec2-user@ip-172-31-9-9 lib]$ cp config.yml config.yml.liquid

previewコマンド実行結果(拡張子変更後)
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+

念のため、previewコマンドで実行結果を確認しましたが、特に問題なく、同じ結果となりました。


②環境変数を使いたい箇所を書き換える
ここで設定ファイル内を書き換えて、環境変数を参照するように設定します。
例として、読み込むデータを指定する"path_prefix"の値を、環境変数"embulk_source_path"を参照させてみます。

まずは環境変数"embulk_source_path"に元々"path_prefix"で設定されている値と同じ値で設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/try1/csv/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/try1/csv/sample_


後は設定ファイル内で"{{ env.環境変数名 }}"と指定すれば、設定されている環境変数を参照するようになります。
"embulk_source_path"を設定したので、"path_prefix"の値を"{{ env.embulk_source_path }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: {{ env.embulk_source_path }}
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
out: {type: stdout}

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


環境変数を参照するようになりましたが、読み込むデータ自体は以前と変わらないので、実行結果も以前と変わりません。

では、今度は環境変数を書き換えて、違うデータを読み込むように設定してみます。

[ec2-user@ip-172-31-9-9 lib]$ export embulk_source_path=/opt/embulk/lib/sample_
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_source_path

/opt/embulk/lib/sample_

読み込むデータ(/opt/embulk/lib/sample_01.csv.gz)
id,account,time,purchase,comment
11,11111,2015-01-01 19:23:49,20150101,embulk
12,22222,2015-01-02 19:01:23,20150102,embulk jruby
13,33333,2015-01-03 02:20:02,20150103,"Embulk ""csv"" parser plugin"
14,44444,2015-01-04 11:54:36,20150104,NULL

previewコマンド実行結果
+---------+--------------+-------------------------+-------------------------+----------------------------+
| id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+---------+--------------+-------------------------+-------------------------+----------------------------+
|      11 |       11,111 | 2015-01-01 19:23:49 UTC | 2015-01-01 00:00:00 UTC |                     embulk |
|      12 |       22,222 | 2015-01-02 19:01:23 UTC | 2015-01-02 00:00:00 UTC |               embulk jruby |
|      13 |       33,333 | 2015-01-03 02:20:02 UTC | 2015-01-03 00:00:00 UTC | Embulk "csv" parser plugin |
|      14 |       44,444 | 2015-01-04 11:54:36 UTC | 2015-01-04 00:00:00 UTC |                       NULL |
+---------+--------------+-------------------------+-------------------------+----------------------------+


以前の実行結果とは異なり、書き換えた環境変数のファイルを読み込んでいます。

これで環境ごとに必要な環境変数を設定するだけで、読み込むデータを指定できるようにできました。


プラグインで環境変数を参照させる

基本設定の"path_prefix"で環境変数を参照させられましたが、同様にプラグインにおいても環境変数を参照させることができます。

例として前回ご紹介した"embulk-filter-insert"プラグインを利用して、環境変数の値を新しいカラムとして追加してみます。

まずは環境変数"embulk_insert_env"に固定文字列"env"を設定します。

環境変数設定&確認
[ec2-user@ip-172-31-9-9 lib]$ export embulk_insert_env=env
[ec2-user@ip-172-31-9-9 lib]$ echo $embulk_insert_env

env


後は"path_prefix"を環境変数で参照させたときと同様に、追加するカラムの値に"{{ env.embulk_insert_env }}"と指定します。

config.yml.liquid(緑字を変更)
in:
  type: file
  path_prefix: /opt/embulk/lib/try1/csv/sample_
  decoders:
  - {type: gzip}
  parser:
    charset: UTF-8
    newline: CRLF
    type: csv
    delimiter: ','
    quote: '"'
    trim_if_not_quoted: false
    skip_header_lines: 1
    allow_extra_columns: false
    allow_optional_columns: false
    columns:
    - {name: id, type: long}
    - {name: account, type: long}
    - {name: time, type: timestamp, format: '%Y-%m-%d %H:%M:%S'}
    - {name: purchase, type: timestamp, format: '%Y%m%d'}
    - {name: comment, type: string}
filters:
  - { type: insert, column: { env: {{ env.embulk_insert_env }} }, at: top }
out: {type: stdout}

previewコマンド実行結果
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

しっかり環境変数で設定した後が、新しいカラムとして追加されています。


なお、embulkコマンドをsudoで実行している場合、通常のsudoでは環境変数は引き継がないため、オプションにより環境変数を引き継いで実行する必要があります。

previewコマンドを例にすると、次のようになります。

通常のsudo(環境変数を引き継がない)
[ec2-user@ip-172-31-9-9 lib]$ sudo embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|            |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|            |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|            |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|            |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+

-Eオプション付きsudo(環境変数を引き継ぐ)
[ec2-user@ip-172-31-9-9 lib]$ sudo -E embulk preview 設定ファイル

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
| env:string | id:long | account:long |          time:timestamp |      purchase:timestamp |             comment:string |
+------------+---------+--------------+-------------------------+-------------------------+----------------------------+
|        env |       1 |       32,864 | 2015-01-27 19:23:49 UTC | 2015-01-27 00:00:00 UTC |                     embulk |
|        env |       2 |       14,824 | 2015-01-27 19:01:23 UTC | 2015-01-27 00:00:00 UTC |               embulk jruby |
|        env |       3 |       27,559 | 2015-01-28 02:20:02 UTC | 2015-01-28 00:00:00 UTC | Embulk "csv" parser plugin |
|        env |       4 |       11,270 | 2015-01-29 11:54:36 UTC | 2015-01-29 00:00:00 UTC |                       NULL |

+------------+---------+--------------+-------------------------+-------------------------+----------------------------+


このように環境変数を上手く利用することで、異なる環境においても設定ファイルを直接更新せずに実行させられようになり、Embulkの汎用性を高めることができます。

0 件のコメント:

コメントを投稿