cronを使えないなら無料で使えるGoogleApp Engine(GAE)を使えばいいじゃない!

ということで、cronを使えない環境で、Google App Engineのcron機能を使って、同じことを実現する方法です。
以前、cronを使えない環境でcronを使う裏技!?という記事を書きましたが、この方法は継続性と安定性に若干不安があるので、GAEを試すことにしました。


以前の方法は、MySQLPHP、cronをひとつのサーバで完結できるというメリットはあるんですけどね。
Twitterbot運営には、継続性も、安定性も、重要ですから!
一度、GAEを使ってみたかったというのもあります:-)


なお、全部自分でやらずに、GAE-Cronに頼るのもいいと思います。


それでは以下、設定手順です。画像が多いので長文になっていますが、やってみるとそうでもない……はず。
(書いてあるとおりにやればできるように一応してあります。Windows7 Ultimate 64bit版で確認した内容です)

アプリケーションの登録

まず以下の手順で「アプリケーション」として登録する必要があります。

1.Google App Engineのウェブサイトを開きます
2.「スタートガイド」の「登録」をクリックします

Google App Engine 登録

3.Googleのアカウントでログインします

Google App Engine 登録

4.「Welcome to Google App Engine」で「Create an Application」をクリックします

Google App Engine 登録

5.「Verify Your Account by SMS」で携帯メールアドレスを指定し、「Send」をクリックします

Google App Engine 登録
Google App Engine 登録
※「Username:」には、携帯メールアドレスの@より手前の部分を入力します

6.携帯に届いた「Google App Engine Code:」を確認します
7.「An Authentication Code Has Been Sent to」で、「Enter Account Code:」に「Google App Engine Code」を入力し、「Send」をクリックします

Google App Engine 登録

8.「Create an Application」で、以下の事項を入力して、「Create Application」をクリックします。

(1) Application Identifier: (アプリケーション識別子)
アプリケーション識別子.appspot.comという形で利用されます。
6文字以上30字以下で指定します。
(2) Application Title: (アプリケーション名)
(3) accept these terms (サービス使用許諾契約書に承諾する)
Google App Engine 登録

9.「Application Registered Successfully」と表示されたら登録完了です。

Google App Engine 登録

Java 用の cron」 or 「Python 用の cron」

Google App EngineではJavaPythonが動作います。
cronの設定の仕方は、どちらの言語を選択するかによって変わります。

Java 用の cron を使用したスケジュール タスク - Google App Engine

具体的な手順は、Google App Engine(GAE)でcron動かすやり方をゆとり向けにまとめてみたがわかりやすいです。


Eclipseをダウンロードしないといけないのが面倒だと思ったので、私は今回、Python 用の cron を使用することにします(あとJavaはなんとなく精神的ハードルが高い…)
Pythonは、軽量プログラミング言語としては実行速度が早く、可読性(保守性)が高いというメリットがあるそうですよ

Python 用の cron を使用したスケジュール タスク - Google App Engine

具体的な手順は、GAEでcronを動かすメモがわかりやすいです。
こちらを参考に、手順を以下書いておきますね。

Python 用の cron を使用したスケジュール タスク - Google App Engineを設定する

2.Python 2.5のインストール

(1) Python JAPAN User's Groupのウェブサイトを開きます
Pythonの公式サイトでは、現時点で2.5系の最新版2.5.5の「Windowsインストーラ」が公開されていないため、2.5.4の「Windowsインストーラ」へたどり着きやすいこちらを案内しています。


(2) ヘッダから「ダウンロード」をクリックします
[GAE cron]


(3) 「Python標準リリース」をクリックします
[GAE cron]


(4) 「以前のバージョン」から、「Python 2.5」ではじまっている、「Windowsインストーラ」を選択します(ダウンロードを開始します)。
[GAE cron]
Python 2.5は最新のバージョンではないためです
※ここでは「python-2.5.4.msi」を選択しました(あとで選択するApp Engine SDKに64bit版がないため、念のため)


(5) python-2.5.*.msiをインストールします。
インストーラーの表示にしたがってインストールしてください


4.App Engine SDKのインストール

(1) ダウンロード - Google App Engineを開きます


(2) GoogleAppEngine-1.3.*.msiをクリックします
[GAE cron]


