SlideShare a Scribd company logo
1 of 20
INTERNET MULTIFEED CO.Copyright ©
StackStorm Workflowの設計
Shu Sugimoto
Software Development Manager, JPNAP
2019-04-24(Wed)
INTERNET MULTIFEED CO.Copyright ©
今日のサマリー
• StackStormのWorkflowは柔軟でパワフル
• 柔軟であるからこそ、しっかりと設計しておこう
• JPNAP/MFでのこれまでの経験から見えた、st2 Workflowを考え
るときに意識するべきポイントを3つ紹介
• 1. 目的を意識して、Packの振り分けをしよう
• 2. 複数の環境で動かせるように、WorkflowのParameterを
定義しておこう
• 3. Workflowのコア部分と、付帯的な部分を極力分離出来る
ようにしよう
2
INTERNET MULTIFEED CO.Copyright ©
おさらい:Packの種類
• Packはその性質から2種類に大別される
• [ ]
•
• [ ]
3
INTERNET MULTIFEED CO.Copyright ©
おさらい:Packの種類
• Packはその性質から2種類に大別される
• Integration Pack
• ある特定のアプリケーション・プロダクトに特化した
Action/Workflow/etc.をまとめたもの
• stackstorm-exchangeにあるものは(ほぼ?)全てこれに該当
• Automation Pack
• ある特定の業務フローを自動化するWorkflowを含むもの
• Integration PackのActionを組み合わせてWorkflowを組み立て
るのが典型的なパターン
• https://docs.stackstorm.com/packs.html
• 名前に違いはあるが、st2から見たときはどちらも全く同じよう
に扱われる
4
INTERNET MULTIFEED CO.Copyright © 5
🤔
(この業務フローを自動化したい…)
システムX システムY
get A
get P
do B
get Q
do R
とある業務フロー
INTERNET MULTIFEED CO.Copyright ©
パズル
6
Pack: [ ] Pack: [ ] Pack: [ ]
Action:
get.A
Action:
do.B
Action:
get.P
Action:
get.Q
Action:
do.R
Workflow:
run_task
INTERNET MULTIFEED CO.Copyright ©
パズル
7
Pack: X Pack: Y Pack: hoge
Action:
get.A
Action:
do.B
Action:
get.P
Action:
get.Q
Action:
do.R
Workflow:
run_task
Integration Pack Automation Pack
INTERNET MULTIFEED CO.Copyright ©
Packの分離設計
• 実装しているWorkflow/Actionが、特定のシステムを対象として
いるかどうか考える
• もしそうであれば、そのシステムを対象とした
Action/Workflowをまとめて1つのPackにしてあげる
→ Integration Pack
• 実装しているWorkflowが、複数のシステムを連携させてなにか
の業務フローを自動化している
• その業務フローをまとめる単位で、1つのPackにまとめてあ
げる
→ Automation Pack
8
INTERNET MULTIFEED CO.Copyright © 9
🤔
(商用環境とステージング環境の両方で使いたい…)
とある業務フローを自動化したWorkflow
Production Staging
INTERNET MULTIFEED CO.Copyright ©
Workflow/Actionのパラメータ設計
• 各システムがlab/staging/productionを持つことを考慮して、
Parameterを外部からセット出来るようにする
• 環境毎に異なる値をとり得るものは、全てパラメータ化して
おく
• 例えば、接続先サーバーのホスト名とか
• 関数で言うところの引数
• Action metadataにParameterを定義して、default値にPack
config/st2kvのキーをセットする
10
INTERNET MULTIFEED CO.Copyright ©
Pack configとst2kv
• Pack config
• Pack毎に定義する
• スキーマがある
• どんなパラメータがあるか、や、型の定義、そのパラメータの説明
等を含めることが出来る
• DevOps可能
• Packとは切り離してSCM管理/CDが出来る
• Configの値の参照先としてst2kvを指定することも可能
• ただしこの場合、入れられるのは文字列型だけになる
• st2kvに入れる場合は暗号化可能
• Action metadataからはアクセスできるが、Workflow内からは
アクセス出来ない
• Python actionからは直接参照出来る
• Workflow内で使いたい場合、Parameterで渡してあげる必要があ
る
• 厳密に言うとpython-script runner以外はmetadataから
Parameter渡しが必要
• 他のPackのconfigは(簡単には)参照出来ない
11
INTERNET MULTIFEED CO.Copyright ©
Pack configとst2kv
• st2kv
• keyは自由に設定可能
• スキーマレス
• ドキュメントがないと、コードを見ないとどこでどういうキー
が使われているか分からなくなる
• valueには文字列しか入らない
• DevOps可能
• Pack configよりは強引な方法だが、可能といえば可能
• APIを直接叩いてどうにかする感じ
• 暗号化可能
• Action metadataからもWorkflow内からも直接アクセス出来
る
12
INTERNET MULTIFEED CO.Copyright ©
Pack configとst2kv、どう使うべき?
• 戦略1: すべてst2kvでやる
• 最もシンプル
• README.mdでパラメータ一覧を別に管理する必要あり
• 更新忘れを機械的に防ぐ手法がない
• 戦略2: すべてPack configでやる
• 暗号化が使えない
• config更新がちょっと面倒
• st2kvの場合、st2 keyコマンドで簡単にできるが、configはファイ
ル作らないといけない
• CDでしか変えないなら問題にはならないが…
• 戦略3: Pack configでパラメータを定義し、値はすべてst2kvに入れ
るハイブリッド
• パラメータはconfig schemaで管理出来る
• 初期configの登録だけちょっと面倒
• Pack単体のCDでは完結させることが出来ない
• 新しいパラメータを追加したときのデプロイフロー未確立
13
INTERNET MULTIFEED CO.Copyright ©
Pack configとst2kv、どう使うべき?
• いろいろな戦略があるが、どれも一長一短なので自分にあったや
つを選びましょう
• st2kvの使い方について留意しておくべきこと
• Workflow内で直接st2kvを参照するときは、一時的に保管す
るデータ、TTL付きのデータのみにとどめておく
• もしそうでない場合、それは恐らく高確率でParameter化し
てAction metadataから渡してあげたほうが良いもの
14
INTERNET MULTIFEED CO.Copyright © 15
🤔
(このWorkflowの開始・終了時にSlackに通知を送りたい…)
とある業務フローを自動化したWorkflow
INTERNET MULTIFEED CO.Copyright ©
Workflowの開始・終了を通知する方法
• 1. Workflowの一番最初と最後に slack.chat.postMessage を
突っ込む
• 一番最初に思いつく、最も簡単かつシンプルな方法
• しかしこれは後々で確実につらくなる
16
INTERNET MULTIFEED CO.Copyright ©
Workflowの開始・終了を通知する方法
• 「1. Workflowの一番最初と最後に slack.chat.postMessage を
突っ込む」の、ダメなところ
• ビジネスロジックとは関係のないActionがWorkflowに混ざり、
見通しが悪くなる
• 同じく、関係ないパラメータが混ざり、混乱を招く
• Slackに投稿するために必要なtokenやchannel名等は、本来そ
のワークフローの責務の範疇外の値のはず
• ビジネスロジックの外の影響を、そのワークフローが受けて
しまう
• 「HipChatに変えました」→この全く関係のない変更により、
Workflowを全て書き換える必要がある
17
INTERNET MULTIFEED CO.Copyright ©
Workflowの開始・通知を終了する 改善版
• 2. Triggerを使う
• st2 -> IFTTT
• Workflowの開始時/終了時にtriggerを出すことが出来る
• st2.generic.actiontrigger
• st2.confの[action_sensor]のemit_whenに、いつtriggerを発
火させるか指定可能
• ここで`scheduled`を追加指定すると、Action/Workflow
がスケジュールされた際、つまり開始時にtriggerを発火で
きる
• これを使って、通知用のルールからWorkflowをキックしてあげ
る
• ※なぜnotifytriggerじゃないのか?
• →開始時のフックが出来ないから
18
INTERNET MULTIFEED CO.Copyright © 19
# 該当workflowを追加する時はこのruleのpatternを変更
name: start_workflow
description: Kick the notification workflow when specific workflow starts.
enabled: true
trigger:
type: core.st2.generic.actiontrigger
criteria:
trigger.action_ref:
type: inside
pattern:
- jpnap_scg.deploy_scdb
- jpnap_scg.register_ml
- jpnap_scg.publish_web
- jpnap_scg.deploy_mac_ip_table
- jpnap_scg.peerwatcher_dataclean
- jpnap_rfeed.add_rfeed_peer
- jpnap_rfeed.remove_rfeed_peer
- jpnap_neko.create_mac_acl
- jpnap_neko.delete_mac_acl
- jpnap_neko.modify_mac_acl_dual
- jpnap_tests.test.ask_to_proceed.example2
- jpnap_tests.finish_workflow_with_snippet.mistral
- jpnap_tests.finish_workflow_with_snippet.orquesta
trigger.status:
type: equals
pattern: scheduled
action:
ref: jpnap_common.start_workflow
parameters:
execution_id: "{{ trigger.execution_id }}"
target_name: "{{ trigger.action_name }}"
# ruleごとに通知先channelを指定する
notify_channel: "{{ st2kv.system.jpnap_common.config.slack.wf_notify.start_finish }}"
INTERNET MULTIFEED CO.Copyright ©
今日のサマリー (再掲)
• StackStormのWorkflowは柔軟でパワフル
• 柔軟であるからこそ、しっかりと設計しておこう
• JPNAP/MFでのこれまでの経験から見えた、st2 Workflowを考え
るときに意識するべきポイントを3つ紹介
• 1. 目的を意識して、Packの振り分けをしよう
• 2. 複数の環境で動かせるように、WorkflowのParameterを
定義しておこう
• 3. Workflowのコア部分と、付帯的な部分を極力分離出来る
ようにしよう
20

