#はじめに
pythonで書いたスクリプトを、定期実行したかったのでサーバ上に動くようにしました。スクリプトの内容はスクレイピングとブログに自動投稿です。毎日一回だけなので、最初は手動でやっていましたが、勉強も兼ねてaws ec2を借りて動かしてみました。初めてのクラウド体験。
#EC2インスタンスを起動まで
EC2インスタンスを作成するにはこの記事を参照すると良いと思います。無料枠で作成する場合は、設定なども参考になると思います。AWS側も丁寧に誘導してくれるので、そこに乗っかればいけました。
#ec2インスタンスを作成した後
インスタンス上でpythonスクリプトを動かすのに行うことは、以下のことです。
- サーバにSSHでログイン
- サーバ上にpythonをインストール、仮想環境(venv)を作成
- ローカル開発環境にあるファイルやライブラリをサーバ上に同期
- スクリプトを定期実行するために、サーバ上のcronの設定
以上の作業でローカルにあるpythonスクリプトを、ec2インスタンス上で自動実行することができました。
それぞれ方法を見ていきましょう。
サーバにSSHでログイン
~/.ssh/config内
Host ec2:
HostName <インスタンスのIPアドレス>
User ubuntu
IdentiFile <ダウンロードしたキーペア名.pemへのパス>
と~/.ssh/config
内に記述して、以下のコマンドでログインできます。
ssh ec2
サーバ上にpythonをインストール、仮想環境(venv)を作成
サーバ上にpythonとvenvをインストール/作成しましょう。
sudo apt-get install -y python3 python3.4-venv
python3 -V
python3 -m venv sample 仮想環境作成
. sample/bin/active 仮想環境に入る
ローカル開発環境にあるファイルやライブラリをサーバ上に同期
ローカルのファイルをサーバ上に同期するにはいくつか方法があると思いますが、今回はrsync
を使用します。
rsync -av <ファイル> ec2:パス
後は同期するファイルをこのコマンドで叩けば良いだけです。
同期するのは、ライブラリ集であるpip freeze
と実行するスクリプト
です。前者は以下のようにテキストファイル化すると良いと思います。
pip freeze > requirements.txt
スクリプトを定期実行するために、サーバ上のcronの設定
サーバ上で自動実行を行うためにはcronを設定します。そのためには/etc/crontab
を編集しましょう。殆どがコメントになっていると思いますが、自動実行する時刻とコマンドをここに書くことで実装できます。
設定するには、左から分、時、日、月、曜日、ユーザ、コマンド内容の順番で記載していきます。以下の例は、毎日22時42分にコマンドを実行する例です。
また、実行するコマンドは分かりやすくシェルスクリプトにまとめてますが、まとめなくても大丈夫かもしれません。
# m h dom mon dow user command
42 22 * * * ubuntu /home/ubuntu/run_script.sh > /tmp/run_script.log 2>&1
これでサーバ上で定期自動実行できました。
#終わりに
awsの無料枠というのはec2起動時間が月に750時間までらしいです。なので一つのインスタンスを月にずっと起動してたら730時間なので、それだけで埋まってしまいます。
日に一度のみの定期実行したいだけならば、他の方法があると思うので調べてます。
aws lambda
がそれっぽい。