無印吉澤

Site Reliability Engineering(SRE)、ソフトウェア開発、クラウドコンピューティングなどについて、吉澤が調べたり試したことを書いていくブログです。

Ansible 2.0 から使えるようになった consul モジュールを試してみた

Ansible 2.0 になって使えるモジュールが大幅に増えましたが、その中に Consul 関係のモジュールがいくつかあります。前から気になってたので、ちょっと試してみました。

今回のお試し環境

ホストOS

  • OS X Yosemite 10.10.5
  • VirtualBox 5.0.10
  • Vagrant 1.8.1
  • Ansible 2.0.1

ゲストOS

  • CentOS 7.2

Playbook

昨年末に Web サーバ1台、MariaDB サーバ1台、Cloudera QuickStart VM で Consul クラスタを組む playbook を作ったので、今回はこれを使いました。

f:id:muziyoshiz:20160313235925p:plain:w640

Ansible 2.0 対応

以前作った playbook のままだと Ansible 2.0 での実行時に WARNING が出たので、事前に少し修正しました。

今回は 2.0 への移行については触れないので、そちらに興味のある方は、先週末に職場ブログに書いた記事をご参考ください。Ansible 2.0 への移行方法、移行時の注意点に関する詳細をまとめています。

recruit.gmo.jp

話はちょっとズレますが、Consul は yum で配布されていないので、以下のように zip を落として解凍して……という処理をいちいち書いてます。Ansible 2.0 にアップグレードしたので、block を使って少し書き換えました。

hashicorp-sample/ansible/roles/consul_agents/centos7/tasks/main.yml

# Install unzip
- name: Install unzip for unarchive module
  yum: name=unzip state=present

# Install Consul if not installed
- name: Check if consul is installed
  stat: path=/usr/local/bin/consul
  register: consul_bin
- block:
  - name: Download and unzip Consul {{ consul_version }} command
    unarchive: src="https://releases.hashicorp.com/consul/{{ consul_version }}/consul_{{ consul_version }}_linux_amd64.zip" dest=/home/vagrant copy=no

  - name: Add execution permission to consul command
    file: path=/home/vagrant/consul state=file mode="0755"

  - name: Move consul command
    command: mv /home/vagrant/consul /usr/local/bin/consul

  when: not consul_bin.stat.exists

# Create Consul agent common setting
- name: Create consul setting directory
  file: path=/etc/consul.d state=directory owner=root group=root mode=0755
- name: Create common consul setting
  template: src="consul.service" dest="/etc/systemd/system/consul.service" owner=root group=root mode=0644
# Reload files under /etc/systemd/system
- name: Call daemon-reload explicitly because service module does not call it
  command: systemctl daemon-reload
# Start consul and create autostart setting
- name: Autostart Consul
  service: name=consul state=started enabled=yes

Consul 関係のモジュール

Ansible 2.0 Has Arrived によると、Ansible 2.0 は200個以上の新モジュールを含む、とのこと。All Modules — Ansible Documentation を見る限り、Consul 関係では以下の4個が新たに追加されたようです。

今回は、一番使いそうな consul モジュールを試してみました。

consul モジュールで書き換えるとこうなる before/after

before

consul モジュールを使わない場合、Consul にサービスを追加する playbook はこんな感じになります。これは、何らかの管理機能を提供する Web サーバを、Consul にサービスとして登録する例です。

hashicorp-sample/ansible/roles/managers/tasks/main.yml

# Create Consul client settings
- name: Create manager service information for consul
  template: src="consul/manager.json" dest="/etc/consul.d/manager.json" owner=root group=root mode=0644
- name: Restart consul
  service: name=consul state=restarted

hashicorp-sample/ansible/roles/managers/templates/consul/manager.json

{
  "service": {
    "name": "manager",
    "port": 80,
    "check": {
      "script": "curl localhost:80 >/dev/null 2>&1",
      "interval": "15s"
    }
  }
}

after

単純に考えると、こう書けば OK そうな気がします。Before とは違って、テンプレートは不要になります。簡潔ですね。

