LogicAppsでBlobをトリガーとした仮想マシンへのSFTPで実行する

# 目的
オンプレミスからクラウドへLift＆Shift（特にLift）する際に、VMを中心としたIaaSメインとなるものの監視やセキュリティなどの管理系機能はPaaSに移行したいというケースはよくあるかと思います。LogicAppsはそんなケースで活躍できる非常に便利なサービスで、うまく実装できれば大きくコストを抑制でき、VMを立てる必要がないのでOSのメンテナンスなども不要になります。

LogicAppsには多くのコネクタを用意していますが、その設定方法は公式サイトだけでは不十分なことがあるので、以下の2つの具体的なシナリオを用いて解説していきます。

1.　パブリックインターネット経由
2.　プライベート経由

## 前提知識

LogicAppsには大きく以下の2種類があり、今回は以下のように使い分けています。
- 従量課金（マルチテナント）：パブリックインターネット経由
- Standard（シングルテナント）：プライベート経由（VNET統合が必要なため）

LogicAppsのSKU比較表は[こちら](https://learn.microsoft.com/ja-jp/azure/logic-apps/logic-apps-overview#create-and-deploy-to-different-environments)

従量課金かStandardかは、デプロイする際に以下の項目で選択できます。
※消費が従量課金になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/bf2955d1-9a3f-9da3-2c1b-6e960b86624b.png)


## 1.パブリックインターネット経由

### 構成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/72c364d4-0626-c971-eb41-483bdbef2ed5.png)

### 手順

1. 各リソースのデプロイ
    - 仮想ネットワーク×1
    - サブネット×1
    - 仮想マシン
    - ストレージアカウント
    - LogicApps（従量課金プラン）

2. ネットワーク設定
    - サブネット
        - ネットワークセキュリティグループを作成している場合はSSHを許可するルールを設定

3. SFTP設定
    - 仮想マシンOpenSSHをインストール
        - https://learn.microsoft.com/ja-jp/windows-server/administration/openssh/openssh_install_firstuse
        - （必要に応じて）SFTP用ユーザーの作成、ルートディレクトリの変更
    - OpenSSH SSH Server サービスのスタートアップ タイプを自動に設定し、サービスを起動

4. LogicApps設定
    以下のようにロジックアプリデザイナーを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/7312ef94-c490-9e7c-b6f3-77d72dd62d7f.png)


## 2.プライベート経由

### 構成イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/5ad713d6-c1d3-23da-9c70-671534273b95.png)

### 手順

1. 各リソースのデプロイ
    - 仮想ネットワーク×1
    - サブネット×4
    - 仮想マシン（Bastionも同時に作成し、仮想マシンにパブリックIPは付与せずデプロイ）
    - ストレージアカウント
    - LogicApps（Standardプラン）
        - LogicAppsとVMをプライベートIPでアクセスするにはVNET統合が必要となり、LogicAppsのStandardプランを選択頂く必要があります。
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/e069b627-0e11-a720-5d29-70dea4ce6232.png)

2. ネットワーク設定
    - ストレージアカウント
        - ファイアウォールと仮想ネットワーク
            - 選択した仮想ネットワークとIPアドレスから有効
            - ファイアウォールにクライアントIPアドレスを追加（クライアントからファイルアップロードのテストを行うため）
        - プライベートエンドポイントを作成
    - サブネット
        - ネットワークセキュリティグループを作成している場合はSSHを許可するルールを設定
	
3. SFTP設定
    - 仮想マシンOpenSSHをインストール
        - （必要に応じて）SFTP用ユーザーの作成、ルートディレクトリの変更
    - OpenSSH SSH Server サービスのスタートアップ タイプを自動に設定し、サービスを起動
    - コマンド プロンプトでホスト鍵のフィンガープリントを取得（C:\ProgramData\ssh で実行）
        - `ssh-keygen -l -E MD5 -f ssh_host_ed25519_key.pub`  
        - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/060524e7-6b8f-2692-31aa-5b209dc93629.png)
	
4. LogicApps設定
    以下のワークフローを作成　※公式サイトは[こちら](https://learn.microsoft.com/ja-jp/azure/connectors/connectors-create-api-azureblobstorage?tabs=standard)
    - ビルトインBlobトリガーコネクタ：When a blob is added or updated
    - ビルトインBlobアクションコネクタ：Read blob content
    - ビルトインSFTPアクションコネクタ：Upload file content
        - 接続情報
            - 接続名：任意
            - SSH host address：サーバー名または IP アドレス
            - Username：接続に使用するユーザー名
            - Password：パスワード
            - Port number：22
            - Host key fingerprint：取得したフィンガープリントを入力
            - ※SSH private key, SSH private key passphrase は今回は使用しない
        - Upload file content アクション
            - File path：Response from read blob action Blob Name（Blob トリガーで取得した Blob 名）
            - Overwrite existing files：はい
            - File content：Response from read blob action Content（Read blob で取得した Blob）


実際にBlobにファイルをアップロードすると1~2秒ほどでワークフローが実行され、どのアクションにどれくらい時間がかかったか確認できます。（エラーになった場合も同じくこの画面でどこでなぜエラーになったか確認できます）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/a8c7c05c-1a6b-9a65-2da0-66445f3899f7.png)



# まとめ

プライベートアクセスが必須かどうかで、どちらのプランを選択するか決まってくると思いますが、まずは従量課金で試して頂き、ワークフロー数が多い場合やスループットを求められる場合にStandardを検討するのがよいかと思います。

||従量課金<br>(マルチテナント)|Standard<br>(シングルテナント)|
| - | - | - |
|基本的な考え方|1つのLogicAppsでは1つのワークフローのみ使用可|1つのLogicAppsで複数のワークフロー使用可|
|コスト|〇<br>最初の 4,000 回のアクションは無料|△<br>175.16ドル<br>(WS1:1vCPU/3.5メモリの場合)|
|コネクタ|△|〇|
|ネットワーク|パブリックアクセスのみ|VNET統合によるプライベートアクセスが可能|


あと、細かいですが、Blobコネクタを利用する際に、Blobへの接続情報を入力しますが、ビルトイン コネクタとマネージド コネクタで入力項目が異なります。

- 従量課金の場合（マネージドコネクタ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/92b8e9da-f8ff-d31d-11d2-851170416e4c.png)

「認証の種類」をアクセスキーにした場合、ストレージアカウント名とアクセスキーを入力します。


- Standardの場合（ビルトインコネクタ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3124498/05c0feec-714d-fef8-3e15-4080060d7d51.png)

「Authentication type」をアカウントキーにした場合、「Storage account connection string」にはストレージアカウントの"接続文字列"を入力します。

また、Standardでは接続に使用する値をすべてアプリケーション設定で格納するため、Web Apps と同じく、このような秘匿情報は Key Vault に格納して呼び出すようにした方がよりセキュアかと思います。

https://learn.microsoft.com/ja-jp/azure/app-service/app-service-key-vault-references?tabs=azure-cli#source-application-settings-from-key-vault



# 備考
マイクロソフトが提供しているBizTalk ServerからLogicAppsをはじめとしたAzureサービスへの移行をおススメしています。

https://learn.microsoft.com/ja-jp/azure/logic-apps/biztalk-server-to-azure-integration-services-overview