AzureSpringAppsのリモートデバッグ機能を試してみる

## 1. きっかけ

2023年2月に開催されたSpringOne EssentialsのセッションでAzure Spring Appsの紹介がありました。  
そのセッションにてリモートデバッグの説明があり、おもしろい機能だな～と思っていたのですが、当時はAzure経験ゼロだったので、なかなか踏み出せずにいました。

業務でAzureを使い始めてやっと慣れてきたので、今回のアドベントカレンダー執筆を機にAzure Spring Appsを使ってみようと思い立ちました。

## 2. リモートデバッグ機能とは

Azure環境に配置されているアプリケーションをデバッグする機能のことです。  
AzureにデプロイされたSpringBootに対し、下記のようなデバッグが可能となります。

* ブレークポイントで処理を止める
* 変数の値を参照する
* etc..

## 3. この記事のゴール

* Azure Spring AppsにSpringBootアプリをデプロイする
* リモートデバッグ機能を動かす

## 4. Azure環境の構築

Azure Portal上でAzure Spring Appsを構築してみます。  
リモートデバッグのお試しが今回の目的であるため、必要最低限のAzureリソースで構築したいと思います。

### 4.1. Azure Spring Appsの構築

1. 「Azure Spring Apps」をクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/b87d5c13-cce2-c05f-4e6c-a70bc374e4d8.png)
2. 「作成」をクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/2614060e-85e1-61b1-e148-df3bf4c5d37e.png)
3. 設定値を入力
   * 基本

     |              項目               |       設定値        |                備考                 |
     | ------------------------------- | ------------------- | ----------------------------------- |
     | サブスクリプション              | -                   | (各環境に合わせる)                  |
     | リソースグループ                | -                   | (各環境に合わせる)                  |
     | 名前                            | remote-debug-sample |                                     |
     | リージョン                      | Japan East          |                                     |
     | ホスティング オプションとプラン | Standard            | Basicではリモートデバッグが利用不可 |
     | ゾーン冗長                      | 無し                |                                     |
     | サンプル プロジェクトのデプロイ | 無し                |                                     |
   
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/0f13735c-a799-1a25-4525-f27c4f69991f.png)
   * 診断設定 : ログを収集したい場合は有効にする
   * Application Insights : Application Insightsで監視/分析等したい場合は有効にする
   * ネットワーク : 特に設定しないでOK
   * タグ : 特に設定しないでOK
4. 確認と作成タブで、「作成」をクリック
5. 作成完了まで待つ (数分かかります)
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/7f04605d-deda-9eca-ecde-ddc381ac74cc.png)

### 4.2. アプリの構築

1. 3.1.で作った「remote-debug-sample」をクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/51198d58-8411-f148-cc7a-a5d0a3e93af4.png)
2. 設定 > アプリ タブの「アプリの作成」をクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/37073543-9d2c-f8e9-bb84-117fea6c1f27.png)
3. 設定値を入力し、「作成」をクリック

   |            項目             |          設定値          |
   | --------------------------- | ------------------------ |
   | アプリ名                    | greeting-app             |
   | デプロイの種類              | 成果物（Java/.Net Core） |
   | ランタイム プラットフォーム | Java 17                  |
   | vCPU                        | (デフォルト値)           |
   | メモリ                      | (デフォルト値)           |
   | インスタンス数              | 1                        |

   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/f1426193-fbb3-176f-a81d-6c79c1b88d2f.png)
4. 作成完了まで待つ
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/a354aa9f-04d5-6fe8-42e8-e3722a5b00a3.png)

### 4.3. ロールの付与

1. アクセス制御（IAM）タブの「追加」>「ロールの割り当ての追加」をクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/aeeb8dc6-dd96-c2bf-3d24-11be25ceedc3.png)
2. 「Azure Spring Apps Remote Debugging Role」 の選択
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/507050f5-65a1-45c1-8983-dd71d299ac5b.png)
3. ロールの割り当て先を選択する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/027d9b34-f7e3-e05a-e601-e264275283d8.png)
4. 「レビューと割り当て」をクリックし、割り当て完了まで待つ

以上で、Azure環境の構築は完了です。

## 5. SpringBootアプリのデプロイ & 動作確認

