Logic Apps で始めるちょい足し MLOps

# はじめに
Azure で MLOps を実現するためには、DevOps の要素として Azure DevOps や GitHub 、ML の要素として Azure Machine Learning (以下、AzureML) のサービスが必要になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/a2b8ba4e-f8cd-bd49-cb38-bf75efad3472.png)

基本的にはこれらのサービス組み合わせれば、Azure で MLOps を実現できますが、たまに処理をちょい足ししたいユースケースが出てきます。
例えば、
- Blob Storage に再学習データがアップロードされたら、自動で再学習のパイプラインを回したい
- Azure DevOps でリリース承認後、モデルレジストリにリリース用のモデルが登録されたら、自動でデプロイパイプラインを回したい

といった、〇〇のイベントが発生したら、〇〇のパイプラインを回したいといったケースです。

これらは当然、 Azure Functions に代表されるサーバレスの関数サービスを活用してゴリゴリコード書いて実現することができますが、もっと非エンジニア以外も気軽にちょい足しできるソリューションが求められることが実業務では多々あります。
そういった課題を解決するサービスとして、今回はノーコード/ローコード開発サービスである Azure Logic Apps を使って MLOps にちょい足ししてみたいと思います。

今回は、Blob Storage に再学習データがアップロードされたら、自動で再学習のパイプライン回す処理を Logic Apps でクイックに試してみたいと思います。

Azure Logic Apps とはみたいな話は公式 Docs にお任せします。
https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview

# 手順

## Azure Logic Apps 作成
それでは早速、Azure portal のロジック アプリで、＋追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/7a4ab186-2995-32ba-dc6b-c38c8dee6d28.png)

リソースグループ、ロジックアプリ名を指定し、プランはお試しなので、従量課金の消費を選択し、作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/68735659-56e4-1513-c76e-967a89816432.png)

## Azure Logic Apps にマネージドID 割り当て
Azure Logic Apps から Blob Storage にアクセスするため、作成した Azure Logic Apps にマネージド ID の割り当てを行い、Blob Storage に対し Azure Logic Apps のマネージドID からのアクセスできるよう権限を付与していきます。

まずは対象のロジック アプリの ID からシステム割り当て済みの状態をオンにし、保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/d0fcd37c-678b-35b4-610f-697ad8f774e5.png)

## Blob Storage の IAM に Azure Logic Apps のマネージドID 割り当て
対象の Blob Storage の IAM でロールの割り当て追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/8d5b95eb-8066-bfba-86a5-db03ceb336ff.png)

ストレージ BLOB データ共同作成者 のロールで ロジックアップのマネージド ID を割り当てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/621a4558-efca-c2b5-3490-68b799ca585a.png)

## Azure DevOps 個人用アクセストークン (PAT) を作成
Azure DevOps にログインし、新しい Persinal access tokens を Build の Read & execute 権限のみ付与して作成し、生成されたトークンをコピーし、控えておきます。（後で Azure Logic Apps から Azure DevOps のパイプラインキックする時に使います）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/2836c70a-7b4e-5bd7-0922-80a02ffb4b50.png)

なお、本来ならこちらもマネージド ID で権限指定したかったのですがまだ対応していません。Azure DevOps のロードマップには対応予定と記載があるので座して待ちたいと思います。
https://learn.microsoft.com/ja-jp/azure/devops/release-notes/features-timeline#initiatives

## ロジックアプリ新規作成
空のロジック アプリを新規作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/dc84a5fa-f755-942b-ad9f-ad85f329ec0e.png)

## トリガー設定 (Blob Storage へのファイルアップロードをトリガー指定)
Azure Logic Apps は、トリガー→アクションの流れで処理をフロー化していきます。
BLOB が追加または変更されたとき(プロパティのみ)(V2)をトリガーとして選択し、学習データをアップロードするストレージアカウントとコンテナを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/5acd442c-57d9-a58a-146b-8e23e79b5aa0.png)

## アクション設定 (Azure DevOps のパイプライン実行)
HTTP のアクションを選択し、Azure DevOps のパイプラインを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/8dafd000-b705-dbd7-7ec2-48dc1b01682e.png)

リクエストの内容は以下の通り。
- URL
    - https://dev.azure.com/{組織名}/{プロジェクト名}/_apis/pipelines/{パイプラインURLのdefinitionId}/runs?api-version=7.0
- ヘッダー
    - Authorization: Basic BASE64PATSTRING
        - BASE64PATSTRINGは、 {username}:{personalaccesstoken} をBASE64エンコードした値。{username}は適当 or 無でもOK​
            - 例) :{personalaccesstoken} → BASE64エンコード → OntwZXJzb25hbGFjY2Vzc3Rva2VufQ==
- 本文
```
{  ​
  "resources": {  ​
    "repositories": { "self": { "refName": "refs/heads/{パイプラインを回すのに使うブランチ名}" } }  ​
  },  ​
  "templateParameters": {パイプラインに渡すパラメーター(Json)}}  ​
}​
```
## トリガーを実行
トリガーを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/ffc14c35-a288-e8a9-2c58-39a7bc3b7e85.png)

## Blob Storage にファイルアップロード
トリガーを仕掛けているフォルダにファイルアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/c689b39b-9797-0dce-43da-5b1ff74e111e.png)

## Azure DevOps のパイプラインが実行されていることを確認
ロジックアプリの状態が成功になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/88f4e900-cdec-778a-5db2-0c140e84e42f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/c3ea606a-550c-1e3d-46d1-32035c9495d9.png)

Azure DevOps パイプラインの実行も正常終了していること確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/f2259497-ebdc-b668-892f-c9cacf6a1d88.png)

# まとめ
HTTPでリクエスト投げるところ以外は、GUI でサクサク簡単に設定できたかなと思います。
Microsoft クラウドでは、Azure の AI サービスで機械学習モデルを開発するだけでなく、Azure Logic Apps で開発を効率化したり、開発した機械学習モデルをビジネスユーザや市民開発者が即時利用可能なサービス群も提供したりしていますので、合わせてご利用頂けると、より AI 活用が推進できると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2238189/daf1fc0e-aea3-8644-aac4-8302f6956b92.png)