オープンソースのPaaSソフトウェア CloudFoundry の技術情報やイベント告知などを掲載します

2015-11-04

webcrontab を Cloud Foundry で動かす

「Cloud Foundry 百日行」第92日目は、Web UIを持ったcronのwebcrontab です。
webcrontabはGo言語で実装されており、cron機能のみに絞ったシンプルなアプリケーションです。

基本情報

手順の概要は以下の通りです。

  • 1) ソースコードの取得
  • 2) 事前準備
  • 3) アプリの起動
  • 4) 動作確認
  • 5) 補足情報

1. ソースコードの取得

$ git clone https://github.com/codeskyblue/webcron
$ cd webcron
$ ls
assetfs.go    cron.go     Godeps     LICENSE   Procfile  README.md   scripts    web.go
broadcast.go  Dockerfile  keeper.go  Makefile  public    sched.json  templates

2. 事前準備

2.1. MySQLのサービスインスタンス作成

$ cf create-service p-mysql 1gb webcrontab-mysql

2.2. アプリの事前push

アプリを--no-startでpushし、作成したサービスインスタンスをアプリに紐づけます。

$ cf push webcrontab --no-start
$ cf bind-service webcrontab webcrontab-mysql

紐づけたサービスの情報を『cf env』を実行し、credentialsのuri部分をメモします。

$ cf env webcrontab
:
System-Provided:
{
 "VCAP_SERVICES": {
  "p-mysql": [
   {
    "credentials": {
     "hostname": "10.244.7.6",
     "jdbcUrl": "jdbc:mysql://10.244.7.6:3306/cf_a99c856a_3b71_4af8_b5e3_e3e6872b4af6?user=MtKu4dqqjSz0y5ey\u0026password=yFg1sCjoTzkvutKz",
     "name": "cf_a99c856a_3b71_4af8_b5e3_e3e6872b4af6",
     "password": "yFg1sCjoTzkvutKz",
     "port": 3306,
     "uri": "mysql://MtKu4dqqjSz0y5ey:yFg1sCjoTzkvutKz@10.244.7.6:3306/cf_a99c856a_3b71_4af8_b5e3_e3e6872b4af6?reconnect=true",
     "username": "MtKu4dqqjSz0y5ey"
    },
    "label": "p-mysql",
    "name": "webcrontab-mysql",
    "plan": "1gb",
    "tags": [
     "mysql"
    ]
   }
  ]
 }
}

デフォルトではsqlite3のローカルファイルに書き込みを行う実装になっているDB接続のコード部分をmysql用に編集します。

$ vi web.go
$ git diff
diff --git a/web.go b/web.go
index 58e416d..7c42c5f 100644
--- a/web.go
+++ b/web.go
@@ -223,8 +223,9 @@ func main() {
        flag.Parse()

        var err error
-       xe, err = xorm.NewEngine("sqlite3", "./test.db")
+       //xe, err = xorm.NewEngine("sqlite3", "./test.db")
        //xe, err = xorm.NewEngine("mysql", "cron:cron@tcp(10.246.13.180:3306)/cron?charset=utf8")
+       xe, err = xorm.NewEngine("mysql", "MtKu4dqqjSz0y5ey:yFg1sCjoTzkvutKz@tcp(10.244.7.6:3306)/cf_a99c856a_3b71_4af8_b5e3_e3e6872b4af6?charset=utf8")
        // xe, err = xorm.NewEngine("mysql", "root:@/cron?charset=utf8")
        if err != nil {
                log.Fatal(err)

3. アプリの起動

DBの接続情報を編集した状態のコードをpushします。
なお、Procfileが標準で用意されているので-cの起動コマンドの指定は不要です。

$ cf push webcrontab
:
App started


OK

App webcrontab was started using this command `webcrontab -port $PORT`

Showing health and status for app webcrontab in org morika-t / space morika-t as morika-t...
OK

requested state: started
instances: 1/1
usage: 256M x 1 instances
urls: webcrontab.10.244.0.34.xip.io
last uploaded: Wed Oct 28 13:29:26 UTC 2015
stack: cflinuxfs2
buildpack: Go

     state     since                    cpu    memory          disk      details
     #0   running   2015-10-28 10:30:14 PM   0.0%   10.1M of 256M   0 of 1G

成功しました。

4. 動作確認

ブラウザからアプリにアクセスします。
※一部のメニューが中国語ベースとなっています。

デフォルトで”hello”と”hello 2”というジョブが設定されている状態になっていますが、”hello”が失敗しているので歯車の部分を押して設定を修正します。

“Directory”の値が、Mac向けの”/Users”というPATHになっているため、Ubuntu用のPATHに変更します。 本動作確認では、ひとまず”/tmp”と設定しますが、環境に応じて変更してください。

書き換え後”Save”をクリックして保存し、”主页”をクリックしてトップページに戻ります。

ジョブが成功した結果が表示されます。

5. 補足情報

MySQLで管理される情報はジョブの実行履歴のみで、ジョブの設定自体は”sched.json”というファイルで管理されています。

$ cat sched.json
[
    {
        "name": "hello",
        "schedule": "*/20 * * * * *",
        "command": "for i in $(seq 10)\ndo\n    echo hello world: 10-$i $(pwd)\n    sleep 1\ndone",
        "dir": "/Users",
        "description": "你好",
        "environ": {
            "Name": "123"
        },
        "enabled": true
    },
    {
        "name": "hello     2",
        "schedule": "@every 24h",
        "command": "asdf",
        "dir": "",
        "description": "again",
        "environ": {},
        "enabled": true
    }
]

その為、アプリをpushする前に、予め”sched.json”ファイルを直接編集し、ジョブの設定を追加しておくことも可能です。
またCFの特性上、アプリが停止されると”sched.json”ファイルは初期化されてしまい、Web UIから変更した設定も消去されてしまいます。
そのため、以下のコマンドを実行し、ローカルにファイルを保存することで、アプリ再pushにより設定を復活させることができます。

$ cf files webcrontab app/sched.json
Getting files for app webcrontab in org morika-t / space morika-t as morika-t...
OK

[
    {
        "name": "hello",
        "schedule": "*/20 * * * * *",
        "command": "for i in $(seq 10)\ndo\n    echo hello world: 10-$i $(pwd)\n    sleep 1\ndone",
        "dir": "/tmp",
        "description": "你好",
        "environ": {
            "Name": "123"
        },
        "enabled": true
    },
    {
        "name": "hello     2",
        "schedule": "@every 24h",
        "command": "asdf",
        "dir": "",
        "description": "again",
        "environ": {},
        "enabled": true
    },
    {
        "name": "fasdf",
        "schedule": "@every 1h",
        "command": "echo 123",
        "dir": "",
        "description": "asdfa",
        "environ": {},
        "enabled": true
    }
]

今回使用したソフトウェア



投稿者:NTTソフトウェア株式会社 森川 健