Oracle Database@Azure ~ AppServiceとの連携(前編)

これまでOracle Database@Azure の記事を書いてきましたが、今回は Azure AppService のアプリケーションを Oracle Database@Azure の AutonomousDB に接続する構成を紹介します。

AutonomousDB と AppService の2つの Paas を用いることで、仮想マシンを用意することなく、Web + DB アプリケーションを作成できます。

AutonomousDBにアクセスするAppServiceのアプリの構築手順を前編、後編の2回に分けて紹介します。

前編では、環境構築とアプリケーションの作成について紹介します。

環境構成

Vnet内に AutonomousDB と AppService を統合した構成とし、アプリケーション開発、データベース操作を行う仮想マシンを構築します。

AutonomousDB

Oracle Database@Azure におけるAutonomousDBの構築については以前の記事を参照してください。

blog.jbs.co.jp

今回の記事では データベース名を apdb001 として作成しています。

ネットワーク設定のアクセスタイプは「管理対象プライベート仮想ネットワークIPのみ」を選択し、「相互TLS (mTLS)認証が必要」にチェックをつけてください。

作成後にOCIコンソールに移動して、ウォレットをダウンロードします。

Azure AppService

SpringBoot で作成したアプリを動かすために、Javaを実行できる環境を構築します。

AppServiceから「+作成」-「+Web アプリ」をクリックします。

「基本」タブの各項目を設定します。Linuxプランには無料で使えるFreeもありますが、Vnet統合したいのでBasic以上を選択します。

項目 設定値
サブスクリプション (利用するサブスクリプション)
リソースグループ (利用するリソースグループ)
名前 アプリケーション名(URLになるので一意に設定する)
公開 コード
ランタイムスタック Java 21
Java Web サーバーのスタック Java SE (Embedded Web Server)
オペレーティング システム Linux
リージョン Japan East
Linux プラン (Japan East) 新規作成
価格プラン Basic 以上のプラン
ゾーン冗長 無効

「データベース」タブでは SQLAzure、PostgreSQL、MySQL、Cosmos DBのいずれかのデータベースを一緒に作成できますが、今回はOracleを用意するのでチェックをつけずに次に進みます。

「デプロイ」タブではGitHubとの連携ができますが、直接アプリをサーバーにアップするので何も設定せずに次に進みます。

「ネットワーク」タブでは仮想ネットワーク統合を有効にして仮想ネットワークに統合します。Oracleデータベースと同じ仮想ネットワークに作成することでAppServiceからOracle Database@AzureのAutonomousDBにアクセスできるようになります。

項目 設定値
パブリックアクセスを有効にする オン
仮想ネットワーク統合を有効にする オン
プライベート エンドポイントの有効化 オフ
VNet 統合を有効にする オン
送信サブネット データベースと同じVnetの空のサブネット

「監視とセキュリティ保護」タブではApplication Insightsの設定ができます。今回は接続確認なので「いいえ」を選択します。

「タグ」タブでは特に設定することがないので、そのまま次に進みます。

「確認および作成」タブで設定内容を確認して作成します。

アプリケーション開発環境

データベース、AppServiceと同じVnet上にLinuxの仮想マシンを構築して、これを仮想マシンとします。

まずはJavaをインストールします。

$ sudo dnf install -y java-21-openjdk
$ sudo dnf install -y java-21-openjdk-devel
$ java -version

ビルドツールのmavenをインストールします。

$ sudo dnf install -y maven
$ mvn -version

プロジェクトを作成し、Spring Bootのひな形をダウンロードします。

mkdir my-adb-app
cd my-adb-app
curl https://start.spring.io/starter.tgz \
  -d dependencies=web,jdbc \
  -d javaVersion=21 \
  -d bootVersion=3.2.0 \
  -d type=maven-project \
  -d packageName=com.example.demo \
  -d name=demo | tar -xzvf -

AutonomousDB 作成時にダウンロードしたzipファイルのウォレットを /my-adb-app/src/main/resources/walletに展開して格納します。

以下はプロジェクトの構成例になります。

my-adb-app/
├── pom.xml
├── src/
│   └── main/
│       ├── java/com/example/demo/
│       │   ├── Memo.java
│       │   ├── MemoController.java
│       │   └── MemoRepository.java
│       └── resources/
│           ├── application.properties
│           ├── templates
│           │  └── memo-list.html
│           └── wallet/ (ここに Wallet の中身を配置)
│               ├── cwallet.sso
│               ├── tnsnames.ora
│               └── ...

アプリケーション作成

今回はサンプルとして、データベースのテーブルの内容を表示するWEBアプリを作成します。

依存関係 (pom.xml) の整備

