0utputab1e

Cloud Run(GCP)でPlay Framework(Scala)をデプロイする

 2021-01-03
 

Dockerコンテナを手軽にサービスとしてデプロイできるCloud Runを使って、Scalaアプリケーションをデプロイする記事です。

Scalaのアプリケーションの作成実績があるPlay Frameworkで、最小構成でデプロイしていこうと思います。

sbtプロジェクトを新規作成

雛形作成

以下のコマンドで雛形プロジェクトを作成していく。

$ sbt new playframework/play-scala-seed.g8

アプリケーション設定

サーバレスでリージョンサービスのため、ホストの許可設定を調整する必要がある。

(適切にホストを許可してないと「Host not allowed」と怒られる)

また、本番環境用にシークレットキーの設定も動作上必要。

play.http.secret.key="(ランダムに生成しておいた文字列を入力)"
play.filters {
  hosts {
    allowed = ["."]
  }
} 

アプリケーションのパッケージング

以下のコマンドでアプリケーションのパッケージングを実施する。

$ sbt dist

成功すると、${PROJECT_ROOT}/target/universal/${PROJECT_NAME}-1.0-SNAPSHOT.zip

ができるので

$ unzip ${PROJECT_ROOT}/target/universal/${PROJECT_NAME}-1.0-SNAPSHOT.zip -d ./

で解凍しておく。

Dockerfileを定義

以下のようにイメージの定義をしていく。

FROM alpine:3.12

COPY ./gcloud-one-scala-1.0-SNAPSHOT ./gcloud-one-scala

WORKDIR ./gcloud-one-scala/bin

RUN apk --no-cache add openjdk8 bash

EXPOSE 9000

CMD ["./gcloud-one-scala"]

sbt distでパッケージングしたアプリケーションは動作のために

  • 依存クラス等のファイル群(distでできたディレクトリ一式)

と、alpine上で

  • jvm環境(バイナリ動作環境)
  • bash(バイナリ実行のため)

がそれぞれ必要なのでapk addでインストールのステップも含めておく。

ローカルでコンテナテスト

Cloud Runにデプロイする前に、コンテナが問題なく動作するかどうか確かめる。

$ docker build -t ${MY_NAME}/gcloud-one-scala:1.0 .
$ docker run -it --rm -d -p 9001:9000 --name gcloud-one-scala ${MY_NAME}/gcloud-one-scala:1.0

http://localhost:9001にアクセスして「Welcome to Play!」と出てきたらOKです。

gcloudでデプロイ

いよいよGCP上にデプロイしていく。

まずイメージをbuild & push

$ gcloud builds submit --tag gcr.io/${GCP_PROJECT_ID}/gcloud-one-scala

うまくいったら、次はCloud Runサービスをデプロイ。

$ gcloud run deploy --image gcr.io/${GCP_PROJECT_ID}/gcloud-one-scala --platform managed --allow-unauthenticated

サービス名を決めるように促されるので、EnterでOK。

続いてサービスを稼働するリージョンを番号で聞かれるので、東京の3(asia-northeast1)で決定。

先程のContainer Registry上に挙げたDockerイメージを元にサービスが立ち上がり、サービスURLを踏むと「Welcome to Play!」の表示がでてきたら成功です!

最後に

Scalaアプリケーションをサーバレスでデプロイする方法について調べてみましたが、わりと簡単にできるようでした。

ScalaはJavaのライブラリも利用できるので、GCP公式クライアントライブラリなどを活用して、新しいサービスを開発できるとおもしろそうですね。

ではまた!

 

>> Homeに戻る