はじめに
先日書いたAzure App Service上でSpring Bootで作ったDockerイメージを動かす - miyohide's blogの記事の続きです。DockerイメージからAzure Database for PostgreSQLに接続します。
サンプルアプリ
あまりサンプルアプリの準備に手間取りたくはなかったので、spring.io/guidesにて公開されているサンプルアプリのうち、「Accessing data with MySQL」を選び実装しました。
サンプルアプリはMySQLでの実装なのでPostgreSQLでの実装は変更が必要です。
ライブラリ
build.gradle
で読み込むライブラリをPostgreSQL用として
runtimeOnly 'org.postgresql:postgresql'
にしておきます。
User.java
JPAでUser.java
からテーブルが生成されますが、PostgreSQLではuser
テーブルは予約語とかぶってしまうためアプリケーションが起動しません。@Table
でテーブル名を指定しておく必要があります。
package com.example.demo; import javax.persistence.*; @Entity @Table(name = "users") public class User { @Id @GeneratedValue(strategy= GenerationType.AUTO) private Integer id; private String name; private String email; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
application.properties
開発環境と本番環境でDBのホスト名やユーザ名、パスワードなどは当然異なるので環境変数化しておくと後々楽です。こんな感じで設定すると良いでしょう。
spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:postgresql://${PG_HOST:localhost}:5432/${PG_DB:postgres} spring.datasource.username=${PG_USER:springuser} spring.datasource.password=${PG_PASS:TheP@ssw0rd12345}
また、${環境変数名:デフォルト値}
という形に指定しておくとなにかと便利かと思います。
docker-compose.yml
PostgreSQLをインストールするのは手間なので、Dockerで用意します。具体的には、docker-compose.yml
を以下の内容で作成します。
version: "3" services: db: image: postgres:11.5-alpine environment: POSTGRES_PASSWORD: 'TheP@ssw0rd12345' POSTGRES_USER: 'springuser' POSTGRES_DB: 'postgres' ports: - 5432:5432 volumes: - database:/var/lib/postgresql/data volumes: database: driver: local
あとはdocker-compose up
とすればPostgreSQLが起動します。
Azure Database for PostgreSQLの準備
Azure Database for PostgreSQLをAzureポータルから作成します。Web画面をクリックしていけば作成できます。
作成当初はどこからも接続できない状態になっていたので、「ファイアウォール規則」を設定します。本当はちゃんとネットワーク設計をすべきなんでしょうが、ここでは面倒くさかったので「Azureサービスへのアクセス許可」を「はい」にしてAzure App Serviceから接続できるようにしました。また、「現在のクライアントIPアドレスを追加する」を設定して、自分のマシンからPostgreSQLの中身を見れるように設定しました。
今回は使用しませんでしたが、「接続文字列」にはJDBCはじめデータベースへの接続文字列のサンプルが載っていました。
Azure App Service上で環境変数を設定する
あとは、Azure App Service上でapplication.properties
で指定したPG_から始まる環境変数の値を設定しておきます。
動作確認
自分のマシンからcurl
コマンドを叩いて動作を確認します。
$ curl アプリケーションのURL/users/add -d name=First -d email=email1 Saved User data. name = [First], email = [email1] $ curl アプリケーションのURL/users/all [{"id":1,"name":"First","email":"email1"}] $
うまくデータベースに値をinsertできているようです。自分のマシン上からAzure Database for PostgreSQLに接続してみます。
無事、値がinsertできていることが確認できました。