StackStorm再入門 その4 PythonスクリプトのActionを実行する

StackStorm(St2)の再入門記事を時折書いていて、インストール構造の説明パックとアクションの作成というように話を進めてきました。

アクションの作成は前回はシェルスクリプトで説明したのですが、機能が不十分と感じることが多いでしょう。そこで、今回はPythonスクリプトをアクションとして使う方法を説明します。

今回は、気象庁が提供するデータを取得して、最新の情報を1件取得するプログラムをサンプルとして作ります。

パックとアクションの説明でも行ったように、St2のアクションは実体のスクリプトと、yamlで書いた定義ファイルの2つを作成する必要があります。
まず、yamlファイルは下記のようにします。ここでは、helloという作成済みのパックにアクションを追加することとして、packs/hello/actions/weather.yamlを作成します。

---
    name: "weather"
    pack: "hello"
    runner_type: "python-script"
    description: "weather info from jma"
    enabled: true
    entry_point: "weather.py"
    parameters:
      title:
        type: "string"
        required: true
        position: 0

基本的にはシェルスクリプトの時と同じような定義ファイルですが、違うのはrunner_typeとしてpython-scriptと指定している点です。

次に、Pythonスクリプトを作成します。packs/test/actions/weather.pyを下記のようにします。St2のアクションとして動作させるPythonスクリプトは、st2actions.runners.pythonrunner.Actionを継承したクラスとする必要があります。クラス名は何でも良いようです。そのクラスに定義したrunという関数が実行されます。St2から引き渡されたパラメータは、run関数の引数になります。
戻り値は、処理が成功したか否かを示す真偽値と、St2に戻したい値のセットとします。

import feedparser
from st2actions.runners.pythonrunner import Action

class PythonTest(Action):

    def run(self, title):
        result = None
        feed = feedparser.parse('http://www.data.jma.go.jp/developer/xml/feed/regular.xml')
        for entry in feed['entries']:
            if entry['title'] == title:
                result = entry
                break

        if result:
            return (True, {
                'author': result['author'],
                'summary': result['summary']
            })
        else:
            return (False, None)

St2のアクションとしてPythonスクリプトを動作させる場合、パックごとにPythonの仮想環境が作成し、その中で動作させます。
Pythonスクリプト内で使用したいパッケージがある場合、パックのルートディレクトリpacks/testrequirements.txtを作成します。
今回は、feedparserパッケージを使っているので、requirements.txtの内容は下記のとおりとなります。

feedparser

下記のコマンドを実行し、Pythonの仮想環境を作成します。ここで、requirements.txtに記述したパッケージのインストールも行われます。(一度、仮想環境を作った後で、requirements.txtにパッケージを追記等した場合、再度このコマンドを実行すれば良いようです。)

st2 run packs.setup_virtualenv packs=hello

後は、通常どおりアクションをSt2に登録します。

st2 action create hello/actions/weather.yaml 

CLIでアクションを実行する場合、下記のようにします。

st2 action execute hello.weather title='府県天気概況'

このようにPythonスクリプトが実行され、最新の気象情報を得ることができました。

この記事を書いた人

井上 研一

経済産業省推進資格ITコーディネータ/ITエンジニア。株式会社ビビンコ代表取締役。コールセンターへのAI導入プロジェクトに参画したことをきっかけに、AI・IoTに強いITコーディネータとして活動。株式会社ビビンコでは、IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。