show log include yuh

勉強したことの復習を兼ねて、IT関係(ネットワーク/サーバ/アプリケーション)についてまとめてます。たまに趣味のこと

スポンサーリンク

StackStormで外部APIを叩いて得た情報をSlack通知してみた

概要

StackStormはオープンソースのイベント駆動型プラットフォームです。
一連のイベントをワークフロー化することで自動化を促進することができます。
システム運用の現場で使われているですが、今回はAPIで連携をしたかったので動かすサンプルは雨が降りそうになると、その情報をSlackに通知することを目的とします。

構築

StackStormは構築は大変です、以下に構築方法がありますがdockerにして下さったものがあるので試すのであればこちらがいいかと思います。
Installation — StackStorm 3.3.0 documentation

dockerでデプロイ

git clone git@github.com:stackstorm/st2-docker
cd st2-docker
make env

パスワードを決める

vi conf/stackstorm.env
docker-compose up -d
docker-compose exec stackstorm bash

パスワードを確認する

cat conf/stackstorm.env

ST2_USER=st2admin
ST2_PASSWORD=*****

StackStorm開発

ますStackStormには大きく3つの役割があります。
● Action : 実際に何を実行するのか、今回は主にここを編集します。
● Trigger : アクションを実施するための条件を指定します、例えば時間であったりwebhookであったりを指定します。
● Rule : ActionとTriggerを組み合わせたもので最終的にこれを動かすことで自動化を実現します。

Actionの作成

まずymlでどんなActionなのかを定義を行います、今回はURIは自由に指定をできるようにしました。
vi /opt/stackstorm/packs/default/actions/api_request.yml

---
name: "api_request"
runner_type: "python-script"
entry_point: "api_request.py"
description: "api_request"
enabled: true
parameters:
    uri:
        type: "string"
        description: "api request uri"
        required: true
        position: 0

次にいよいよ実際のどんなアクションをするかコードを書いていきます。

vi /opt/stackstorm/packs/default/actions/api_request.py

# -*- coding: utf-8 -*-
from st2common.runners.base_action import Action
import json
import requests
class Request(Action):
    def run(self, uri):
        #wether
        url = uri
        res = requests.get(url)
        res_data = res.json()
        wether = res_data["weather"] [0] ["main"]

        if wether == "rain":
            slack_uri = "<WEB_HOOK_URI>"
            requests.post(slack_uri, data = json.dumps({
                'text': u'今日の天気は' + wether + u'です', 
                'username': u'st2-Wether-bot', 
                'icon_emoji': u':smile_cat:', 
                'link_names': 1,
                }))
            return res_data

Actionを作成/削除

このコマンドでdefaultというpackの中に自分で作った"Action"を作ることができました。
st2 action create /opt/stackstorm/packs/default/actions/notify_weather.yml
※ちなみにActionを削除はこれです
st2 action delete default.notify_weather

Triger(st2.CronTimer)

指定する数値の例は以下になります。
●月曜日から金曜日
・day_of_week : mon-fri
●毎日10:00
・hour : 10
・minute : 00
●日本時間
・timezone : Asia/Tokyo

Ruleとして紐付け

ここまで作ればあとはGUIで簡単に設定することができます
1. Rule タブを選び + を選択
2. Name は今回のRule名とPackを決める
3. TRIGGER にて "core" からcron timer を選択し期間を選択する
4. ACTIONにて"REF"に今回作成した"default.api_request"を選択し、"uri"に天気を取得する"openwethermap"のuriを記入する
※ openwethermap に関してはこちらを参照 yunabe.hatenablog.com 5. save したあと enable をすることでcronしたタイミングで動き始めます
6. History タブで動作が確認できれば成功です