Azure Logic Apps StandardでVMのプライベートIPにSFTPしてみる

[**セゾン情報システムズ Advent Calendar 2021**](https://qiita.com/advent-calendar/2021/sisco) 3日目を担当します。

Logic Apps Standardプランが登場し、仮想ネットワーク内にアクセスすることができるようになりました。
SFTPアダプターを使って、仮想ネットワーク内のVM（プライベートIP）へSFTPできるか試してみました。ポイントはパブリックIPを付与していないVMにアクセス可能ということです。
今回試した構成は以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c6a46457-c5bf-62a8-6b04-0362068445c0.png)

* 更にLogic Apps → Blob Storageのアクセスには、ストレージアクセスキーは使わずにマネージドIDを使ったよりセキュアな転送をやってみます。

# 前提条件
* 以下リソースは事前に作成済みであることとします
    * 仮想マシン
    * 仮想ネットワーク
        * VNET統合用の空サブネットを準備しておくこと
    * ストレージアカウント
        * [test]というコンテナーを作っておきます。

# Logic Apps Standard作成
* インスタンスタイプを[Standard]に、ロジックアプリ名は任意で入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ec0d8bbb-bf46-58dc-8ace-58d27f8423da.png)

* [ワークフロー]を選択し、地域は任意です。次へを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6b20eee9-82b0-9774-69ce-443b9797def2.png)

* ストレージアカウントは今回は事前に作成したものを選択します。従量課金プランでは使えなかったステートフルワークフローのためですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/2e0c2d82-397f-c137-abdf-817f2ed2ddbc.png)

* App Serviceプランは今回はデフォルトのままいきます。裏側がApp Serviceということで月額料金はそれなりなので注意が必要です。次へを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e95dcb91-eb89-9a03-9732-a7a674b33796.png)

* Application Insightはデフォルトのまま作成します。従量課金プランのときと違ってApp Serviceがあるため使えるようになってますね。次へを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/894ce197-1203-1b4c-f5b2-45b141838888.png)

* ここまで設定したらLogic Apps Standardを作成します。
* 数分で作成されます。概要ページが開けばOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/928c78fb-280f-eb21-c367-fd71599a0170.png)

# VNET統合設定
* 仮想ネットワーク内のリソースへプライベートIPアクセスするために、VNET統合設定を行います。このあたりはApp Serviceの機能でありましたね。
* 左メニューより[ネットワーク]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d6c42998-6044-d947-6b7c-ff1c12996e59.png)

* [VNET統合]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/957ec247-5e4a-b909-5464-d7110e25ae83.png)

* [VNetの追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/0851fa33-3843-11e0-5606-51590593a8cf.png)

* 事前に準備したvNet、統合用サブネットを選択します。VNET統合用サブネットは空である必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/8d97ac50-8576-8fbc-ee17-23299e47fe31.png)

* VNET統合が構成されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9d96fd85-0df4-08c1-10e6-187954ee7fa8.png)

# マネージドID設定
* Logic Apps概要ページの左メニューより[ID]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ff6f9594-32f9-41fb-14e8-9279f2fcd503.png)

* [オン]になっていればよいです。Logic Apps StandardはデフォルトOnのようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c694c39d-23ed-1997-8704-433f8d24a980.png)

* アクセス許可の[Azureロールの割り当て]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1abdf931-8104-f2e3-be11-3a079e3a577e.png)

* [ロールの割り当ての追加]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/e68ae5cb-864e-2fc3-ad41-a10a3597bb9c.png)

* スコープをストレージにして、事前に作成したストレージアカウントを選択します。RBACは[ストレージBLOBデータ共同作成者]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/08000ae4-5b45-f3c4-46eb-f7ddc2a6826a.png)

# ワークフロー作成
* 左メニューから[ワークフロー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f15f873b-7a9f-2489-7843-f290c461cad5.png)

* ワークフローを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/74815396-0dbd-21a8-e7c7-3a14e04e629d.png)

* 作成したワークフローを選択し、[デザイナー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/06275bbf-cd90-3513-f2e7-f5e45c7e880f.png)

* トリガーは今回はスケジュールトリガーを使います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/434c1707-523c-3562-ead6-1a321afcf637.png)

* [1時間]で設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/ac10ecb1-20ee-9e93-4d4f-bc86adbb9c51.png)

* 次にコネクターを追加していきます。デザイナーの＋ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c64cc086-12a5-c6bc-ca1e-f950f4910765.png)

* SFTPコネクターの[Get File Content]を選択します。執筆時点ではGetしかないようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/7197ebde-fba2-8120-f7bb-57b320c8fbd9.png)

* IPアドレスをVMのプライベートIPに設定します。ユーザー名等設定を入れていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/f55e750d-2d1a-cc68-0d4b-016848a0e01d.png)

* ファイルを設定します。今回はVMのユーザーホームディレクトリ直下にtest.txtを作ったのでファイル名のみ指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/fd6ecf73-b749-df8d-69cf-c8fd2e09a84f.png)

* 次にBlobコネクターを追加していきます。検索するとBlobはコネクタがいくつか出てきますが、[Azure]の方を選択して[Azure Blob Storage]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/623c8743-13e2-f44a-1945-68947648603f.png)

* [BLOBを作成する]というアクションを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/c02da7ba-7dab-419f-1b0d-4569a10a88c1.png)

* 接続名は任意で、Authentication typeに[Logic Apps Managed Identity]を選択します。マネージドIDを使うことでアクセスキーを使わずにアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/d3ce6105-dc48-3a07-e3a0-1f5f74c75b56.png)

* 事前に準備したストレージアカウント名を入力します。フォルダーのパスはコンテナー名を選びます。BLOB名、BLOBコンテンツは、SFTPコネクタで取ってきた動的な値を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1162443d-ec98-7220-7921-817d7b5bd0b6.png)

* この状態でワークフローを保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/b0dfc720-c070-6c22-3116-8edd656a5fce.png)

* ワークフロー概要画面に戻り、トリガーを手動実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/6badf1f6-2b38-537c-d8c8-60c5902d64dc.png)

* test.txtがBlobストレージに保存されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/9086380b-ffc6-8a50-1580-a287ddd8e6c1.png)

以上