DropwizardアプリをHerokuにデプロイする

どうもざわです。よく行く蕎麦屋が極寒で辛いです。

はい、では始めます。
こちらを参考にさせてもらいました。

こちらの方はHerokuのGitにPushしてデプロイしていますが、
どうやら現在はGit介さず直接デプロイできるみたいなので、その辺をご紹介します。

Heroku用のデータソース設定

HerokuのPostgreSQLを使うための設定です。次のコンフィグ設定でローカルとHerokuで使用するデータソースを切り替える設定をします。

package demo.config.datasource;

import io.dropwizard.Configuration;
import io.dropwizard.db.DataSourceFactory;
import io.dropwizard.db.DatabaseConfiguration;

import java.net.URI;
import java.net.URISyntaxException;

public class HerokuDataSourceFactory {

    public static DataSourceFactory get(String databaseUrl) {
        try {
            URI dbUri = new URI(databaseUrl);
            final String user = dbUri.getUserInfo().split(":")[0];
            final String password = dbUri.getUserInfo().split(":")[1];
            final String url = "jdbc:postgresql://" + dbUri.getHost() + ':' + dbUri.getPort() + dbUri.getPath()
                    + "?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory";
            DatabaseConfiguration<Configuration> databaseConfiguration = new DatabaseConfiguration<Configuration>() {
                @Override
                public DataSourceFactory getDataSourceFactory(Configuration configuration) {
                    DataSourceFactory dsf = new DataSourceFactory();
                    dsf.setUser(user);
                    dsf.setPassword(password);
                    dsf.setUrl(url);
                    dsf.setDriverClass("org.postgresql.Driver");
                    dsf.setAutoCommitByDefault(false);
                    return dsf;
                }
            };
            return (DataSourceFactory) databaseConfiguration.getDataSourceFactory(null);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }
        return null;
    }
}

コンフィグの設定

環境変数でDATABASE_URLがあればHerokuのデータソースを使います。
ローカル実行時は通常のDB(ymlで記述)を使用することになります。

package demo.config;

import com.fasterxml.jackson.annotation.JsonProperty;
import demo.config.datasource.HerokuDataSourceFactory;
import io.dropwizard.Configuration;
import io.dropwizard.db.DataSourceFactory;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

public class ApplicationConfiguration extends Configuration {

    @NotNull
    @Valid
    private DataSourceFactory dataSourceFactory = new DataSourceFactory();

    @JsonProperty("database")
    public DataSourceFactory getDataSourceFactory() {

        String databaseUrl = System.getenv("DATABASE_URL");
        if(databaseUrl != null){
            return HerokuDataSourceFactory.get(databaseUrl);
        }

        return dataSourceFactory;
    }
}

POMの設定

ポイントは<build><plugins>org.apache.maven.pluginscom.heroku.sdkです。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>demo-dropwizard</groupId>
    <artifactId>demo-dropwizard</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>demo.DemoApplication</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>com.heroku.sdk</groupId>
                <artifactId>heroku-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <appName>demo-dropwizard</appName>
                    <includes>
                        <include>application.yml</include>
                    </includes>
                    <processTypes>
                        <web>java -Ddw.server.connector.port=$PORT -jar target/demo-dropwizard-1.0-SNAPSHOT.jar server application.yml</web>
                    </processTypes>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <properties>
        <dropwizard.version>1.1.4</dropwizard.version>
    </properties>
    <dependencies>
        (省略)
    </dependencies>
</project>

maven-shade-pluginはJarファイルを作るために必要になります。<mainClass>でMainクラスを指定しています。
ビルド後targetディレクトリにdemo-dropwizard-1.0-SNAPSHOT.jarが生成されます。

heroku-maven-pluginはHerokuデプロイ時に実行するコマンドを定義できます。Procfileは作る必要ないです。

<appName>にHeroku側のアプリ名を指定。<includes><include>でymlをデプロイに含めます。

Herokuではポートを自動で割り振るので-Ddw.server.connector.port=$PORTが大事です。またこれを設定するにはserverのtype: simpleを指定する必要があるので、次のセクションでymlを修正します。

application.ymlの修正

type: simpleにしています。

server:

  type: simple

  applicationContextPath: /
  connector:
    type: http
    port: 8080

...

Herokuへデプロイ

heroku-cliを持っていない場合は、インストールします。

ログイン

heroku login

プロジェクト作成

heroku create demo-dropwizard

PostgreSQL追加。今回はフリープランで。

heroku addons:create heroku-postgresql:hobby-dev

herokuへデプロイ(Uploading build…から5分くらい時間かかります)
mvnコマンドはMacだと最初から入ってるのかな?Windowsはインストールが必要かも

mvn clean heroku:deploy

アプリを開く。

heroku open

アプリとパスを指定する場合は以下のコマンドです。

heroku open -a demo-dropwizard /user

以上です。

データベース接続

そのままではテーブルが無くて怒られたので作成しました。
以下のコマンドでpsqlが使えます。あとは普段通りです。

heroku pg:psql

Herokuの管理画面からも接続情報みれました(こちらの接続は試していません)。

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする