Azure Functions のローカルにあるファイルを Logic Apps で Blob Storage に移動する

## 経緯

なんか思いついたのでやってみた

## 前準備

* Storage Account を作成
  - コンテナーに `test` を追加  
    [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_22h45_50-1024x310.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_22h45_50.png)
* Azure Functions を作成
  - `/LogFiles/Application/Functions` 以下に `text1.txt` ～ `text7.txt` を配置

## 構築手順

1. 従量課金プランでロジックアプリを作成する
2. Logic Apps デザイナーで、空のロジックアプリを選択する
3. 今回は試したいだけなので、トリガーはテキトーに 1 日間隔のスケジュールにした  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h09_10.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h09_10.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h09_26.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h09_26.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_15h54_16.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_15h54_16.png)
4. App Service で使えるのは FTPS なので、[ + 新しいステップ ] から、[ FTP ] -> [ フォルダー内のファイルのリスト ] を選択  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h19_12.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h19_12.png)
5. 接続を聞かれるので、先に作った Functions の [ デプロイセンター ] -> [ FTPS の資格情報 ] 内にある情報をセットする  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h31_09-1024x578.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h31_09.png)  
  ※ここで少しハマったのが、[&#x1f517;Logic Apps のコネクタは暗黙的な暗号化(Implicit)には対応してない](https://docs.microsoft.com/ja-jp/azure/connectors/connectors-create-api-ftp#:~:text=FTP%20%E3%82%B3%E3%83%8D%E3%82%AF%E3%82%BF%E3%81%AF%E6%98%8E%E7%A4%BA%E7%9A%84%20FTP%20over%20TLS/SSL%20%E3%81%AE%E3%81%BF%E3%82%92%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%97%E3%80%81%E6%9A%97%E9%BB%99%E7%9A%84%20FTPS%20%E3%81%A8%E3%81%AF%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93) ので注意
6. フォルダーは `/LogFiles/Application/Functions` とする  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h39_46.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h39_46.png)
7. [ + 新しいステップ ] から、[ 制御 ] -> [ For each ] -> 動的なコンテンツから [ 本文 ] を選択  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h42_17.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h42_17.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h43_13.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h43_13.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h47_17.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_06h47_17.png)
8. For each 右上の [・・・] をクリックして、設定を開き、今カレンシー制御をオンにして、並列処理の次数を 1 にして、[ 完了 ] をクリック  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h32_06.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h32_06.png)
9. [ アクションの追加 ] から、[ 制御 ] -> [ 条件 ] を選択  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h15_18.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h15_18.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h16_05.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h16_05.png)
10. 条件の左辺に IsFolder 、右辺に false を設定  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h18_57.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h18_57.png)
11. True の [ アクションの追加 ] から、[ FTP ] -> [ ファイルコンテンツの取得 ] -> 動的なコンテンツから [ Path ] を選択  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h31_45.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h31_45.png)  
  ↓  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h29_22.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_19h29_22.png)
12. ファイルコンテンツの取得右上の [・・・] をクリックして、設定を開き、非同期パターンをオフにして、[ 完了 ] をクリック  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h39_29.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h39_29.png)
13. [ アクションの追加 ] から、[ Azure Blob Storage ] -> [ BLOB を作成する ] を選択  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_15h38_26.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_15h38_26.png)
14. 接続名はテキトーに入れて、認証の種類を Access Key にして、必要情報をセットして [ 作成 ] をクリック  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_18h32_16-1024x532.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_18h32_16.png)
15. フォルダのパスは最初に作ったコンテナー名の `/test` に、BLOB 名はフォルダー内ファイルリストを取得した時の Name、BLOB コンテンツはファイルコンテンツの取得の時のファイルコンテンツをセットして保存する  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h44_05.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h44_05.png)
16. ファイルコンテンツの取得右上の [・・・] をクリックして、設定を開き、非同期パターンをオフにして、[ 完了 ] をクリック  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h46_47.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h46_47.png)
17. 保存して、実行してみる  
  Host フォルダのときは空振り  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h49_25-1024x387.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h49_25.png)  
  ファイルのときは退避成功  
  [![](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h50_28-1024x386.png)](https://1bed.allright.life/wp-content/uploads/2021/07/2021-07-18_23h50_28.png)

## 考察

ここまで、色々躓いて調べて、エラー処理とか無しで 1 日かかったし、Functions とか Web Apps 使っているってことは、
プログラムを書いているのだから、ファイルの移動もプログラムでやればよいんだよ

わざわざ FTP の口を開けて、エラー処理も面倒で別途お金がかかる Logic Apps を使う意味が全く判らない

ただ、FTPS を使って接続する辺りは誰かの役に立つといいな