【Azure 環境編】Azure Functions RabbitMQ Extension を使用してみる

## 前回までのあらすじ

Azure Functions RabbitMQ Extension が GA になったのをきっかけに、自分のローカル環境内で RabbitMQ と RabbitMQ Extension をインストールして実行できるまで実施してみました。

[【ローカル環境編】Azure Functions RabbitMQ Extension を使用してみる](https://qiita.com/mym/items/8148e86aeb96d886b176)

今回は、前回作成した Azure Functions の関数コードを実際に Azure プラットフォーム上へデプロイを行い、Azure 環境でも RabbitMQ Extension が実行できるか試していきます。

## 準備

今回の構築作業は、ほとんどが Azure Portal 上で操作を行い対象のサービスリソースの作成を行います。慣れた方は、ARM Template やサードパーティー製のデプロイツール（Terraform, Serverless Framework など）を利用することもできます。

- [Container Instances](https://azure.microsoft.com/ja-jp/services/container-instances/)
- [Azure Functions](https://azure.microsoft.com/ja-jp/services/functions/)
- 前回の記事で作成した関数コード
    - [Timer Trigger を使用して 1 分毎に Queue へメッセージを送信する関数](https://qiita.com/mym/items/8148e86aeb96d886b176#timer-trigger-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-1-%E5%88%86%E6%AF%8E%E3%81%AB-queue-%E3%81%B8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0)
    - [Queue から取得したメッセージを別の Queue へ転送する関数](https://qiita.com/mym/items/8148e86aeb96d886b176#queue-%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%88%A5%E3%81%AE-queue-%E3%81%B8%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0)

### Azure 上に RabbitMQ を構築

RabbitMQ を一番簡単で短時間でホストする Azure サービスとして Container Instances を使用します。こちらのサービスでは、ユーザは利用する Dokcer イメージ, コンピューティングリソース量（CPU, メモリ）やネットワーク設定を行うだけで、Dokcer コンテナを起動することができます。

１）Azure Portal 上にて、`コンテナーインスタンス` を選択し、追加ボタンをクリックします。

２）コンテナインスタンスの作成画面では、イメージのソースを `Docker Hub またはその他のレジストリ` を選択して、イメージは Docker Hub に公開されている `rabbitmq:3-management` と入力をします。そして、OS の種類は `Linux` とします。

![スクリーンショット 2021-01-01 155504.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/d2d1d90f-39c1-11d5-d647-094d3ba18936.png)

３）次の画面ではネットワークの設定を行います。任意の DNS 名を入力します。ポートでは、RabbitMQ の AMQP プロトコルを利用するために、`5672`、UI 画面を利用するために `15672` を指定します。

![スクリーンショット 2021-01-01 155421.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/2f5ea34b-8f35-637f-05b6-6bab6064c6f2.png)

４）コンテナインスタンスのデプロイ後、概要画面を確認するとパブリック IP アドレスに紐づけられた FQDN 名があり、後ほど使用しますので控えておきます。

![スクリーンショット 2021-01-01 155859.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/de63be0a-e824-e3ed-4cfa-a01a7022b761.png)

５）RabbiMQ の管理画面を確認するために、http://FQDN名:15672 へアクセスをし、ユーザ名とパスワードはデフォルトでは以下のように設定されております。

- ユーザ名：guest
- パスワード：guest


![スクリーンショット 2021-01-01 160120.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/94481107-4b56-a482-e08a-4abc76194482.png)

６）UI 画面にて、test Queue と test2 Queue を作成します。詳しい構築内容は前回の記事をご参考ください。
[RabbitMQ の環境構築](https://qiita.com/mym/items/8148e86aeb96d886b176#rabbitmq-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)


### Azure 上に Azure Functions を構築

１）Azure Portal 上にて、`関数アプリ` を選択し、追加ボタンをクリックします。

２）関数アプリの作成画面では、インスタンスの詳細画面の設定がありますが、関数コードは C# で作成をしているため、ランタイムスタックを `.NET Core`、バージョンを `3.1` に指定します。

![スクリーンショット 2021-01-01 160805.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/05b9b40c-80a3-70aa-3fd7-8fe47ca16041.png)

４）次の画面へ進み、使用する OS と App Service Plan の選択を行います。特に指定はないのですが、今回は `Windows` と `Standard プラン` にしました。 

![スクリーンショット 2021-01-01 160909.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/1344a25b-f46d-aae9-2c1c-0613537b181a.png)

### 関数コードを Azure Functions へデプロイ

１）Visual Studio の関数コードが入っているプロジェクトにて、右クリックをし、`発行` を選択します。

![スクリーンショット 2021-01-01 160604.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/74c97f6f-7b23-005e-0e6a-5d6826474f66.png)

２）どこへ関数コードを公開するのかという設定を行うので、Aure を選択し、対象の Azure Functions を指定します。

![スクリーンショット 2021-01-01 160630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/956ed9db-f9fe-40dd-15fe-5cf1b5d87808.png)

![スクリーンショット 2021-01-01 161056.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/f3abb73c-f4e5-ad86-ef9a-643b6c29a56c.png)

３）デプロイの向き先の設定が完了後、Azure 上で使用する RabbitMQ の設定を行うため、赤枠で囲まれている `Azure App Service の設定を管理する` を選択します。

![スクリーンショット 2021-01-01 161130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/653d65dc-9645-ecb7-bc29-ef18be11ccce.png)

４）アプリケーション設定の画面が表示されるので、デプロイ先の Azure Functions が利用する RabbitMQ の設定を入力します。先ほど控えていた FQDN 名と RabbitMQ のユーザ名、パスワードを入力します。詳しい変更方法については、以下のドキュメントにも記載しております。
[Function App の設定](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-develop-vs#function-app-settings)

![スクリーンショット 2021-01-01 171110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/43bb20de-193c-dfc0-a478-4e9ad354c6f4.png)

５）設定が完了しましたら `発行` ボタンを押して、関数コードを Azure Functions へデプロイします。デプロイが完了後に、Azure Functions の Azure Portal の `関数` 画面では、2 つの関数が存在していることを確認します。`InputFunction` では、トリガーのタイプが `Rabbitmq` であります。

![スクリーンショット 2021-01-01 161302.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/c59ef774-634a-f714-b990-4c6392339463.png)


## 検証結果

###  [Timer Trigger を使用して 1 分毎に Queue へメッセージを送信する関数](https://qiita.com/mym/items/8148e86aeb96d886b176#timer-trigger-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-1-%E5%88%86%E6%AF%8E%E3%81%AB-queue-%E3%81%B8%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0)

関数のモニター画面より確認をすると、1 分間に 1 回タイマートリガーが起動をし、実行した日付を test Queue へ格納していることが分かります。

![スクリーンショット 2021-01-01 171800.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/cfd69b17-9aff-9e01-5663-8880e95df5af.png)


### [Queue から取得したメッセージを別の Queue へ転送する関数](https://qiita.com/mym/items/8148e86aeb96d886b176#queue-%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E5%88%A5%E3%81%AE-queue-%E3%81%B8%E8%BB%A2%E9%80%81%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0)

同時間に、test Queue へメッセージが入ったことを検知し、メッセージの取得を行い、test2 Queue へ送信していることが分かります。

![スクリーンショット 2021-01-01 171709.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149402/defcecf5-e4f3-9907-1c5f-702b66ca4e53.png)


## まとめ

今回もいかがでしたでしょうか。Azure Functions RabbitMQ Extension を利用して、Azure 上でも RabbitMQ からメッセージを取得して、他の Queue へ転送したことにより、トリガーとバインディングを行うことができました。RabbitMQ をホストしていて、Consumer が VM インスタンスなどを使用している方はこちらを検討するのも良いかもしれません。