(3) App Engine SDKのインストールをインストールします。
[GAE cron]
インストーラーの表示にしたがってインストールしてください


Python 2.5をあらかじめインストールしておかないと、Google App Engine Launcherを起動しようとした時に、以下のように叱られます。
[GAE cron]


※何も警告がでず、以下の画面になれば環境構築完了です。
[GAE cron]


5.必要なファイルを準備する

GAEでcronを動かすメモをもとに、以下の3つのファイルを作成しましょう。
ソースの右上にある「copy to clipboard」をクリック、その後エディタに貼り付けて、必要部分を書き換えたら保存。これでOKです。ただし注意すべき点が一箇所あるので気をつけて以下の説明を読んでください(※部)。


(1) app.yaml
Python App Engine アプリケーション」に必要な設定ファイル。



このファイルは、URL パスにおけるリクエスト ハンドラおよび静的ファイルとの間の関係を指定します。アプリケーション ID や最新バージョン識別子など、アプリケーション コードについての情報も記載されています。


私の場合こんな感じ。
あとでわからなくならないように、コメントを入れてあります。
識別子等の詳細はこちら。

# アプリケーション識別子
application: mitaina
version: 1
runtime: python
api_version: 1

# URL パターンのリストと、これらの処理方法
handlers:
# handlers01 [cron01 - minutely job]
- url: /cron/minutely
  script: minutely.py
  login: admin
# handlers02
#- url: /cron/reply
#  script: reply.py
#  login: admin

※実行時やデプロイ時に以下のようにエラーがでた場合、インデントが間違っています。「script」や「login」の前には半角スペースを2ついれましょう。

Fatal error when loading application configuration:
Invalid object:
Unknown url handler type.

[GAE cron]


(2) cron.yaml
「Python アプリケーションのスケジュール タスクを設定」するのに必要なファイル。アプリケーションのルート ディレクトリに設置。



私の場合こんな感じ。
あとでわからなくならないように、コメントを入れてあります。
設定の詳細はこちら。

cron:
# cron01
- description: minutely job
  url: /cron/minutely
  schedule: every 1 minutes
  timezone: Asia/Tokyo
# cron02
#- description: reply_random
#url: /cron/reply
#schedule: every 2 minutes
#timezone: Asia/Tokyo


(3) cronで実行するスクリプトファイル
(例) post.py, minutely.py


私の場合こんな感じ。

from google.appengine.api import urlfetch
url = "http://example.com/cron/bot_minutely.php"
result = urlfetch.fetch(url=url, method=urlfetch.GET, headers={'Cache-Control':'max-age=0'}, deadline=10)
if result.status_code == 200:
	print result.content
6.準備したファイルをサーバにアップロードし、利用可能にします(デプロイ)

(1) Google App Engine Launcherを起動します
[GAE cron]


(2) 「File」−「Add Existing Application」を順にクリックします
[GAE cron]


(3) 「Application PATH」に、app.yamlとcron.yamlを保存したフォルダを指定し、「Add」をクリックします。
[GAE cron]


(4) Google App Engine Launcherに先程のフォルダが表示されていることを確認し、その行をクリックします。


(5) アクティブになった「Deploy」ボタンをクリックします。
[GAE cron]


(6) 「Deploy Applicaton to Google」と表示されるので、Googleのアカウントを入力し、「OK」をクリックします。
[GAE cron]


(7) Deploy状況が表示されるので、内容を確認します。
[GAE cron]
コマンドラインでデプロイする場合は、GAEでcronを動かすメモが参考になります。

7.管理画面を開き、動作を確認します

(1) 管理画面のトップページ。追加されたアプリケーションをクリックします。
[GAE cron]


(2) 「Dashboard」が表示されるので、「Cron jobs」をクリクします。
[GAE cron]


(3) 動作状況が表示されているのを確認します。
[GAE cron]

まとめ

最初に動くようになるまでだいぶ大変……ですが、ひとつ動くようになってコツをつかめば、らくちんです。cronはGAEにまとめるのがいいかもしれませんね!


……いっそcronに限らず、botはGAEにまとめられるとよりいいのですが、そのためにはPythonをちゃんと勉強しないと!!


追記(2011/08/29)

ご紹介いただきました!
ありがとうございます