以前の記事ではPower Automateのクラウドフローの仕様について解説しました。今回はその応用として作成したPythonライブラリPyPowerAutomateを公開したので紹介します。このライブラリを使うことで、どうしてもPower Automateを使わなければいけない状況に立たされたエンジニアがPythonでPower Automateのクラウドフローを開発できるようにすることを目指しています。さらにPyPowerAutomateを利用して作成したC2フレームワークPower Automate C2も公開しました。
それぞれ以下のGitHubのリポジトリで公開しています。
PyPowerAutomate
Power Automateはノーコードやローコードを特徴としており、ロジックを組むときはWebブラウザ上の操作で作成することになっています。しかしながら、複雑なロジックを含むクラウドフローを作成したい場合や動的にクラウドフローを生成したい場合は、Webブラウザ上の操作のみだと限界がありました。今回はこれらの課題を解決するためにPythonを使ってPower Automateのクラウドフローを生成するライブラリPyPowerAutomateを作成しました。
PyPowerAutomateは以下のコマンドでインストールできます。
pip install pypowerautomate
なお、対応するPythonのバージョンは3.10以上です。
PyPowerAutomateを使ったクラウドフロー作成
PyPowerAutomateを使ってクラウドフローを作成する例を紹介します。以下はユーザーがTeamsで参加しているTeam一覧を取得するクラウドフローを作成するコードです。
from pypowerautomate.flow import Flow
from pypowerautomate.triggers import ManualTrigger
from pypowerautomate.actions import VariableTypes,InitVariableAction,SetVariableAction,GetAllTeamsAction
from pypowerautomate.package import Package
# 1. クラウドフローの初期化
flow = Flow()
# 2. クラウドフローにTriggerを設定
flow.set_trigger(ManualTrigger("Button"))
# 3. クラウドフローにActionを設定
flow.append_action(InitVariableAction("InitVariable","contents", VariableTypes.object))
flow.append_action(GetAllTeamsAction("GetAllTeams"))
flow.append_action(SetVariableAction("SetContents", "contents", "@outputs('GetAllTeams')?['body/value']"))
# 4. クラウドフローのインポート用Legacy Packageを設定
package = Package("sample_flow",flow)
# 5. Legacy Packageにコネクタ情報を設定
package.set_teams_connector("shared-teams-38991c03-aaaa-aaaa-8159-2c95d3871fee") ## 環境依存の値
# 6. Legacy Packageの出力
package.export_zipfile()
PyPowerAutomateの仕組みを理解するために、このコードを順々に解説します。
利用モジュールのインポート
はじめに利用したPyPowerAutomateのモジュールをインポートします。それぞれのモジュールには以下の機能が含まれます。
pypowerautomate.flow
: クラウドフローを管理するクラスpypowerautomate.triggers
: クラウドフローを起動するTriggerを定義するクラスpypowerautomate.actions
: クラウドフローのActionを定義するクラスpypowerautomate.pakcage
: クラウドフローをLegacy Packageにするクラス
1. クラウドフローの初期化
以下のコードでクラウドフローを設定するためのインスタンスを作成します。
flow = Flow()
2. クラウドフローにTriggerを設定
作成したFlowインスタンスにトリガーを設定します。この設定によりPower Automate上でどのようにクラウドフローが開始されるか設定できます。
flow.set_trigger(ManualTrigger("Button"))
3. クラウドフローにActionを設定
クラウドフローにActionを設定します。今回の例では、変数を初期化した後にTeamsで参加しているTeam一覧を取得し、その情報を初期化した変数へ格納します。ここでは3つのActionを直列に接続しています。
flow.append_action(InitVariableAction("InitVariable","contents", VariableTypes.object))
flow.append_action(GetAllTeamsAction("GetAllTeams"))
flow.append_action(SetVariableAction("SetContents", "contents", "@outputs('GetAllTeams')?['body/value']"))
4. クラウドフローのインポート用Legacy Packageを設定
ここまで設定したクラウドフローをPower AutomateでインポートできるようにLegacy Packageのインスタンスを作成します。
package = Package("sample_flow",flow)
5. Legacy Packageにコネクタ情報を設定
クラウドフローが他のサービス(Teamsなど)からデータ取得する場合はコネクタの情報を設定する必要があります。packageインスタンスに利用するコネクタIDを設定します。
package.set_teams_connector("shared-teams-38991c03-5734-42f3-8159-2c95d3871fe1") ## 環境依存の値
現在対応している外部サービス一覧はGitHubのREADMEを参照ください。また、コネクタIDの取得方法は以前のブログ のconnectionReferenceの項で解説しています。
6. Legacy Packageの出力
最後にLegacy Packageをzipファイルとして出力します。zipファイルは4で設定した「パッケージ名.zip」でカレントディレクトリに作成されます。
package.export_zipfile()
生成されたzipファイルをPower Automateのポータルサイトからアップロードすると、以下のクラウドフローが作成されます。
今回の例はシンプルなクラウドフローであるため、Webブラウザ上で比較的容易に作成できますが、規模が大きいフローの作成になると、Webブラウザ上の操作だけでは設定が煩雑になります。
PyPowerAutomateを利用すると複雑なロジックをPythonで実装できるため、クラウドフローを作成する負担を減らせる可能性があります。
また、PyPowerAutomateを利用してより複雑な分岐やループ、並列処理を持つフローも作成できます。以下はPower Automate C2がPyPowerAutomateを利用して動的に生成するフローの例です。
PyPowerAutomateの詳細な使い方はドキュメントページを参照ください。
Power Automate C2(PAC2)
Power Automate C2(以下、PAC2)は以前のブログでコンセプトを紹介した内容をフレームワークとして実装したものになります。アーキテクチャは以下の図のようになっており、Power AutomateをHTTPまたはdropbox経由で操作できます。
利用方法などは GitHubのREADMEを参照ください。
なお、このツールはセキュリティ啓発を目的にレッドチームなどがPower Automateのセキュリティ対策状況を評価するために作成されています。公開したバージョンでは、PAC2がPower Automateを操作する際に、Power Automateのユーザーに対して承認確認メールを送信する仕様になっています。そのため、ユーザーの同意無しにPAC2が何かしらのクラウドフローを実行することはありません。
対策
Power Automateは便利な反面、セキュリティ対策が見落とされることはしばしばあります。PAC2のような仕組みを制限する場合には、Power Platformの管理画面からDLPポリシーを設定することが有効です。以下のように「Power Automate Management」コネクタをブロックするポリシーを設定することで、PAC2の実行を制限できます。
「Power Automate Management」コネクタをブロックすると、以下の図のようにPAC2のフローは実行できなくなります。
組織でのPower Automateの利用状況を確認し「Power Automate Management」コネクタを利用していなければ、DLPポリシーを設定し、「Power Automate Management」コネクタをブロックすることを推奨します。
おわりに
今回のブログではPower AutomateのクラウドフローをPythonで作成できるライブラリPyPowerAutomateとPyPowerAutomateを使って実装したPower Automate C2を紹介しました。
Pythonに慣れているPower Automateユーザーであれば、Webブラウザで操作するより簡単に複雑なロジックを実装できます。Pythonが得意なPower Automateユーザーのみなさまは是非利用してみてください。
また、Power Automateは強力な機能を多数備えている一方、セキュリティ対策はよく見落とされます。PAC2のような操作を制限したい場合は、先に紹介したDLPポリシーの設定を推奨します。
Team V 谷 知亮