Azure Spring Appsに、SpringBootのサンプルアプリをデプロイし、動作確認を行います。

サンプルアプリは下記に置いてあります。  
<https://github.com/YukiYamagata/azure-spring-apps-sample>

デプロイ & リモートデバッグには、IntelliJ IDEAを利用します。

筆者の動作環境はこちら

|             アプリ              |  バージョン   |
| ------------------------------- | ------------- |
| IntelliJ IDEA Community Edition | 2023.1.2      |
| Azure Toolkit for IntelliJ      | 3.82.0-2023.1 |

### 5.1. デプロイ

1. IntelliJ IDEAに、プラグイン「Azure Toolkit for IntelliJ」を追加する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/7292126e-1756-7a33-7461-efc4bfd2e77f.png)
2. 「Azure Explorer」タブで「Sign In...」ボタンをクリック
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/7fca1c17-13ab-5ee6-0ce9-ab46d93b8977.png)
3. 各環境に合わせて、サインインする。
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/e957b079-4d3f-6f60-6129-6be2a90b5b53.png)
4. 「プロジェクト」タブで、プロジェクトを右クリックし、「Azure」>「Deploy To Azure Spring Apps..」を選択する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/ad90e78d-2954-02b4-052a-8ee1400dda25.png)
5. 各環境に合わせた値を入力し、実行する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/c9b97a9b-c27d-189f-26e4-abb4ae6e3362.png)
6. デプロイが完了するまで待つ
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/50d5b3fd-39b5-ed9f-3137-5d85a7395560.png)

### 5.2. 動作確認

1. Azure > Deployment Targets > アプリ(greeting-app)を右クリックし、「Access Test Endpoint」を選択する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/11b10d6c-9ed1-1b33-196a-fcc22e265ee1.png)
2. ブラウザでテストエンドポイントが表示される
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/55c77422-a5dd-0c3d-d0a7-9bc617b7cdd3.png)
3. テストエンドポイントの末尾に、「/greet」を追記して、サンプルアプリを動かす
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/3e44f529-cdad-ee88-5c2b-35c9e7dd78ee.png)

以上で、デプロイ & 動作確認は完了です。

## 6. リモートデバッグを試す

下記の手順で、デバッガーへアタッチします。

1. デバッグ機能を有効にする
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/03d1bd59-b4ce-58b4-b03c-473df89245c3.png)
2. デバッガーにアタッチする
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/64ad6411-2280-0d78-7176-1d020aefd99c.png)
3. 各環境に合わせてインスタンスを選択する
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/c435e3cf-ed87-0e4a-c1fa-8e1c729c61dc.png)
4. 下記のようなコンソールが表示されれば、アタッチ成功です
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/4150e2cf-3c59-ff9b-d6d0-a3cdae24079c.png)

デバッガーにアタッチできれば、後はローカルでデバッグする方法と同じようにデバッグすることが可能です。

* ブレークポイントでの処理Stop & 変数の値参照
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/39473147-3221-93c9-619e-ef810cf08a4d.png)
* 変数の値変更
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700744/2089e0ce-43c3-fcef-feea-ccf2b3411ae3.png)

## 7. まとめ

今回は、Azure Spring Appsのリモートデバッグ機能を試してみました。  
リモートデバッグ機能の使い道として、障害調査時のデバッグにはもちろん、複雑な異常系テスト（変数操作をして、リトライ1回目は失敗しリトライ2回目は成功させる etc..）を行うときにも活用できそうに思いました。

AWSにも「AWS Toolkit for Eclipse」なるものがありますが、Java開発ではIntelliJ利用者も多い（筆者も最近EclipseからIntelliJに利用を変えました）と思うので、普段使っているIDEでデバッグできるのは良いですね。

## 参考

* [Azure Spring Apps でアプリをリモートでデバッグする](https://learn.microsoft.com/ja-jp/azure/spring-apps/how-to-remote-debugging-app-instance?tabs=portal%2Cazure-portal%2CIntellij-extension)
* [Remote Debugging](https://learn.microsoft.com/ja-jp/visualstudio/debugger/remote-debugging?view=vs-2022)
* [Azure Spring Apps: The Easy Way to Run Your Apps](https://youtu.be/g_pqBL8_eE0?si=ItXwppaix-TwHqb3)