- name: Register manager service
  consul:
    service_name: manager
    service_port: 80
    script: "curl localhost:80 >/dev/null 2>&1"
    interval: 15s

これを実行すると、こんなエラーが出て失敗します。

TASK [cdh_quickstart : Register manager service] *******************************
fatal: [cdh-quickstart]: FAILED! => {"changed": false, "failed": true, "msg": "python-consul required for this module. see http://python-consul.readthedocs.org/en/latest/#installation"}

consul モジュールのページを見て、最初はホストOSに python-consul を入れろということなのか?と誤解してしまったのですが、ゲストOSの方に入れないと駄目みたいです。python-consul のインストールには pip が必要なので、修正後は以下のようになります。

- name: Install pip
  yum: name=python-pip state=present
- name: Install python-consul
  pip: name=python-consul state=present
- name: Register manager service
  consul:
    service_name: manager
    service_port: 80
    script: "curl localhost:80 >/dev/null 2>&1"
    interval: 15s

これで python-consul のエラーは出なくなったのですが、今度は以下のエラーが出たり出なかったりするようになりました……。

TASK [managers : Register manager service] *************************************
fatal: [managers]: FAILED! => {"changed": false, "failed": true, "msg": "Could not connect to consul agent at localhost:8500, error was HTTPConnectionPool(host='localhost', port=8500): Max retries exceeded with url: /v1/agent/services (Caused by NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0xef5650>: Failed to establish a new connection: [Errno 111] \\xe6\\x8e\\xa5\\xe7\\xb6\\x9a\\xe3\\x82\\x92\\xe6\\x8b\\x92\\xe5\\x90\\xa6\\xe3\\x81\\x95\\xe3\\x82\\x8c\\xe3\\x81\\xbe\\xe3\\x81\\x97\\xe3\\x81\\x9f',))"}

ローカルで動作する consul agent に接続できない、というメッセージに見えます。このタスクより前に agent は起動しているんですが……。色々試してみたところ、consul モジュールの実行前に agent を再起動すれば、このエラーは出なくなりました。

最終形はこんな感じ。

hashicorp-sample/ansible/roles/managers/tasks/main.yml

- name: Install pip
  yum: name=python-pip state=present
- name: Install python-consul
  pip: name=python-consul state=present
- name: Restart consul
  service: name=consul state=restarted
- name: Register manager service
  consul:
    service_name: manager
    service_port: 80
    script: "curl localhost:80 >/dev/null 2>&1"
    interval: 15s

この hashicorp-sample は dnsmasq の設定も行っているので、$ dig @127.0.0.1 -p 8600 impala.service.consul SRV と問い合わせると IP アドレスが返されます。また、この manager の Nginx を停止させると、IPアドレスが返されなくなります。

まとめ

pip と python-consul のインストールを要求される割に、consul モジュールを使わない場合と比べて、それほど簡潔な表記にはなりませんでした。1台のマシンで複数のサービスを起動するような場合には、テンプレートファイルを減らすことができるので、それがメリットでしょうか?

あと、これはユースケースによっては致命的だと思うのですが、 consul モジュールで登録したサービスは consul agent を再起動すると消えてしまいます 。実サービスで使う場合、consul agent が落ちるたびに playbook を最初から実行しなおし、という想定なのでしょうか。また、今回のように Vagrant の provisioner として Ansible を使う場合も、playbook は(明示しないと)初回起動時にしか実行されないので、これはちょっと不便ですね。

とりあえず動かすことはできたものの、個人的にはこのモジュールの使いどころがちょっと良くわからないな……という感想でした。

Mastering Bitcoin(日本語訳 PDF)を読んで解決した疑問点、しなかった疑問点

「ブロックチェーン」という単語をニュースでよく見かけるようになってきたので、そろそろ常識として抑えておこうと思い、Bitcoin の名著として評判の高い "Mastering Bitcoin" を読みました。

Mastering Bitcoin: Unlocking Digital Cryptocurrencies

