Hatena::ブログ(Diary)

[Mi]みたいなもの RSSフィード Twitter

2010-10-05

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を設定する

1.ローカルに必要な環境(開発環境)を確認する

(1) Python 2.5

(2) App Engine SDK


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 や最新バージョン識別子など、アプリケーション コードについての情報も記載されています。

Python アプリケーション設定 - Google App Engine


私の場合こんな感じ。

あとでわからなくならないように、コメントを入れてあります。

識別子等の詳細はこちら。

# アプリケーション識別子
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.

<URLMap

static_dir=None

secure=default

script=None

url=/cron/minutely

static_files=None

upload=None

mime_type=None

login=optional

require_matching_file=None

auth_fail_action=redirect

expiration=None

>

[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に限らず、botGAEにまとめられるとよりいいのですが、そのためにはPythonをちゃんと勉強しないと!!



追記(2011/08/29)

ご紹介いただきました!

ありがとうございます


pontaponta 2011/11/08 05:31 最初の登録のところで、sendをクリックした後に、Enter Account Code: と出ますが、ここには何を入力したら良いのでしょうか?

「スマイレージ時報」管理人「スマイレージ時報」管理人 2013/04/15 17:55 mitaina様、初めまして。

Twitterの「スマイレージ時報」(@Smileage_time)の管理人です。

このたび、時報送出システムを共用サービスである「twittbot.net」から自分で用意したレンタルサーバーで動かすように変更しようと思い、今@Sm_time_testにてテスト中です。

まだまだ未完成な点が多いですが、今回、毎時0分にcronを動かしTwitterにつぶやきを投稿するシステムを開発するのにあたり、この記事を参考にさせていただきました。
そこで、拙作サイト http://www.smileage-time.comxa.com/ に近日中に作成するシステム解説のページに、「この記事を参考にしました」ということでこの記事を紹介したく、この記事へのリンクを張りたいと思っているのですが、この点ご了承いただけますでしょうか?

具体的には、以下のHTMLコードをシステム解説ページに貼り付けようかと考えています。
<li><a href="http://d.hatena.ne.jp/mitaina/20101005/1286278169" target="_blank">cronを使えないなら無料で使えるGoogleApp Engine(GAE)を使えばいいじゃない!</a>
000webhostにはcronが標準搭載されているのですが、うまく動きませんでした。そこで活躍したGAEの解説サイトです。ちなみに正しい表記は「Google App Engine」ですが、原文タイトル通り転載します。</li>

お忙しいところ大変申し訳ありませんが、ご回答のほどお願いいたします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証