More Related Content

What's hot

【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮Hibino Hisashi
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)Tetsuyuki Kobayashi
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) akira6592
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングRansui Iso
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Masahito Zembutsu
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~NTT Communications Technology Development
 
Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらいNaoki Nagazumi
 
テスト駆動開発のはじめ方
テスト駆動開発のはじめ方テスト駆動開発のはじめ方
テスト駆動開発のはじめ方Shuji Watanabe
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)NTT DATA Technology & Innovation
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化dcubeio
 
NAPALMで作るネットワークオペレーション自動化への道のり
NAPALMで作るネットワークオペレーション自動化への道のりNAPALMで作るネットワークオペレーション自動化への道のり
NAPALMで作るネットワークオペレーション自動化への道のりToshiya Mabuchi
 
show コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyshow コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyakira6592
 
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現Unity Technologies Japan K.K.
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動Takashi Takizawa
 
足を地に着け落ち着いて考える
足を地に着け落ち着いて考える足を地に着け落ち着いて考える
足を地に着け落ち着いて考えるRyuji Tamagawa
 

What's hot (20)

【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
【第26回Elasticsearch勉強会】Logstashとともに振り返る、やっちまった事例ごった煮
 
組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)組み込みLinuxでのGolangのススメ(Go con版)
組み込みLinuxでのGolangのススメ(Go con版)
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
ssh-agentのすすめ
ssh-agentのすすめssh-agentのすすめ
ssh-agentのすすめ
 
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミングPyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
 
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
macOSの仮想化技術について ~Virtualization-rs Rust bindings for virtualization.framework ~
 