Mastering Bitcoin: Unlocking Digital Cryptocurrencies

日本語版はまだ発売されていませんが、有志による日本語訳が以下のサイトで公開されていたので、今回はこちらを読みました。レイアウトが少し崩れているところもありますが、全体的に読みやすい訳でした。

また、原著の HTML 版も、オライリーのサイトで公開されています。本書の内容をピンポイントで読み返したり、他の人に紹介するときは、こちらの方が便利そうです。

Bitcoin は独自の用語がいろいろあってわかりづらいのですが、本書は概念的な話から入って、徐々に具体的な話に進んでいくようにうまく書かれていて、非常に読みやすかったです。本書を一通り読み終わってから、Bitcoin やブロックチェーン関係のニュースの内容がだいぶ分かるようになってきました。

例えば、僕が事前に疑問に思っていたことのうち、以下の疑問は本書を読んで解決しました。

  • ブロックチェーンのブロックって何?
  • マイニングとは具体的に何をすること?
  • マシンスペックは毎年上がるから、マイニングは年々簡単になっていくのでは?
  • Bitcoin の取引を管理するサーバがあるんだと思うけど、そのサーバを提供する人のモチベーションは何?
  • Bitcoin の P2P ネットワークが分断しても問題ないの?
  • Bitcoin の採掘額には上限があると聞いたことがあるけど、その上限に達したら Bitcoin は存続できなくなる?
  • 全世界の取引が1個のブロックチェーンにずっと追加されていくと、いつか普通のマシンでは処理できないほどの量になるのでは?
  • ブロックチェーンは全世界に公開されるから、Bitcoin には匿名性はない?
  • 一度行った取引を取り消す手段はある?
  • ブロックチェーンをデータベースのように使う話を最近聞くけど、あれはどういう話?

その一方で、Bitcoin の技術的に細かい点や、Bitcoinを発展させた他のソフトウェアの詳細については、本書には書かれていませんでした。例えば、以下の疑問は解決しませんでした。このあたりは、今後、別の資料を当たってみたいと思います。

  • Bitcoin の取引が行われる P2P ネットワークの構造はどうなっている?
  • Bitcoin はどれくらい DoS 攻撃に強い? churn 耐性はどれくらいある?
  • Bitcoin の課題を解決したと言われる、他の技術について。例えば proof of stake とは何か? プライベートブロックチェーンとは何か?

とにかく面白かったです。僕と同じような疑問を持っている方は、是非読んでみることをお勧めします。

Mastering Bitcoin を読んで解決した疑問点

Bitcoin は独自の用語が色々あるので、本書を読むときは、最初から順に読むのが良いと思います。ただ、自分の勉強も兼ねて、本書のどのあたりに疑問への回答があったかをメモしておきます。

ブロックチェーンのブロックって何?

ブロックとは、複数のトランザクション、および1つ前のブロックのハッシュ値などを格納するデータの入れ物のこと。

前のブロックのハッシュ値を参照しているため、一番最初のブロック(ジェネシスブロックと呼ばれる)まで数珠つなぎになっている。このブロックの連なりが、ブロックチェーンと呼ばれる。

トランザクションには、入力となる bitcoin と、出力が書かれている。Bitcoin はお札のようにある程度のまとまりになっているため、通常、出力には相手への支払い額に加えて、自分へのお釣りも書く必要がある。

マイニングとは具体的に何をすること?

ブロックには nonce を格納するための領域がある。マイニングとは、まだ他のブロックに含まれていないトランザクションを新しいブロックに詰めた上で、この nonce を値をいろいろ変えて、ブロックのハッシュ値が一定の値以下になる nonce を探すこと。この「一定の値」を決めるパラメータは difficulty と呼ばれる。

ブロックの作成者は、自分に対して報酬(現在は 25 bitcoin)を与えるトランザクション(generation トランザクション、あるいは coinbase トランザクションと呼ばれる)を作って、ブロックに埋め込むことができる。見事マイニングに成功した場合、このトランザクションを含むブロックが全世界に伝播し、結果的に 25 bitcoin を使えるようになる。

