はじめに
BlobStorageの追加or更新検知をしたい時、今まではEventGridを使ってきましたが、LogicAppsでもできるということを知りました。
試してみたことをメモしておきます。
前提
- 以下は作成済みとする
- Azureサブスクリプション
- リソースグループ
- LogicApps (ロジックアプリ)
- ストレージアカウント
- スクリーンショット、UIの項目名、手順など2023/02/02時点の情報を元に記述
手順
ワークフローの作成
LogicAppsの[ワークフロー]ページにアクセスし、「追加」をクリック
ワークフロー名を入力し、状態の種類を選択します。
私の場合は信頼性の方が低遅延より重要な要件だったので、「ステートフル」を選択。
デザイナーの編集
作成したワークフローをクリックし、「デザイナー」タブを選択します。
トリガーとして、「Blob name」を選んでください。
「When a blob is added or updated」を選択します。
ストレージアカウントの接続を作成
接続名
接続名には、どのストレージアカウントに対して接続しているかが分かる名前にすると良いでしょう。
認証タイプ
- Storage account connection string
- ActiveDirectoryOAuth
- ManagedServiceIdentity
の中から認証方法を選べます。ここでは一番簡単な「Storage account connection string」を使用します。(セキュリティ的には一番弱いと思うので気をつけて)
Blob pathの設定
追加・更新を検知したいBlobパスを設定します。
コンテナ配下全てを検知したい時は、コンテナ名だけ記述します。
特定ディレクトリ配下のみを監視するなら、container/dir1/dir2
のように記述します。
2023/02/06追記
特定ディレクトリのみを監視するにはcontainer/dir1/dir2/{blobname}.{blobextension}
とする必要がありました。
他にも、特定拡張子のみを監視する方法などが公式ドキュメントに記載されていますので、こちらを参照ください。
Azure Logic Apps のワークフローから Azure Blob Storage に接続する - 組み込みコネクタ トリガー
セキュリティ設定
このあたりの設定をONにすると、実行履歴画面から実際に検知したパスなど、入力や出力が秘匿されるようです。
編集内容の保存
地味に忘れやすいので注意。
Blob検知の設定手順は以上になります。
動作確認
BlobStorageにファイルをアップロードしてみる
{}
とだけ記述したsample.json
をコンテナ直下にアップロードしてみました。
LogicAppsの実行履歴を確認
ワークフローの「概要」ページを見ると、実行履歴に「成功」状態を示す行が新たに表示されています。
中を覗いてみると、新たに追加・更新したBlobが検知できていることが分かります。
ワークフロー内で変数として保持することもできる
ビルトインアクションの「変数」を使用することで、
- コンテナ名
- blob名
などを保持できます。
「予期しないエラー. Failed to fetch」が表示されている時は
おそらくLogicAppsに設定されたNW制限が理由で、あなたのPCからのアクセスが拒否されており、詳細が確認できないと思われます。
NWルールを見直してみてください。
ちなみにディレクトリ配下にアップロードした時は
dir1/dir2/sample.json
のような文字列で検知されます。
StorageAccountにNW制限を設定している時は
私の場合はLogicAppsをVNET統合させ、ストレージアカウントで該当サブネットからの通信を許可しています。
2023/02/02時点で判明しているバグについて
特定形式のJSONをBlobStorageに格納しても検知してくれない
- 中身が空ファイル
- 配列のカッコはじまり
[]
以上のファイルを拡張子.json
でアップロードしても、LogicAppsは検知してくれませんでした。
試してないだけで他にもあるのかもしれません。
サポートに問い合わせたら
- Microsoftの意図しないバグである
- Microsoft開発部にて修正対応中とのこと
- いつ修正がデプロイされるかは未定
[余談] 検知して、どうするか
- slackに通知する
- webhookでAPIを呼び出す
などが考えられます。
AzureFunctionsを作成して呼び出すのもいいですし、特定のHTTPエンドポイントに向けてリクエストを投げることも、LogicAppsのビルトインアクションで行うことができます。
こちらはこの記事の対象としていないので、公式ドキュメントなどを参照してください。
参照