Docker 基本のおさらい
Docker 基本のおさらいDocker 基本のおさらい
Docker 基本のおさらい
 
テスト駆動開発のはじめ方
テスト駆動開発のはじめ方テスト駆動開発のはじめ方
テスト駆動開発のはじめ方
 
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
Kubernetesでの性能解析 ~なんとなく遅いからの脱却~(Kubernetes Meetup Tokyo #33 発表資料)
 
Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化Ansibleで始めるインフラ構築自動化
Ansibleで始めるインフラ構築自動化
 
NAPALMで作るネットワークオペレーション自動化への道のり
NAPALMで作るネットワークオペレーション自動化への道のりNAPALMで作るネットワークオペレーション自動化への道のり
NAPALMで作るネットワークオペレーション自動化への道のり
 
show コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudyshow コマンド結果をパースする方法あれこれ #npstudy
show コマンド結果をパースする方法あれこれ #npstudy
 
【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現【Unity道場】VectorGraphicsで作る エモい表現
【Unity道場】VectorGraphicsで作る エモい表現
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
足を地に着け落ち着いて考える
足を地に着け落ち着いて考える足を地に着け落ち着いて考える
足を地に着け落ち着いて考える
 

Similar to StackStorm Workflowの設計

バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)NTT DATA Technology & Innovation
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)NTT DATA Technology & Innovation
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624Yusuke Suzuki
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードKazuhiro Hara
 
