前回の「Azure App Service からプライベートエンドポイント経由の Azure SQL Database へパスワードレス Entra 認証を試してみた」の続きです。

実際に Java の Spring Boot を使用して、マネージド ID を使用したパスワードレス認証を試してみました。

App Service 内の Java バージョン確認

$ java -version
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true 
openjdk version "17.0.12" 2024-07-16 LTS
OpenJDK Runtime Environment Microsoft-9889599 (build 17.0.12+7-LTS)
OpenJDK 64-Bit Server VM Microsoft-9889599 (build 17.0.12+7-LTS, mixed mode, sharing)

App Service 内に必要なツールをインストール

$ apt install -y maven unzip zip vim

Maven のバージョン確認

$ mvn -version
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true 
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 17.0.12, vendor: Microsoft, runtime: /usr/lib/jvm/msopenjdk-17-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.15.173.1-1.cm2", arch: "amd64", family: "unix"

Spring Boot CLI をインストール

$ curl -s "https://get.sdkman.io" | bash

$ source "$HOME/.sdkman/bin/sdkman-init.sh"

$ sdk install springboot

$ spring --version
Picked up JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true 
Spring CLI v3.4.2

検証用コンソールアプリを作成

$ spring init --build=maven --java-version=17 midtest

$ cd midtest

$ vi src/main/java/com/example/midtest/DemoApplication.java
package com.example.midtest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;

@SpringBootApplication
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);

		SQLServerDataSource ds = new SQLServerDataSource();
        ds.setServerName("mnrappsql-sqlsrv.privatelink.database.windows.net");
        ds.setDatabaseName("sqldb");
        ds.setAuthentication("ActiveDirectoryManagedIdentity");

        try (
            Connection connection = ds.getConnection();
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT @@VERSION;")
        ) {
            while (rs.next()) {
                System.out.println("SQL Server Version: " + rs.getString(1));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
	}

}
$ vi pom.xml

以下を <dependencies> に追加。

		<dependency>
			<groupId>com.microsoft.sqlserver</groupId>
			<artifactId>mssql-jdbc</artifactId>
			<version>12.8.1.jre11</version>
		</dependency>

		<dependency>
			<groupId>com.microsoft.azure</groupId>
			<artifactId>msal4j</artifactId>
			<version>1.19.0</version>
		</dependency>

		<dependency>
			<groupId>com.azure</groupId>
			<artifactId>azure-identity</artifactId>
			<version>1.13.3</version>
		</dependency>

検証用コンソールアプリの動作確認

$ ./mvnw spring-boot:run
(中略)
SQL Server Version: Microsoft SQL Azure (RTM) - 12.0.2000.8 
        Oct  2 2024 11:51:41 
        Copyright (C) 2022 Microsoft Corporation

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  48.205 s
[INFO] Finished at: 2025-02-16T00:16:21Z
[INFO] ------------------------------------------------------------------------

2025-02-16-appservice-springboot-01.png

参考

Microsoft SQL Server 用 JDBC Driver のダウンロード