Azure App Service上で動かしているDockerイメージからAzure Database for PostgreSQLに接続する

はじめに

先日書いたAzure App Service上でSpring Bootで作ったDockerイメージを動かす - miyohide's blogの記事の続きです。DockerイメージからAzure Database for PostgreSQLに接続します。

サンプルアプリ

あまりサンプルアプリの準備に手間取りたくはなかったので、spring.io/guidesにて公開されているサンプルアプリのうち、「Accessing data with MySQL」を選び実装しました。

spring.io

サンプルアプリはMySQLでの実装なのでPostgreSQLでの実装は変更が必要です。

ライブラリ

build.gradleで読み込むライブラリをPostgreSQL用として

runtimeOnly 'org.postgresql:postgresql'

にしておきます。

User.java

JPAUser.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の中身を見れるように設定しました。

f:id:miyohide:20200629195929p:plain

今回は使用しませんでしたが、「接続文字列」にはJDBCはじめデータベースへの接続文字列のサンプルが載っていました。

f:id:miyohide:20200629200040p:plain

Azure App Service上で環境変数を設定する

あとは、Azure App Service上でapplication.propertiesで指定したPG_から始まる環境変数の値を設定しておきます。

f:id:miyohide:20200628152516p:plain

動作確認

自分のマシンから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に接続してみます。

f:id:miyohide:20200629200640p:plain

無事、値がinsertできていることが確認できました。

ソース

github.com