Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

LogicApps で Azure Blob Storage に JSONファイルをアップしたり、取得したりする

Azure Blob Storage にAPIから取得したJSONを放り込んでおこうかな―と思って、色々と試していたときのメモです。

JSONファイルのアップロード、JSONファイルを取得して、LogicAppsでオブジェクトとしてハンドリングする方法を書いています。

docs.microsoft.com

対象の環境

Azure Blob Storage、ADSL Gen2でとりあえず構成しました。

Logic Appsで扱う場合、特にADSL Gen2かどうかというのは、問わない感じですが。

以下のjsoncontainerというフォルダにjsonファイルを格納していくイメージです。

f:id:sugimomoto:20201107125238p:plain

JSONファイルの作成

BLOBへのJSONアップロードには、Azure Blob Storageの「BLOBの作成」アクションを使います。

f:id:sugimomoto:20201107125244p:plain

LogicAppsで構成すると、予め対象の環境(たぶんLogicAppsを構成しているサブスクリプションの範囲?)に存在するストレージアカウントがリストアップされるので便利ですね。

f:id:sugimomoto:20201107125250p:plain

フォルダーのパスで構成しておいた、コンテナを選択し、任意のファイル名をつけておきます。

今回は日付を元に「20201107030509.json」のようなファイル名を生成する関数を指定しました。

concat(formatDateTime(utcNow(),'yyyyMMddHHmmss'),'.json')

あとは、BLOBコンテンツにJSONを突っ込めばOKです。

f:id:sugimomoto:20201107125256p:plain

こんな感じで対象のファイルが生成されました。

f:id:sugimomoto:20201107125302p:plain

f:id:sugimomoto:20201107125345p:plain

BLOBからJSONファイルの取得

BLOBにアップロードされたファイルの取得には「BLOBコンテンツの取得」を使います。

f:id:sugimomoto:20201107125358p:plain

本来であれば、一度一覧表示をしてから、ファイルを特定、みたいなプロセスを経ますが、今回は静的に指定。

f:id:sugimomoto:20201107125404p:plain

ただし、注意したいのが出力結果です。JSONフォーマットで$contentのオブジェクトの中に、Base64エンコードされたBinary形式で入っています。なので、このままではLogicAppsでハンドリングできません。

{
  "$content-type": "application/octet-stream",
  "$content": "ewogICAgIkZpcnN0TmFtZSI6ICJIZWxsbyIsCiAgICAiTGFzdE5hbWUiIDogIldvcmxkIgp9"
}

f:id:sugimomoto:20201107125411p:plain

なので、base64ToString関数を使って、値をデコードします。

docs.microsoft.com

base64ToString(body('BLOB_コンテンツの取得').$content)

以下のように「JSONの解析」アクションに突っ込んでしまうのが良いですね。

f:id:sugimomoto:20201107125418p:plain

これで無事出力できました。

f:id:sugimomoto:20201107125423p:plain

わからなかったこと

「BLOBのコンテンツの取得」にある、「コンテンツタイプの推測」ってなんなんですかね?

f:id:sugimomoto:20201107125428p:plain

スタックオーバーフローにもスレッドを見つけましたが、特に明確な回答はあがっていないみたいでした。

stackoverflow.com

質問者も言っている通り、CSVJSONを指定して、LogicApps上でハンドリングできるオブジェクトにして返してくれると、嬉しいですよねぇ。