Cloud Run(GCP)でPlay Framework(Scala)をデプロイする
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公式クライアントライブラリなどを活用して、新しいサービスを開発できるとおもしろそうですね。
ではまた!