Help us understand the problem. What is going on with this article?

今年作ったEmbulkプラグインのご紹介(input-remote, filter-hash)

More than 5 years have passed since last update.

この記事はEmbulk Advent Calendarの15日目の記事です。

今回紹介するプラグインはどちらも紹介記事をすでに書いてるのですが、あまり読まれてないっぽいので、、、宣伝のため再度書かせていただきます。

ちなみに本日12/15はEmbulk Meetup Tokyo #2が開催されます。
執筆時点(12/14夜)でまだ空きはありましたのでEmbulkに興味がある方は参加されると良いかと思います。


embulk-input-remote

https://github.com/kamatama41/embulk-input-remote

SCPを使ってリモートホストからファイルを読み込むためのinputプラグインです。remoteっていう命名はちょっと大げさすぎたかなと反省しています(embulk-input-scpとかで良かった...)

昨今のクラウド時代、アプリケーションログなんかは基本的に別途S3とかpapertrailといったクラウドサービスに転送していることが多いかと思いますが、SIerや息の長いWebサービスとかで今でもオンプレ環境で運用している場合、生のログファイルをSCPで収集していることもあるのではないでしょうか。(というか以前運用していたサービスはそうでした)
 

使い方

基本は対象のホスト群と読み込みたいファイルもしくはディレクトリを指定します。ディレクトリを指定すると配下のファイルを全部読み込みます。

SSHの認証方法はauth:内に指定します。

  • type: public_key(公開鍵認証)
  • type: password(パスワード認証)
in:
  type: remote
  hosts:
    - host1
    - host2
  path: /some/path/app_20150414125923.log
  auth:
    user: kamatama41
# 公開鍵認証
    type: public_key
    key_path: /usr/home/.ssh/id_rsa
# パスワード認証
#    type: password
#    password: {password}

 

hosts_command, path_command オプション

対象Hostとファイルパスは任意のコマンドの結果を利用することができます。

  • Host管理(サービスアウト、インなど)を別のミドルウェアで管理している場合
  • 読み込みたいファイルに日時が付いてて動的に変えたい場合

なんかの利用を想定しています。が、今はliquidテンプレート機能があるので、そちらでも実現できるかもしれません。

in:
  type: remote
  # hostsをechoコマンドで指定
  hosts_command: echo 'host1,host2'
  # hostsのセパレータ(デフォルトは半角スペース)
  hosts_separator: ','
  # ファイルパスの日付部分を動的に指定
  path_command: echo /some/path/app_`date "+%Y%m%d%H%M%S"`.log

 

ignore_not_found_hosts オプション

このオプションを使うことで、リモートにファイル(or ディレクトリ)が存在しないHostがあった場合の挙動を調整できます(デフォルトはfalse)。ちなみにSSHが繋がらなかった場合など、ファイルの不存在以外でエラーになった場合はresumeの対象になります。

  • trueの場合、無視されます(resumeの対象外になる)
  • falseの場合、失敗した扱いになります(resumeの対象になる)

embulk-input-hash

https://github.com/kamatama41/embulk-filter-hash

任意の列を任意のアルゴリズムでHash文字列に変換するフィルタです。
用途としては以下のようなものを想定しています

  • メールアドレスや電話番号などの機密情報をExport先のキー項目として使いたいが、生で保存するのはちょっと...

値をtoStringしてからHash化するので一応すべての列をHash化できます。が、timestamp型やdouble型がどういう結果になるかは保証できません。

使い方

filters:
  - type: hash
    columns:
    - { name: username }
    - { name: email, algorithm: SHA-512, new_name: hashed_email }
  • columns: Hash化したい列を配列で指定します
    • name: inputの列名です。
    • algorithm: Hashアルゴリズムを指定します。MessageDigestを内部的には使ってて、そこで指定可能なアルゴリズムを記述します。(デフォルトはSHA-256)
    • new_name: ハッシュ化した列に新しい名前を付けたい場合に記述します。デフォルトはinputの列名です。

アルゴリズムに関して、JavaドキュメントによるとJVMによって使えるものが違うらしいので、自分たちのJVMで使えるアルゴリズムを確認したい場合は以下のコードを実行してみてください。デフォルトでMD5,SHA-1,SHA-256は必ずサポートされているようです。

for (String algorithm : java.security.Security.getAlgorithms("MessageDigest")) {
    System.out.println(algorithm);
}
kamatama_41
Javaの会社 -> Railsの会社 -> JavaとかRailsとかの会社
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away