今回のエンジニアブログを担当する村田です。
みんな大好きAWS LambdaがPythonで実装できるようになりました!
参考:【AWS発表】AWS Lambdaのアップデート – Python, VPC, 実行時間の延長, スケジュールなど
ワンダープラネットにおいてPythonは、
- サーバーサイドのメインのプログラム言語
- MayaでのPython スクリプティング
- ちょっとしたコマンドラインツールを作成
と、様々な場面で活躍しております。
今までAWS LambdaはNode.jsで実装してきましたが、これからはPythonで実装できます。
というわけで、早速AWS LambdaをPythonで実装し、折角なのでスケジュール化して動かしてみます。
作成するもの
今回は、Appleが提供するRSS Feed Generatorを使い
「日本」のAppStoreの「iOSアプリ トップセールスApp」「Top25」を定期的に取得してみます。
出力先は、お手軽にprintで出力したいので CloudWatch です。
ライブラリ
RSSフィードの解析には「feedparaser」を使います。
インストールも簡単です。
$ pip install feedparser
ただ、AWS Lambdaで外部ライブラリを使用する場合は、アップロードするzipファイルに含める必要があります。
それでは「rssfeed」という作業フォルダを作成し、そこにfeedparserをインストールします。
$ mkdir rssfeed $ cd rssfeed $ pip install feedparser -t ./
インストールが成功するとrssfeedフォルダ内に
- feedparser.py
- feedparser.pyc
- feedparser-5.2.1-py2.7.egg-info
が配置されます(2015/10/16時点)。
AWS LambdaのPythonは、2.7なのでその点ご注意ください。
準備は整いましたので、実装していきます。
実装
「lambda_function.py」というファイルを作成します。
デフォルトでは「lambda_function.py」を呼び出しますが、もちろん変更できます。
import feedparser RSS_URL = "https://itunes.apple.com/jp/rss/topgrossingapplications/limit=25/xml" def lambda_handler(event, context): try: feed = feedparser.parse(RSS_URL) for entry in feed.entries: title = entry.title summary = entry.summary updated = entry.updated print title except Exception as e: print(e) raise e
デフォルトでは、lambda_handlerというメソッドをHandlerとします。
もちろん、変更することも可能です。
引数は、Node.jsの時でもおなじみのeventとcontextです。
実装内容は、すごくシンプルで、
- 7行目:RSSフィードを取得し解析する。
- 9行目以降:解析結果からentryを1つずつ取り出し、要素を取り出し出力する。
summaryなどの出力は、今回は省略しております。
アップロード準備
それではアップロードするzipファイルを作成します。
と、その前に、PythonをMac OS XのHomebrewでインストールした場合は、このままでは動かないためひと工夫が必要です。
一番簡単な方法は、「setup.cfg」ファイルを用意し、ファイルには以下の2行を記述します。
[install] prefix=
参考:公式ドキュメント
rssfeedフォルダ内が、このような構成になっていれば問題ありません。
それでは、zipファイルを作成します。
rssfeedフォルダ内で以下のコマンドを実行します。出力先は適宜変えてください。
$ zip -r ~/rssfeed.zip .
AWS Lambdaの作成
今回は、マネジメントコンソールから作成します。
まずblueprintは「lambda-canary」を選択します。
次に、イベントの設定です。
スケジュール化するには、Event source type に「Scheduled Event」を選択します。
「lambda-canary」を選択した場合は、デフォルトで選択されています。
スケジュールの実行間隔は、Schedule expressionで設定です。
cronタイプでも細かく制御できるのが嬉しいです。
最後にfunctionの設定です。
function codeは、先ほど作成したzipファイルをアップロードします。
Handlerのところが、どのファイルのメソッドを呼び出すかの設定です。
デフォルトでは「lambda_function.lambda_handler」なので、
lambda_function.py の lambda_handlerメソッド を呼び出します。
Roleは、今回はS3などへのアクセスがありませんので「Basic execution role」で問題ありません。
動作確認
タイトルのみの出力ですが、ちゃんと1位から出力されるためこれでも結構充分です。
まとめ
今までも充分にAWS Lambdaは強力なサービスでしたが、
VPC内リソースへのアクセスやスケジュール化などが加わり、より強力なものとなりました。
AWS LambdaはEC2をわざわざ立てることなく実行できるところが素敵なのですが、
これではますますEC2を立てなくても色々なことが実現できてしまいます。
(マネージドされているので実装に集中でき、素敵なことではありますが)
どんどん進化しつづけるAWS Lambda!今後も目が離せません!!