Azure Functions と ファイル共有

# はじめに

Azure Functions で編集する ソースコードなどのファイル はどこで見ることができるでしょうか。

一番手っ取り早く見るには Functions のコードエディタ上で見られるファイル管理ペイン、

また、 `Azure ポータル` → `Functions サービス` → `高度なツール` とアクセスすると見られるファイル一覧（エクスプローラ）
などでファイルを見たり、管理することができます。

他にも管理する方法がないのか Functions の ファイル管理に関して少し調べてみたので、書いてみたいと思います。



# 実際に立ててみる

まずは Functions を立ててみましょう。

今回は ３つのプランすべてでどのようにファイルを管理しているか調べてみます。

つまり `従量課金プラン`, `App Serviceプラン`, `Premiumプラン` ３つのプランです。

![01_funcs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216852/d24e6af3-f792-e882-3768-f4e29015a760.png)

↑こんな感じで立ててみました。


# ストレージアカウント

Functions を立てる際に必ず聞かれるのが `ストレージアカウント` です。

シンプルに考えたら、このストレージアカウントの `Blob Storage` にでも入っているんじゃ？
と思って覗いてみても、設定ファイル程度しか見当たらず、肝心のソースコード等のファイルが見当たりません。
（厳密には プランによって使用有無が異なりますが、そちらはまとめで示します）

実はこれ ストレージアカウントの **`ファイル共有`** で管理されているようです。

先ほど立てた Functions ３つのプランそれぞれの `ファイル共有` を覗いてみましょう。

![02_storages.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216852/6138535c-1e7f-cd48-73f2-352f160e6a25.png)

たしかにそれらしきファイル共有アイテムがありますが **`App Serviceプラン` のみ何もない** ようです。

どうにもこれは App Service プランが **マネージドのストレージアカウント** を内部で使用しているため、
ユーザが指定したストレージアカウントのファイル共有は使われないみたいです。

これは Functions でなく App Service プラン 上で成り立つ `Webアプリ（Web Apps）` においても同様の管理体系となります。

※ こちらで用意した ストレージアカウントは App Service プランにおいては `Blob Storage` に設定ファイルを置く…くらいの用途でしか使われていないようです。。。


# ローカル端末(Win10) にマウントしてみる

Functions ではファイル管理に ストレージアカウントの「ファイル共有」が使われている（ASプラン除く）ことが分かりました。

ではせっかくなので、ローカルの端末（win10）のファイルシステム上から見れるよう **ディスクとしてマウント** してみましょう。

先程のファイル共有で表示されていた共有アイテムを選択すると以下のような画面となります（ここでは Premium プランで確認してみます）

![03_conn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216852/a08e771c-b134-a8a9-89ab-6beac9669317.png)

上記の赤枠「接続」を押すと、親切にも 手っ取り早くマウントできるように `PowerShell` コードが生成されています。

コピーして ローカル端末の PowerShell コンソールに貼り付けて実行してみましょう（ここではドライブレター `S` としてマウントします）

![04_ps.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216852/c1b98c0d-be72-653f-9226-ea454c360bb2.png)

成功したようなので実際に Explorer で見てみましょう。

![05_explorer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216852/c33db232-2a19-5908-1c68-4ae44d67aad5.png)


無事にネットワークドライブとしてマウントさせることができました！


# Functions で ファイル共有をするメリットとは

今どきデプロイは CI/CD 前提だしこんなレガシーなファイル管理要らないでしょ！

確かに Azure の Functions はじめ App Service ベースサービス では [デプロイセンター](https://docs.microsoft.com/ja-jp/azure/app-service/deploy-continuous-deployment) なる機能があり、そちらと [Azure DevOps](https://azure.microsoft.com/ja-jp/services/devops/) でも組み合わせれば **ナウでヤングな CI/CD 環境** が整います。

強いてメリットを挙げるとすると、以下などでしょうか。

1. 単純なファイル管理であること（＝手軽に Explorer 等で操作可能であること）
2. **UNC** が使えること

**1.** に関しては、あえて説明するまでもないですが、シンプルな管理で、慣れ親しんだUIで管理できること、

**2.** に関しては、例えばオンプレのシステムで動いている既存の資産（システム、ソフトウェアその他）との連携をやりやすくするためのメリットといえます。
Windowsネイティブアプリ（レガシーなものであっても）でのファイル連携など、手軽にパス指定できる必要がある・・・というのは意外と多いのではないでしょうか。


# まとめ

## Azure Functions と ストレージアカウント

|Functions のプラン|ストレージアカウント|Blob Storage|ファイル共有|
|:--|:--|:--|:--|
|**従量課金**|指定必須|× 使われない|**○ 使われる**|
|**App Service**|指定必須|○ 使われる（設定ファイル 等）|× 使われない（＝ローカルとのファイル共有不可）|
|**Premium**|指定必須|○ 使われる（設定ファイル 等）|**○ 使われる**|

## Azure Functions と ファイル共有

* ファイル共有は `従量課金 プラン` と `Premium プラン` で利用可能です。
* Azure サーバレスサービス ＋ お馴染みのファイル共有 という 新旧技術の組み合わせ で **意外な活路** が見いだせるかもしれません。