st2-docker ことはじめ
st2-docker ことはじめst2-docker ことはじめ
st2-docker ことはじめShu Sugimoto
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)Takeshi Yamamuro
 
20110517 okuyama ソーシャルメディアが育てた技術勉強会
20110517 okuyama ソーシャルメディアが育てた技術勉強会20110517 okuyama ソーシャルメディアが育てた技術勉強会
20110517 okuyama ソーシャルメディアが育てた技術勉強会Takahiro Iwase
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12matsuo kenji
 
【XPagesDy】A-2_コムチュア_20131106_公開用
【XPagesDy】A-2_コムチュア_20131106_公開用【XPagesDy】A-2_コムチュア_20131106_公開用
【XPagesDy】A-2_コムチュア_20131106_公開用comtakahashi
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Kotaro Nakayama
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)NTT DATA Technology & Innovation
 
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』Naoya Hashimoto
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1Y Watanabe
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態npsg
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018Yoshio Terada
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Takashi Sogabe
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03Miya Kohno
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編Fixstars Corporation
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析Akinori Abe
 

Similar to StackStorm Workflowの設計 (20)

バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
 
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
オススメのJavaログ管理手法 ~コンテナ編~(Open Source Conference 2022 Online/Spring 発表資料)
 
企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624企業におけるSpring@日本springユーザー会20090624
企業におけるSpring@日本springユーザー会20090624
 
Play framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレードPlay framework 2.0のおすすめと1.2からのアップグレード
Play framework 2.0のおすすめと1.2からのアップグレード
 
st2-docker ことはじめ
st2-docker ことはじめst2-docker ことはじめ
st2-docker ことはじめ
 
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
LLVMで遊ぶ(整数圧縮とか、x86向けの自動ベクトル化とか)
 
20110517 okuyama ソーシャルメディアが育てた技術勉強会
20110517 okuyama ソーシャルメディアが育てた技術勉強会20110517 okuyama ソーシャルメディアが育てた技術勉強会
20110517 okuyama ソーシャルメディアが育てた技術勉強会
 
Eureka go 2015_12_12
Eureka go 2015_12_12Eureka go 2015_12_12
Eureka go 2015_12_12
 
【XPagesDy】A-2_コムチュア_20131106_公開用
【XPagesDy】A-2_コムチュア_20131106_公開用【XPagesDy】A-2_コムチュア_20131106_公開用
【XPagesDy】A-2_コムチュア_20131106_公開用
 
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
Deep Learning Implementations: pylearn2 and torch7 (JNNS 2015)
 
Embedded Master2
Embedded Master2Embedded Master2
Embedded Master2
 
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
オレ流のOpenJDKの開発環境(JJUG CCC 2019 Fall講演資料)
 
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』
第1回『いまさら聞けない!システム運用・管理のコツ』 『クラウド管理・運用サービス「E.C.O」のご紹介』
 
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
JavaでWebサービスを作り続けるための戦略と戦術 JJUG-CCC-2018-Spring-g1
 
「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態「宣言的プログラミング」とSDNのひとつの形態
「宣言的プログラミング」とSDNのひとつの形態
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Mk network programmability-03
Mk network programmability-03Mk network programmability-03
Mk network programmability-03
 
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
CPU / GPU高速化セミナー!性能モデルの理論と実践:理論編
 
OCaml でデータ分析
OCaml でデータ分析OCaml でデータ分析
OCaml でデータ分析
 

