WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

Pythonで実装したAWS Lambdaをスケジュール化!

今回のエンジニアブログを担当する村田です。

みんな大好き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フォルダ内が、このような構成になっていれば問題ありません。
スクリーンショット 2015-10-16 2.13.57

それでは、zipファイルを作成します。
rssfeedフォルダ内で以下のコマンドを実行します。出力先は適宜変えてください。

$ zip -r ~/rssfeed.zip .  

AWS Lambdaの作成

今回は、マネジメントコンソールから作成します。

まずblueprintは「lambda-canary」を選択します。
スクリーンショット_2015-10-16_2_18_53

次に、イベントの設定です。
スケジュール化するには、Event source type に「Scheduled Event」を選択します。
「lambda-canary」を選択した場合は、デフォルトで選択されています。
スクリーンショット_2015-10-16_2_22_07

スケジュールの実行間隔は、Schedule expressionで設定です。
cronタイプでも細かく制御できるのが嬉しいです。
スクリーンショット 2015-10-16 2.21.09

最後にfunctionの設定です。
function codeは、先ほど作成したzipファイルをアップロードします。

Handlerのところが、どのファイルのメソッドを呼び出すかの設定です。
スクリーンショット 2015-10-16 2.29.40
デフォルトでは「lambda_function.lambda_handler」なので、
lambda_function.py の lambda_handlerメソッド を呼び出します。

Roleは、今回はS3などへのアクセスがありませんので「Basic execution role」で問題ありません。

動作確認

実行結果は、CloudWatchのLogsに出力されます。
スクリーンショット 2015-10-16 2.34.58

タイトルのみの出力ですが、ちゃんと1位から出力されるためこれでも結構充分です。

まとめ

今までも充分にAWS Lambdaは強力なサービスでしたが、
VPC内リソースへのアクセスやスケジュール化などが加わり、より強力なものとなりました。

AWS LambdaはEC2をわざわざ立てることなく実行できるところが素敵なのですが、
これではますますEC2を立てなくても色々なことが実現できてしまいます。
(マネージドされているので実装に集中でき、素敵なことではありますが)

どんどん進化しつづけるAWS Lambda!今後も目が離せません!!