Home About Contact
Azure , PostgreSQL , Kotlin Script

Azure Postgres Flexible Server

基本的にAzure CLI を使う方法で、 Azure Postgre flexible Server を試した。

簡単にメモを残します。

オフィシャルのガイドページ:

az login できていることが前提。

次のようなシェルスクリプトを用意して実行するだけです。 foobar とか 20250131 適当な文字列にしていますが、 これらの文字列が JDBCのURLなどに使われるので適切なものに差しかえてください。

locationjapaneast にしていますが、どこか適当なところでよい。

ただし、 最初 eastus を指定したらうまくいかなかった。 原因は不明。 PostgreSQL が存在しないリージョン(Location)もあるかも。

データベース名は以前のポストで使ったコードで作動検証しようとしているので ここでは pokemondb にしてあるだけです。

setup.sh

#!/bin/bash

RG=foobar-20250131
L=japaneast
PSQL_SERVER_NAME=foobarserver20250131
USERNAME=foobaradmin
PASSWORD=foobar20250131
DB_NAME=pokemondb

# リソースグループを作成
az group create \
    --name ${RG} \
    --location ${L}

# Postgres Flexible サーバを作成
az postgres flexible-server create \
    --location ${L} \
    --resource-group ${RG} \
    --name ${PSQL_SERVER_NAME} \
    --admin-user ${USERNAME} \
    --admin-password ${PASSWORD} \
    --sku-name Standard_B1ms \
    --tier Burstable \
    --public-access 0.0.0.0 \
    --storage-size 32 \
    --version 17

# データベースを作成
az postgres flexible-server db create \
    --resource-group ${RG} \
    --server-name ${PSQL_SERVER_NAME} \
    --database-name ${DB_NAME}

--public-access 0.0.0.0 指定することで Azure 内にデプロイされたすべてのリソースからサーバーにアクセスするためのパブリック アクセスが許可 になる。

https://learn.microsoft.com/en-us/cli/azure/postgres/flexible-server?view=azure-cli-latest

--public-access

Determines the public access. Enter single or range of IP addresses to be included in the allowed list of IPs.
IP address ranges must be dash-separated and not contain any spaces. 
Specifying 0.0.0.0 allows public access from any resources deployed within Azure to access your server.
Setting it to "None" sets the server in public access mode but does not create a firewall rule.
Acceptable values are 'Disabled', 'Enabled', 'All', 'None','{startIP}' and
'{startIP}-{destinationIP}' where startIP and destinationIP ranges from 0.0.0.0 to 255.255.255.255.

sh setup.sh して Azure 側の用意ができたら、 Azure Portal にアクセスしてネットワーク設定あたりで自分の使用しているマシンのIPアドレスを設定します。そうすることで、自分が使用しているマシンから Azure Postgres Flexible サーバにアクセスできるようになります。

ここでは以前のポストで書いたコードで作動検証するため、 JDBC関連の設定が必要になります。 setup.sh を実行したときに必要な情報が標準出力されるのでそれを控えておきます。 (おそらく Azure Portal にアクセスしてもわかる情報だとは思いますが。)

psql コマンドで接続確認

IP許可設定してあるマシンから psql コマンドを使ってアクセスしてみます。

$ psql -U foobaradmin pokemondb -h foobarserver20250131.postgres.database.azure.com
Password for user foobaradmin:

これだけです。 foobar とか 20250131 のあたりは読み替えてください。

JDBC の設定

以前のポストではデータベースに H2 Database を使っていましたが、今回は Postgres を使用するので、これを変更します。

@file:DependsOn("org.postgresql:postgresql:42.7.5")
...

Database.connect(
    url = "jdbc:postgresql://foobarserver20250131.postgres.database.azure.com/pokemondb",
    driver = "org.postgresql.Driver",
    user = "foobaradmin",
    password = "foobar20250131",
)

foobar とか 20250131 とかそのあたりは設定した値に読み替えてください。

コード全体では次のようになりました。

// psql.main.kts

@file:Repository("https://repo1.maven.org/maven2/")

@file:DependsOn("org.jetbrains.exposed:exposed-core:0.59.0")
@file:DependsOn("org.jetbrains.exposed:exposed-jdbc:0.59.0")
@file:DependsOn("org.postgresql:postgresql:42.7.5")

import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.ResultRow

import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.addLogger
import org.jetbrains.exposed.sql.StdOutSqlLogger
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.selectAll

data class Pokemon(val id: Int, val name: String)

object PokemonsTable : Table("pokemons") {
    val id = integer("id").autoIncrement()
    val name = varchar("name", length = 128)

    override val primaryKey = PrimaryKey(id)
}

val toPokemon: (ResultRow)->Pokemon = {
    Pokemon(it[PokemonsTable.id], it[PokemonsTable.name])
}

Database.connect(
    url = "jdbc:postgresql://foobarserver20250131.postgres.database.azure.com/pokemondb",
    driver = "org.postgresql.Driver",
    user = "foobaradmin",
    password = "foobar20250131",
)

transaction {
    addLogger(StdOutSqlLogger)

    println("--- drop and create pokemons table ---")
    SchemaUtils.drop(PokemonsTable)
    SchemaUtils.create(PokemonsTable)

    println("--- insert some pokemons ---")
    PokemonsTable.insert { it[name] = "Pikachu" }
    PokemonsTable.insert { it[name] = "Squirtle" }

    println("--- listup all pokemons ---")
    val pokemons = PokemonsTable.selectAll()
    pokemons.map(toPokemon).forEach {
        println(it)
    }
}

kotlin db.main.kts で実行すると、意図通り作動しました。

これは、ローカルに PostgreSQL をインストールしてセットアップするより楽かもしれない。 ただし、こちらのポストで試したように PostgreSQL を docker run する、そこに Kotlin でアクセスする ローカルに docker がすでに存在していれば、やはり Azure よりローカルの方が楽だった。

後始末

いつものリソースグループ削除コマンドで片付けます。

RG=foobar-20250131
az group delete --name ${RG} --yes

以上です。