pom.xmlに以下の依存関係を追加します。

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc-bom</artifactId>
            <version>23.2.0.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>com.oracle.database.jdbc</groupId>
        <artifactId>ojdbc11-production</artifactId>
        <type>pom</type>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jdbc</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

データベース接続設定 (application.properties)

接続情報は、変数を用いて application.properties を以下のように編集します。文字コードもここで設定します。

Oracleデータベースの接続先文字列は AutonomousDB 作成時に取得したウォレットに含まれる tnsnames.ora ファイルに記載されています。

# Web エンコーディングの設定
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true

# サーバポート(デフォルト8080)
server.port=80

# DB接続設定
# ${環境変数名:デフォルト値} という形式で記述します
# Azure上では環境変数 TNS_ADMIN_PATH が優先され、ローカルでは /home/user01/wallet が使われます
spring.datasource.url=jdbc:oracle:thin:@apdb001_medium?TNS_ADMIN=${TNS_ADMIN_PATH:/home/user01/wallet}&oracle.jdbc.defaultNChar=true&CharacterEncoding=utf-8

spring.datasource.username=${DB_USER:ADMIN}
spring.datasource.password=${DB_PASSWORD:YourLocalPassword123}

# SQLの実行ログを出力(動作確認に便利)
logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG

Entity(データモデル)の作成

DB の 1 行を表現する Java クラスを作成します。

ファイル名: src/main/java/com/example/demo/Memo.java

package com.example.demo;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;

@Table("MEMOS")
public record Memo(@Id Long id, String content, LocalDateTime createdAt) {}

Repository(データアクセス層)の作成

Spring Data JDBC が提供するインターフェースを作成するだけで、SQL を書かずに基本的な操作が可能になります。

ファイル名: src/main/java/com/example/demo/MemoRepository.java

package com.example.demo;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;
import java.time.LocalDateTime;

@Table("MEMOS")
public record Memo(@Id Long id, String content, LocalDateTime createdAt) {}
[user01@OP1 demo]$ cat MemoRepository.java
package com.example.demo;

import org.springframework.data.repository.ListCrudRepository;

public interface MemoRepository extends ListCrudRepository<Memo, Long> {
    // これだけで findAll(), save(), deleteById() などが使えます
}

Controller の更新

メモの一覧表示と追加ができるようにします。

ファイル名: src/main/java/com/example/demo/MemoController.java

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MemoController {

    private final MemoRepository repository;

    public MemoController(MemoRepository repository) {
        this.repository = repository;
    }

    @GetMapping("/memos")
    public String viewMemos(Model model) {
        // DBから全件取得して "memos" という名前で画面に渡す
        model.addAttribute("memos", repository.findAll());
        return "memo-list"; // 次に作る memo-list.html を呼び出す
    }
}

HTML テンプレート(表形式)の作成

Spring Boot が自動的に読み込む場所に、表示用の HTML ファイルを作成します。

  • ディレクトリ: src/main/resources/templates/ (フォルダがない場合は作成してください)
  • ファイル名: memo-list.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>メモ一覧</title>
    <style>
        table { border-collapse: collapse; width: 80%; margin-top: 20px; }
        th, td { border: 1px solid #ddd; padding: 12px; text-align: left; }
        th { background-color: #f4f4f4; }
        tr:nth-child(even) { background-color: #f9f9f9; }
    </style>
</head>
<body>
    <h1>Oracle ADB メモ一覧</h1>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>内容</th>
                <th>登録日時</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="memo : ${memos}">
                <td th:text="${memo.id}">1</td>
                <td th:text="${memo.content}">サンプル内容</td>
                <td th:text="${#temporals.format(memo.createdAt, 'yyyy-MM-dd HH:mm:ss')}">2026-01-06</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

サンプルデータ作成

ブラウザで表示するデータをAutonomousDBに作成します。

CREATE TABLE memos (
    id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    content VARCHAR2(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- サンプルデータの挿入
INSERT INTO memos (content) VALUES ('SQLから直接更新');
INSERT INTO memos (content) VALUES ('こんにちは');
COMMIT;

おわりに

AutonomousDB と AppService の連携の前編として、AppService、AutonomousDBの構築とアプリケーションの作成について紹介しました。

アプリケーションを実行するための環境とアプリケーション本体が揃ったため、動作確認を行える状態となります。

後編ではアプリケーションをビルドしてAppServiceでWEBアプリを公開する手順を紹介します。

執筆担当者プロフィール
三条 光暢

三条 光暢(日本ビジネスシステムズ株式会社)

Oracle、PostgreSQLを中心に各種データベースの設計・構築・運用を携わっています。

担当記事一覧