マイニングの結果として得られるハッシュ値は 0000000000000001b6b9a13b095e96db41c4a928b97ef2d944a9b31b2cc7bdc4 のようになり、先頭に 0 が並ぶ。

マシンスペックは毎年上がるから、マイニングは年々簡単になっていくのでは?

マシンスペックが上がれば、単位時間あたりに計算できるハッシュ値の数は増えていく。本書の "Mining and Consensus" の節には、2012〜2014年の2年間におけるハッシュパワー(gigahashes per second, GH/s)の急増を示すグラフが載っている。

ハッシュパワーの急増を示す他の話題としては、Bitcoin のブロックヘッダの Nonce フィールドは 4 bytes なので、4,294,967,296 通りの nonce を試せる。しかし、Bitcoin のマイニングが専用 ASIC などで高速化された結果、1 秒以内にすべての nonce を使い尽くして、なおマイニングに成功しないようになってしまった(ちなみに、1秒経過すると Timestamp が変わり、ハッシュ値も変わる)。そのため、現在は generation トランザクションの自由入力欄(Coinbase Dataフィールド)が、extra nonce のために使われている。

しかし、Bitcoin では、一定時間ごとに前述の difficulty が「マイニングにかかる時間が 10 分に近づく」ように調整される。つまり、マシンスペックの向上に合わせて、マイニングは年々難しくなっていく。

difficulty の再計算(difficulty retargeting)は、2,106 ブロックごとに、直前の 2,106 ブロックの作成にかかった時間をもとに行われる。この計算はブロックチェーンを持っていれば行えるので、調整のための中央サーバなどは不要である。なお、ちょうど10分ごとに新しいブロックが作られた場合、2,106ブロックの作成には351時間(=14日と15時間)かかる。

Bitcoin の取引を管理するサーバがあるんだと思うけど、そのサーバを提供する人のモチベーションは何?

Bitcoin の取引を管理する、ということは、すなわち取引を表す「トランザクション」をまとめた「ブロック」を作ることである。ブロックを作る(すなわちマイニングに成功する)と、前述の報酬が手に入るので、これがサーバを提供する人のモチベーションになる。

また、Bitcoin のトランザクションには、慣例として取引手数料が含まれる(敢えて、入力の額よりも出力の額が小さくなるようにトランザクションを作る)。ブロックを作るサーバは、取引手数料が大きいトランザクションを優先的にブロックに詰め込むことで、マイニング成功時により多くの手数料を入手できる。これもサーバを提供する人のモチベーションになる。

ただ、これは本書にはない話題だが、上記の報酬や手数料は、新しいブロックを作るモチベーションにはなるが、過去のブロックチェーンを保管したり、それらを他のノードに配布するモチベーションにはならない。そのため、「取引の管理」のモチベーションとしては不十分ではないか、という議論があるらしい。

Bitcoin の P2P ネットワークが分断しても問題ないの?

世界の2箇所でほぼ同時にマイニングに成功した場合、あるいはネットワークが一時的に分断された場合に、あるブロックの後続ブロックが世界に2個存在することがありうる。このような状態を "fork" と呼ぶ。

Bitcoin ノードは、複数の後続ブロックを受信すると、そのチェーンの長さまたは累積 difficulty の大きい方を、次にマイニングするブロックの1個前のブロックとして選ぶ。ブロックが2個3個と続いていくと、どこかでチェーンの長さに差が付くため、その時点で fork は解消される。fork はほとんど常に1ブロック以内で解決される。

Bitcoin の採掘額には上限があると聞いたことがあるけど、その上限に達したら Bitcoin は存続できなくなる?

マイニングの報酬は、2009年1月の時点で1ブロック50 bitcoinから始まり、210,000ブロックごとに半減するようになっている。2012年11月に25 bitcoinになり、2016年のどこかで12 bitcoinになる。そして、2140年頃にはすべての bitcoin(20,999,999.98 bitcoin)が発行され終わり、報酬がゼロになる。

