ようへいの日々精進XP

よかろうもん

ラムダこりゃ(Amazon Lambda チュートリアル 4)〜 Lambda と Python で「赤い霊柩車シリーズ」の過去の作品名をTwitter につぶやかせる 〜

引き続き Lambda を触ってみたいと思います。

tl;dr

Python の勉強を兼ねて Wikipedia の「赤い霊柩車シリーズ」ページから過去の作品のタイトルを取得して作品名と放映年を Twitter に呟かせる bot を Lambda で作ってみた。


赤い霊柩車シリーズとは

Wikipedia より抜粋。

『赤い霊柩車シリーズ』(あかいれいきゅうしゃシリーズ)は、フジテレビ系の2時間ドラマ「金曜プレミアム」(毎週金曜日21:00 - 22:52)で1992年から放送されているテレビドラマシリーズ。主演は片平なぎさ。(略)推理作家・山村美紗の作品「葬儀屋社長 石原明子シリーズ」を原作とする。片平なぎさの代表的作品であり、2012年までの29作の平均視聴率が17.0%という人気シリーズである。

片平なぎさもさることながら、脇役として山村美紗の娘、山村紅葉が出演しており、大村崑との掛け合いなどが楽しめる、サスペンスなのにあまり怖くなくて家族で楽しめる作品だと思う。


メモ

Lambda Function Python

github.com

以下、Function を作成するにあたってのメモ。

  • HTML の解析には BeautifulSoup というモジュールを利用することで簡単に HTML を解析することが出来た
  • ConfigParser が便利だけど "' までも展開されるので注意する
  • コメント行が日本語だと Lambda 上で実行すると怒られたので # -*- coding: utf-8 -*- を追加

あと、ローカルで実行している時には気づかなったが Lambda 上で実行する場合に変数を雑に設定していると怒られた。

    # JSON を解析
    json = json.loads(htmldata.read())

上記のように書いていると...

UnboundLocalError: local variable 'json' referenced before assignment

上記のようなエラーで怒られてれしまう。

パッケージング

作成した Function をアップロードするにあたって外部モジュールを利用している場合にはあらかじめダウンロードしておいて Function のスクリプトと合わせて ZIP で固める必要がある。ドキュメントに従って以下のように固めるテンプルした。

# MacOS X 環境で homebrew でインストールした Python を利用している場合には必要
% cat << EOT >> ~/.pydistutils.cfg
[install]
prefix=
EOT

# パッケージ用のディレクトリを作成
% mkdir lambda-korya-twitter-akaireikyusha

# ディレクトリ以下に必要なモジュールをインストール
% pip install BeautifulSoup - t lambda-korya-twitter-akaireikyusha
% pip install twitter - t lambda-korya-twitter-akaireikyusha

# Function もディレクトリに含める
% ls -l lambda-korya-twitter-akaireikyusha/lambda_function.py
-rwxr-xr-x  1 kappa  staff  1736 Oct 10 19:09 lambda-korya-twitter-akaireikyusha/lambda_function.py

# zip で固める
% cd lambda-korya-twitter-akaireikyusha
% zip -r your_function.zip *

# 消しておく
% rm -f ~/.pydistutils.cfg

create-function

以下のように Lambda Function を作成する。

aws lambda --region us-east-1 \
  create-function \
    --function-name akai-reikyusha \
    --runtime python2.7 \
    --role arn:aws:iam::1234567890123:role/lambda_basic_execution \
    --handler lambda_function.lambda_handler \
    --timeout 10 \
    --zip-file fileb://your_function.zip

update-function-code

以下のようにデバッグした Function をアップロード、デバッグ、アップロードを繰り返す...。

# アップロード
% aws lambda --region us-east-1 update-function-code --function-name akai-reikyusha --zip-file fileb://your_function.zip

Scheduled event

前の記事と同様に Scheduled event を利用したいので以下のように設定。

f:id:inokara:20151010203919p:plain

しかし、以下のようにエラー。

f:id:inokara:20151010095818p:plain

ん、東京リージョンではリソースが不足しているのかしら...ということで、ヴァージニア(US-EAST)で試したところ登録することが出来た。

つぶやき

f:id:inokara:20151010192013p:plain

緊張感のあるタイトルである。

f:id:inokara:20151010214857p:plain

ログも上記のように。


ということで...

Python で作成する Lambda Function

  • Lambda にアップロードする際の手順に慣れが必要(virtualenv というのを使うことも出来る)
  • ローカルのデバッグってどうするのか引き続き調べる必要がある

一日に一回

一日に一回だけ呟かせるようにした。

f:id:inokara:20151010204756p:plain