初心者がJava WebアプリケーションをAzureにデプロイした話

勉強の一環で、Servlet/JSPを使ったWebアプリケーションをチーム開発で制作中です。その際実践したAzureへのデプロイ手順をまとめてみました。

# やりたいこと
1. Eclipseで作った動的WebアプリケーションをAzureにデプロイしたい
→ [Azure Toolkit for Eclipse](https://learn.microsoft.com/ja-jp/azure/developer/java/toolkit-for-eclipse/)で解決

2. WebアプリケーションからJDBCでAzureに建てたDBサーバに接続できる状態にしたい
→ [Azure SQL Database](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/?view=azuresql-db)を作成することで解決

3. 勉強目的なので、無料ですべて済ませたい
→ [Azureの無料アカウント](https://azure.microsoft.com/ja-jp/free)を作ることができるっぽい（**※筆者未確認なので責任は負いかねます**）

# 1. Azure Toolkit for EclipseでWebアプリをデプロイする
## 1.1 Azureのアカウント作成
[Azureの無料アカウント](https://azure.microsoft.com/ja-jp/free)を作成します。
クレジットカード情報の入力が必要ですが、無料枠という言葉を信じて臆せず入力しましょう。

## 1.2 Azure Toolkit for Eclipseのインストール
Eclipseをすでにインストールしている場合は、[**ヘルプ**]メニューから、[**Eclipse マーケットプレース**]に移動して、"Azure Toolkit for Eclipse"をインストールしてください。

いろいろとプラグインが付いてきますが、特に気にせず進めちゃいます。詳しく知りたい方は、公式ドキュメントの「[ツールキットをインストールする](https://learn.microsoft.com/ja-jp/azure/developer/java/toolkit-for-eclipse/installation)」で確認してください。

インストールが終わったら、Eclipseを再起動します。

## 1.3 Eclipse内でAzureにサインインする
[**ツール**]メニューから[**Azure**]を選んで、[**Sign In**]しましょう。

サインインできたら、Azureアカウント作成時にもらった無料枠のサブスクリプションを選んであげて下さい。

## 1.4 動的Webアプリケーションのプロジェクトをデプロイする
Eclipseで作った動的Webアプリケーションのプロジェクトを[**プロジェクト・エクスプローラー**]内で右クリックして、[**Azure**]→[**Publish as Azure Web App**]を順に選択してください。

この時、デプロイ先となるAzure上のWebアプリを選択するのですが、初心者の私はAzure上にWebアプリなどまだつくっていないので、まず、EclipseからAzure上にWebアプリを作成します。その後に、ローカル上の資産をデプロイするイメージです。

[**Publish as Azure Web App**]を選択後、[**Deploy Web App**]のダイアログボックスが表示されます。右側の[**作成**]から[**Create App Service**]ダイアログボックスへ飛びます。ここで必要事項を入力してAzure上にWebアプリを新規作成できます。
- [**名前を入力してください**]には、好きな名前（プロジェクトの名前とか）を入れてあげてください
- [**Subscription**]は、アカウント作成時の無料枠のものを選択
- [**ランタイム**]は、Linuxにしました。自分のプロジェクトのバージョン等に合わせてください
- [**App Service Plan**]は、新規作成で、[**ロケーション**]を"Japan West"か"Japan East"にして、[**Pricing Tier**]は**F1**(**無料枠**)を選択します。(参考: [App Service Pricing](https://azure.microsoft.com/en-us/pricing/details/app-service/windows/?ref=microsoft.com&utm_source=microsoft.com&utm_medium=docs&utm_campaign=visualstudio))
- [**Resource Group**]は新規作成でデフォルトのままで構いません。(参考: [Steps to create a Java Web app in Azure](https://uaceit.com/2020/03/14/steps-to-create-a-java-web-app-in-azure/))

Azure上にWebアプリを作成できたら、再び[**Deploy Web App**]のダイアログボックスが表示されます。作成したWebアプリを選択して、[**配置**]してください。しばらく時間がかかることがありますが、[**Azure Activity Log**]内で進行状況が確認できるので、お茶を飲んで気長に待ちましょう。進行状況が、"Published"になったらデプロイ成功です。

あとは、https://[自分のWebアプリ名].azurewebsites.net/[URLパターン] とかにアクセスしてみて、自分の作ったページが表示されればおｋです。

# 2. Azure SQL Databaseに自分のWebアプリから接続できるようにする

## 2.1 Azure Portalにアクセスする
[Azure Portal](https://azure.microsoft.com/ja-jp/get-started/azure-portal)にアクセスし、先ほど作った自分のAzureアカウントでサインインします。

## 2.2 SQL Serverを建てる
[**リソース、サービス、ドキュメントの検索**]に"SQL"とか入力すると、["SQL Server"]なるものがでてくるので、これを選択します。

[**作成**]から、[**SQL Databaseサーバーの作成**]というページに遷移します。ここで、もろもろ設定していきます。
- [**サブスクリプション**]、[**リソース グループ**]は、ここまで上記で利用してきたものと同じで構わないでしょう
- [**サーバ名**]で、DBサーバの名前を決めて下さい
- [**場所**]は、"Japan West"か"Japan East"
- [**認証**]は、特にこだわりがなければ"SQL認証を使用する"でいいのではないかと思います。必要に応じてAzure AD認証を利用しましょう。SQL認証を使用する場合は、DBサーバの管理者ユーザをここで作成します。

あとは必要に応じてネットワークや追加設定を行って、DBサーバを作成し終えましょう。

# 2.3 建てたDBサーバ内にデータベースを作成する
Azure Portal内で、先ほど建てたSQL Serverを選択し、[**データベースの作成**]を行ってください。

ここから先の画面、一か月あたりの見積もりコストが常に右側に表示されますが、Azureの無料サービスの利用が月間制限に収まっていれば課金されることはないそうです。（**※筆者未確認なので責任は負いかねます**）(参考：[Azure SQL Databaseを無料で試すには、Azureの無料アカウントをご利用ください](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/free-sql-db-free-account-how-to-deploy?view=azuresql-db))

気にせず進めます。
- [**データベース名**]を入力してください
- [**データベースの構成**]は、[**Standard**]を選んで、[**DTU**]を10、[**データの最大サイズ**]を250に設定します

データベースが作成できたらおｋです。

## 2.4 EclipseにSQL ServerのJDBC Driverを導入する
[Microsoft SQL Server 用 JDBC Driver のダウンロード](https://learn.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server?view=sql-server-ver15)から、JDBCドライバをダウンロードします。

ダウンロードしたファイルを解凍したら、`mssql-jdbc-**.**.**.jre**.jar`みたいなJARファイルがあるはずなので、ローカルのWebプロジェクトの`/WebContent/WEB-INF/lib`に放り投げます。Eclipse上で`lib`内に投げたファイルを右クリックして[**ビルド・バス**]→[**ビルドパスに追加**]してあげることで、クラスパスも通ります。

JDBCドライバをJavaから利用する際は、ドライバー名が`com.microsoft.sqlserver.jdbc.SQLServerDriver`であることに注意して、DBに接続するクラス`ConnectionManager`的なものを以下のように定義します。

```java
public class ConnectionManager {
    
    private static final String DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    
    static {
        try {
            // ドライバーをロードする
            Class.forName(DRIVER_NAME);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("ドライバーロード失敗", e);
        }
    }
}
```

## 2.5 Azure上のSQL ServerにJDBCで接続できるようにする
`java.sql.DriverManager`の`getConnection()`メソッドの引数にすべき、DBアクセスのためのURLは、Azure Portalで先ほど作ったデータベースを選んで、[**接続文字列**]から[**JDBC**]をたどることで確認できます。コピペして、パスワードを入力しましょう。

先ほどの`ConnectionManager`クラスにコネクションを確立するメソッドなどを加えれば、自分のWebアプリケーションからAzure上のデータベースにアクセスできるはずです。（もしできなければ、Azure上データベースサーバのファイアウォールの設定を見直してください）

```java
import java.sql.Connection;

public class ConnectionManager {
    
    private Connection connection;
    private static final String DRIVER_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    private static final String URL = "<接続文字列をペースト>";
    
    static {
        try {
            // ドライバーをロードする
            Class.forName(DRIVER_NAME);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException("ドライバーロード失敗", e);
        }
    }
    
    // コネクションを確立するメソッド
    public Connection getConnection() {
        if (connection != null) {
            return connection;
        }
        
        try {
            connection = DriverManager.getConnection(URL);
            connection.setAutoCommit(false);
        catch (SQLException e) {
            throw new RuntimeException("コネクション確立失敗", e);
        }

        return connection;
    }

    // コネクションを切断するメソッド
    // コミットするメソッド
    // ロールバックするメソッド
}
```
# 今後やりたいこと
- DBに管理者ユーザ以外を追加して、適切な権限を与える
- チーム開発練習の実践を通して、今回のデプロイ時の設定がうまくいくかどうか検証する
- 1か月後、明細に謎の金額が記載されてしまわないか検証する

# 参考リンク
- [Eclipse を使用して Azure App Service 用の Hello World Web アプリを作成する](https://learn.microsoft.com/ja-jp/azure/developer/java/toolkit-for-eclipse/create-hello-world-web-app)
- [JDBC ドライバーの使用](https://learn.microsoft.com/ja-jp/sql/connect/jdbc/using-the-jdbc-driver?view=sql-server-ver15)
- [App Service Pricing](https://azure.microsoft.com/en-us/pricing/details/app-service/windows/?ref=microsoft.com&utm_source=microsoft.com&utm_medium=docs&utm_campaign=visualstudio)
- [Steps to create a Java web app in Azure](https://uaceit.com/2020/03/14/steps-to-create-a-java-web-app-in-azure/)
- [Azure SQL Databaseを無料で試すには、Azureの無料アカウントをご利用ください](https://learn.microsoft.com/ja-jp/azure/azure-sql/database/free-sql-db-free-account-how-to-deploy?view=azuresql-db)