しかし、前述の通り、マイニングを行う Bitcoin ノード(マイナー)には、採掘による報酬とは別に手数料収入がある。将来的にはこちらがマイナーの主なインセンティブになると予想されている。

全世界の取引が1個のブロックチェーンにずっと追加されていくと、いつか普通のマシンでは処理できないほどの量になるのでは?

Bitcoin クライアントのリファレンス実装である Bitcoin Core は、ブロックチェーンの完全なコピーを保持するようになっている。このデータは 2013 年後半の時点で約 16 GB ある。最新のグラフは Bitcoin Blockchainサイズ(blockchain.info) で公開されている。本日時点では約55GB。

これは本書にない話題だが、ブロックサイズの最大値 MAX_BLOCK_SIZE は 1,000,000 バイトで、これは小さすぎるので 2,000,000 バイトに拡張しようという動きがある(参考:ビットコイン・クラシック、ハード・フォーク、Segwitまわりについて。 | ビットコイン&ブロックチェーン研究所)。ただ、それでもファイルサイズの伸びは高々2倍になる程度ではないかと思う。

ブロックチェーンは全世界に公開されるから、Bitcoin には匿名性はない?

Bitcoin のトランザクションに含まれる払い元や払い先(Bitcoin アドレス)は、個人を指し示すものではない。また、Bitcoin アドレスごとに秘密鍵-公開鍵のペアを変更することもできる。しかし、すべての取引はブロックチェーンから追跡可能なので、強い匿名性はない。

強い匿名性を目指して、Bitcoin 以外の仮想通貨(Alt coin と呼ばれる)がいくつか作られている。本書では Zerocoin/Zerocash, CryptoNote, ByteCoin, Monero, Darkcoin の名前が挙げられている。技術的な詳細は解説されていない。

一度行った取引を取り消す手段はある?

具体的な記載はないが、本書の内容を一通り読むと、基本的に取り消す手段はない、ということがわかる。ただ、大量のハッシングパワーを確保して、51%攻撃(コンセンサス攻撃)と呼ばれる攻撃に成功すると、取引を取り消すことが可能である。取引を取り消した bitcoin を別のトランザクションに含めてしまえば、本来正当なはずのトランザクションは、将来的に拒否され続ける。

ブロックチェーンをデータベースのように使う話を最近聞くけど、あれはどういうこと?

Bitcoin のトランザクションデータに、デジタル公証人サービス、株券、スマートコントラクトのようなアプリケーションのためのデータを格納しようとする人たちが現れた。

Bitcoin の支払いと無関係なデータをブロックチェーン上に記録することは物議を引き起こしたが、妥協策として、Bitcoin Core クライアントのバージョン 0.9 では、OP_RETURN オペレーターが導入された。このオペレーターを用いることで、80バイトのデータをトランザクションアウトプットに追加できる。

また、仮想通貨以外を主目的とするブロックチェーンが新たに登場している。本書では DNS の代替として作られた Namecoin と、汎用的な契約処理の実行基盤として作られた Ethereum が紹介されている。

無印吉澤(旧)の RSS へのアクセスを、このブログにリダイレクトするよう設定しました

移転から1年近く経過し、はてなブログを使っていて特に問題も無いので、無印吉澤(旧)の RSS フィードに対するアクセスを、このブログに転送するように設定しました。

リダイレクトされてきた皆様お久しぶりです。実は1年くらい前から更新再開してました。最近は Embulk というバルクローダの話、HashiCorp の環境構築ツール Otto の話、ガジェットを使って健康になる話などを書いてます。よかったらこのあたりからご覧ください。

Embulk というバルクローダの話

HashiCorp の環境構築ツール Otto の話

ガジェットを使って健康になる話

余談:リダイレクト設定による RSS リーダへの影響

リダイレクトの方法ですが、具体的には .htaccess に以下の設定を書くだけで大丈夫でした。

Redirect 301 /index.rdf http://muziyoshiz.hatenablog.com/feed