StackStorm Workflowの設計

  • 1. INTERNET MULTIFEED CO.Copyright © StackStorm Workflowの設計 Shu Sugimoto Software Development Manager, JPNAP 2019-04-24(Wed)
  • 2. INTERNET MULTIFEED CO.Copyright © 今日のサマリー • StackStormのWorkflowは柔軟でパワフル • 柔軟であるからこそ、しっかりと設計しておこう • JPNAP/MFでのこれまでの経験から見えた、st2 Workflowを考え るときに意識するべきポイントを3つ紹介 • 1. 目的を意識して、Packの振り分けをしよう • 2. 複数の環境で動かせるように、WorkflowのParameterを 定義しておこう • 3. Workflowのコア部分と、付帯的な部分を極力分離出来る ようにしよう 2
  • 3. INTERNET MULTIFEED CO.Copyright © おさらい:Packの種類 • Packはその性質から2種類に大別される • [ ] • • [ ] 3
  • 4. INTERNET MULTIFEED CO.Copyright © おさらい:Packの種類 • Packはその性質から2種類に大別される • Integration Pack • ある特定のアプリケーション・プロダクトに特化した Action/Workflow/etc.をまとめたもの • stackstorm-exchangeにあるものは(ほぼ?)全てこれに該当 • Automation Pack • ある特定の業務フローを自動化するWorkflowを含むもの • Integration PackのActionを組み合わせてWorkflowを組み立て るのが典型的なパターン • https://docs.stackstorm.com/packs.html • 名前に違いはあるが、st2から見たときはどちらも全く同じよう に扱われる 4
  • 5. INTERNET MULTIFEED CO.Copyright © 5 🤔 (この業務フローを自動化したい…) システムX システムY get A get P do B get Q do R とある業務フロー
  • 6. INTERNET MULTIFEED CO.Copyright © パズル 6 Pack: [ ] Pack: [ ] Pack: [ ] Action: get.A Action: do.B Action: get.P Action: get.Q Action: do.R Workflow: run_task
  • 7. INTERNET MULTIFEED CO.Copyright © パズル 7 Pack: X Pack: Y Pack: hoge Action: get.A Action: do.B Action: get.P Action: get.Q Action: do.R Workflow: run_task Integration Pack Automation Pack
  • 8. INTERNET MULTIFEED CO.Copyright © Packの分離設計 • 実装しているWorkflow/Actionが、特定のシステムを対象として いるかどうか考える • もしそうであれば、そのシステムを対象とした Action/Workflowをまとめて1つのPackにしてあげる → Integration Pack • 実装しているWorkflowが、複数のシステムを連携させてなにか の業務フローを自動化している • その業務フローをまとめる単位で、1つのPackにまとめてあ げる → Automation Pack 8
  • 9. INTERNET MULTIFEED CO.Copyright © 9 🤔 (商用環境とステージング環境の両方で使いたい…) とある業務フローを自動化したWorkflow Production Staging
  • 10. INTERNET MULTIFEED CO.Copyright © Workflow/Actionのパラメータ設計 • 各システムがlab/staging/productionを持つことを考慮して、 Parameterを外部からセット出来るようにする • 環境毎に異なる値をとり得るものは、全てパラメータ化して おく • 例えば、接続先サーバーのホスト名とか • 関数で言うところの引数 • Action metadataにParameterを定義して、default値にPack config/st2kvのキーをセットする 10
  • 11. INTERNET MULTIFEED CO.Copyright © Pack configとst2kv • Pack config • Pack毎に定義する • スキーマがある • どんなパラメータがあるか、や、型の定義、そのパラメータの説明 等を含めることが出来る • DevOps可能 • Packとは切り離してSCM管理/CDが出来る • Configの値の参照先としてst2kvを指定することも可能 • ただしこの場合、入れられるのは文字列型だけになる • st2kvに入れる場合は暗号化可能 • Action metadataからはアクセスできるが、Workflow内からは アクセス出来ない • Python actionからは直接参照出来る • Workflow内で使いたい場合、Parameterで渡してあげる必要があ る • 厳密に言うとpython-script runner以外はmetadataから Parameter渡しが必要 • 他のPackのconfigは(簡単には)参照出来ない 11
  • 12. INTERNET MULTIFEED CO.Copyright © Pack configとst2kv • st2kv • keyは自由に設定可能 • スキーマレス • ドキュメントがないと、コードを見ないとどこでどういうキー が使われているか分からなくなる • valueには文字列しか入らない • DevOps可能 • Pack configよりは強引な方法だが、可能といえば可能 • APIを直接叩いてどうにかする感じ • 暗号化可能 • Action metadataからもWorkflow内からも直接アクセス出来 る 12
  • 13. INTERNET MULTIFEED CO.Copyright © Pack configとst2kv、どう使うべき? • 戦略1: すべてst2kvでやる • 最もシンプル • README.mdでパラメータ一覧を別に管理する必要あり • 更新忘れを機械的に防ぐ手法がない • 戦略2: すべてPack configでやる • 暗号化が使えない • config更新がちょっと面倒 • st2kvの場合、st2 keyコマンドで簡単にできるが、configはファイ ル作らないといけない • CDでしか変えないなら問題にはならないが… • 戦略3: Pack configでパラメータを定義し、値はすべてst2kvに入れ るハイブリッド • パラメータはconfig schemaで管理出来る • 初期configの登録だけちょっと面倒 • Pack単体のCDでは完結させることが出来ない • 新しいパラメータを追加したときのデプロイフロー未確立 13
  • 14. INTERNET MULTIFEED CO.Copyright © Pack configとst2kv、どう使うべき? • いろいろな戦略があるが、どれも一長一短なので自分にあったや つを選びましょう • st2kvの使い方について留意しておくべきこと • Workflow内で直接st2kvを参照するときは、一時的に保管す るデータ、TTL付きのデータのみにとどめておく • もしそうでない場合、それは恐らく高確率でParameter化し てAction metadataから渡してあげたほうが良いもの 14
  • 15. INTERNET MULTIFEED CO.Copyright © 15 🤔 (このWorkflowの開始・終了時にSlackに通知を送りたい…) とある業務フローを自動化したWorkflow
  • 16. INTERNET MULTIFEED CO.Copyright © Workflowの開始・終了を通知する方法 • 1. Workflowの一番最初と最後に slack.chat.postMessage を 突っ込む • 一番最初に思いつく、最も簡単かつシンプルな方法 • しかしこれは後々で確実につらくなる 16
  • 17. INTERNET MULTIFEED CO.Copyright © Workflowの開始・終了を通知する方法 • 「1. Workflowの一番最初と最後に slack.chat.postMessage を 突っ込む」の、ダメなところ • ビジネスロジックとは関係のないActionがWorkflowに混ざり、 見通しが悪くなる • 同じく、関係ないパラメータが混ざり、混乱を招く • Slackに投稿するために必要なtokenやchannel名等は、本来そ のワークフローの責務の範疇外の値のはず • ビジネスロジックの外の影響を、そのワークフローが受けて しまう • 「HipChatに変えました」→この全く関係のない変更により、 Workflowを全て書き換える必要がある 17
  • 18. INTERNET MULTIFEED CO.Copyright © Workflowの開始・通知を終了する 改善版 • 2. Triggerを使う • st2 -> IFTTT • Workflowの開始時/終了時にtriggerを出すことが出来る • st2.generic.actiontrigger • st2.confの[action_sensor]のemit_whenに、いつtriggerを発 火させるか指定可能 • ここで`scheduled`を追加指定すると、Action/Workflow がスケジュールされた際、つまり開始時にtriggerを発火で きる • これを使って、通知用のルールからWorkflowをキックしてあげ る • ※なぜnotifytriggerじゃないのか? • →開始時のフックが出来ないから 18
  • 19. INTERNET MULTIFEED CO.Copyright © 19 # 該当workflowを追加する時はこのruleのpatternを変更 name: start_workflow description: Kick the notification workflow when specific workflow starts. enabled: true trigger: type: core.st2.generic.actiontrigger criteria: trigger.action_ref: type: inside pattern: - jpnap_scg.deploy_scdb - jpnap_scg.register_ml - jpnap_scg.publish_web - jpnap_scg.deploy_mac_ip_table - jpnap_scg.peerwatcher_dataclean - jpnap_rfeed.add_rfeed_peer - jpnap_rfeed.remove_rfeed_peer - jpnap_neko.create_mac_acl - jpnap_neko.delete_mac_acl - jpnap_neko.modify_mac_acl_dual - jpnap_tests.test.ask_to_proceed.example2 - jpnap_tests.finish_workflow_with_snippet.mistral - jpnap_tests.finish_workflow_with_snippet.orquesta trigger.status: type: equals pattern: scheduled action: ref: jpnap_common.start_workflow parameters: execution_id: "{{ trigger.execution_id }}" target_name: "{{ trigger.action_name }}" # ruleごとに通知先channelを指定する notify_channel: "{{ st2kv.system.jpnap_common.config.slack.wf_notify.start_finish }}"
  • 20. INTERNET MULTIFEED CO.Copyright © 今日のサマリー (再掲) • StackStormのWorkflowは柔軟でパワフル • 柔軟であるからこそ、しっかりと設計しておこう • JPNAP/MFでのこれまでの経験から見えた、st2 Workflowを考え るときに意識するべきポイントを3つ紹介 • 1. 目的を意識して、Packの振り分けをしよう • 2. 複数の環境で動かせるように、WorkflowのParameterを 定義しておこう • 3. Workflowのコア部分と、付帯的な部分を極力分離出来る ようにしよう 20