「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
}
]
今回使用したソフトウェア
- cf-release (v211)
https://github.com/cloudfoundry/cf-release/tree/v211
( https://github.com/cloudfoundry/cf-release/tree/2121dc6405e0f036efa4dba963f7f49b07e76ffa ) - cf-mysql-release (v20)
https://github.com/cloudfoundry/cf-mysql-release/tree/v20
(https://github.com/cloudfoundry/cf-mysql-release/tree/8f7f6916b75a2e01332cc91df8c285dabe698703) - bosh-lite
https://github.com/cloudfoundry/bosh-lite/tree/552dc6869600c5350eb7ffb4fb9c9c5e79e3889d - CF CLI (cf verision 6.12.0-8c65bbd-2015-06-30T00:10:31+00:00)
https://github.com/cloudfoundry/cli/releases/tag/v6.12.0 - webcrontab
https://github.com/codeskyblue/webcron/tree/ddf4bcd3dbce0245f32c4c1e987867614eb419b3
投稿者:NTTソフトウェア株式会社 森川 健