設定してから1日待って、ユーザの多そうな Feedly と Live Dwango Reader(旧Livedoor Reader)で確認してみたところ、うまく転送できてるみたいです。

ちなみに今回初めて知ったんですが、どちらの RSS リーダも、http://muziyoshiz.hatenablog.com/feed から作られた情報と、http://muziyoshiz.jp/index.rdf から作られた情報は、リダイレクトしたあとも別物として管理しているみたいです。例えば、Feedly だとこんな感じになってます。

旧ブログは未だに100〜200名くらい subscribe してくれている方がいるので、新旧のデータが統合されて読者急増!となるかと思ったら、そうはならないみたいです。まあ、Feedly の URL を見る限り、こういう設計じゃ新旧のデータが統合されないのも仕方ないですね……。

タニタの Health Planet から新しいデータだけエクスポートして Google Spreadsheet にポコポコ足していく方法

f:id:muziyoshiz:20160111234201p:plain:w300

これまでのあらすじ

最近ウェストが気になってきたので、計測結果を Web サイト(Health Planet)に自動アップロードしてくれるタニタの体重計を買ったところ、そのサイトにエクスポート機能がなかった……。で、しぶしぶ Embulk output plugin を書いたら、とりあえず動いたのだった。

muziyoshiz.hatenablog.com

今回の内容

体重計(体組成計)の測定結果と一緒に、腹囲の測定結果や、ちょっとしたメモを記録したくなってきました。しかし、Health Planet のほうには自由記入欄のようなものはありません。

色々考えた結果、@ さん作の kataring/embulk-output-google_spreadsheets で Google Spreadsheet にデータを入れて、そこに手入力用の列を足すことにしました。これがうまくいったので、今回はその方法をご紹介します。

この記事を書いた時点のバージョン

OS X でしか試してませんが、Windows でも多分動くと思います。

事前準備

結構いろいろ用意する必要があります。

  • Health Planet API の準備
  • Google Drive API の準備
  • Google Spreadsheet ファイルの作成
  • Google Spreadsheet ファイルのパーミッション設定

Health Planet API の準備

前回の記事(Health Planet からデータをエクスポートするための embulk-input-healthplanet プラグイン)に詳しく書いたので、そちらをご覧ください。以下の情報が揃っていれば OK です。

  • Health Planet のログイン ID およびパスワード
  • 上記のアカウントで作成した Client ID および Client Secret

Google Drive API の準備

以下の手順で API を準備します。ただ、Google Developer Console の画面デザインはときどき変わるみたいなので、もし以下の手順と違っていたら、同じ機能を探してください。

Drive API の有効化

まず、以下の手順で Drive API を有効化します。Sheets API というものもありますが、embulk-output-google_spreadsheets が使うのはそっちじゃないのでご注意ください。

  • Google Developer Console にログインする
  • 何か適当な名前のプロジェクトを作る(名前は、例えば healthplanet とかでいい)
  • 「Google API を利用する」書かれたリンクなどから API Manager に移動して、Drive API を検索
  • Drive API の表示画面で、「API を有効にする」ボタンをクリック
f:id:muziyoshiz:20160123201213p:plain

Drive API に接続するための認証情報の作成

次に、以下の手順でサービスアカウント ID と、P12 キーを入手します。

  • API Manager のサイドバーから、認証情報の画面へ移動
  • 「新しい認証情報」ボタンを押し、「サービスアカウントキー」を選択
  • サービスアカウントとして「新しいサービスアカウント」を選択し、アカウント名を記入
    • アカウント名はなんでも良い。このアカウント名によってサービスアカウント ID が決まる
    • 例えば exporter というアカウント名を入力すると、サービスアカウント ID は exporter@healthplanet-xxxx.iam.gserviceaccount.com のようになる
  • キーのタイプとして P12 を選択
  • 拡張子 .p12 のファイルのダウンロードが始まるので、好きな場所に保存する
    • このファイルは二度とダウンロードできないので、なくしてしまったら認証情報の作成からやり直し
  • 秘密鍵のパスワードが表示されるので、メモする(※今回は特に使いません)
f:id:muziyoshiz:20160123201219p:plain

Google Spreadsheet ファイルの作成

Health Planet からエクスポートしたデータを追記する先を、Google Spreadsheet に作成します。

ファイルの URL は以下のような形式になります。 {{spreadsheet_id}} の部分がこの Spreadsheet ファイルの ID です。あとで使うのでメモしてください。

https://docs.google.com/spreadsheets/d/{{spreadsheet_id}}/edit

また、このファイルの1行目に、以下の内容を記載します。タブ区切りで示していますが、実際は11列に分けて書きます。列の名前が少しでも変わるとアップロードできなくなるので、最初はこのまま書いてください。

測定日時 モデル   体重  体脂肪率    筋肉量   筋肉スコア 内臓脂肪レベル2  内臓脂肪レベル1  基礎代謝量 体内年齢    推定骨量
f:id:muziyoshiz:20160123201628p:plain

Embulk の filter プラグインでカラム名を変えて、列名をそのカラム名と同じにすれば、上記と違う列名でも登録できます。ただ、この文章の意味がわからない場合はいじらないのが無難です。

Google Spreadsheet ファイルのパーミッション設定

最後に、サービスアカウントがこのファイルにアクセスできるように、パーミッションを設定します。これで、準備は完了です。

  • Spreadsheet ファイルの右上に表示されている「共有」ボタンをクリック
  • サービスアカウント ID(メールアドレス形式)を入力し、「完了」をクリック
    • このとき、権限は「編集可能」のままにしておくこと

設定ファイル

ここまでの準備が完了したら、以下の情報が手元に揃っているはずです。

  • Health Planet のログイン ID
  • Health Planet のパスワード
  • Client ID
  • Client Secret
  • サービスアカウント ID
  • P12 キー
  • Spreadsheet ファイルの ID

これらの情報を、以下の Embulk の設定ファイルの、{{ }} で囲まれた場所に記載してください。設定ファイルの名前はなんでもいいですが、この例では embulk-healthplanet.yml とします。

happyturn% cat embulk-healthplanet.yml
in:
  type: healthplanet
  login_id: {{Health Planet のログイン ID}}
  password: {{Health Planet のパスワード}}
  client_id: {{Client ID}}
  client_secret: {{Client Secret}}
  lang: ja
exec: {}
out:
  type: google_spreadsheets
  service_account_email: '{{サービスアカウント ID}}'
  p12_keyfile: '{{P12 キーが置かれた場所のファイルパス}}'
  spreadsheet_id: '{{Spreadsheet ファイルの ID}}'
  default_timezone: Asia/Tokyo

エクスポート処理の実行方法

以下のコマンドを実行すると、エクスポート処理が実行されます。

$ embulk run embulk-healthplanet.yml -o embulk-healthplanet.yml

設定に成功していれば、以下の図のように、エクスポートしたデータが Spreadsheet ファイルにポコポコ追加されていきます。

f:id:muziyoshiz:20160123201222p:plain

また、コマンドの実行が完了すると、embulk-healthplanet.yml のなかに、最後に取得したデータの計測日時が記録されます。そのため、同じコマンドをもう1回実行すると、新しいデータだけがエクスポートされて、同じファイルの末尾に追加されます。バッチファイルとか作って、1日1回くらいのペースで自動実行させておきましょう。

まとめ

こんな感じで、Embulk を使って、タニタの体重計の測定結果をいろいろいじれる環境が整いました。すでに追加された行については、値をいじったり、他の列にメモなどを追加したりしても大丈夫なので、他のデータ(腹囲とか運動記録とか)と組み合わせて色々遊んでみたいと思います。

参考文献

2016-02-02追記:launchd での定期実行

何度か動かして、特に問題無さそうなので、Mac OS Xでlaunchdでcronのように定期実行するメモ - launchd.plistの作成とか(tweeeetyのぶろぐ的めも)A launchd Tutorial を参考に、launchd で 30 分ごとに定期実行するようにしました。

Launchd setting for embulk-output-healthplanet