Azure App ServiceでRailsアプリを動かしてみる

概要

Azure App ServiceのLinux版にてFree版が提供されました。

blogs.technet.microsoft.com

物は試しと先日のYokohama.rbにてRailsアプリを動かしてみました。

yokohamarb.doorkeeper.jp

ただ、SQLite3がロックされた状態になり、データの書き込みができない状態でしたので完全に動いたとは言えない状態です。

環境を作る

Azure PortalからApp Serviceを選択します。Rubyが2.3か2.4しかないのが寂しいところ。

f:id:miyohide:20190519100215p:plain

Free版はJapan Eastには無いみたいでApp Serviceを作成しようとするとエラーが発生して作成できませんでした。場所をEast Asiaにすると作成できました。

準備

ローカルのGitからApp Serviceにpushすることでアプリケーションのデプロイができます。「デプロイセンター」の画面から画面に従い操作をするとクローン先や認証情報が取得することができます(スクリーンショット取り忘れた...)

また、簡単のために環境変数RAILS_ENVdeploymentにします。「構成」の場所にて設定する場所があるので環境変数を設定します。

f:id:miyohide:20190519100740p:plain

他のページは日本語化されているのに、このページが英語なのはなんでなんだろう...

Railsアプリの作成

App Serviceで動いているRubyは2019年5月18日現在、2.4.5なので、それに合わせてRailsアプリを作ります。また、bundlerのバージョンも2.0.1ではなく、1.x系を使っています。このため、何も考えずに最新のRuby・bundlerでRailsアプリを作るとRubyやbundlerのバージョン不一致でgit pushしたときに異常終了してしまいます。rbenvを使っているのなら、

$ rbenv install 2.4.5
$ rbenv local 2.4.5
$ gem install bundler -v 1.17.3
$ gem install rails
$ rails new azure-app

といった感じでRailsアプリを作るのが良いでしょう。

また、アプリのルートにpackage.jsonがあるとRailsアプリとは認識されず、node.jsアプリとして認識されます。これを解決できなかったので、package.jsonファイルを消すことで対処しました。

App Serviceにpush

あとは

$ git remote add azure デプロイセンターで提示されたクローン先
$ git push azure master

とすると、App ServiceにRailsアプリがpushされ、自動的にbundle installが行われ、Railsアプリが起動します。App ServiceのURLにアクセスするとRailsの初期画面が表示されます。

f:id:miyohide:20190519101922p:plain

RDBMSへのCRUD操作

Railsscaffoldを使ってRDBMSへのCRUD操作をするアプリを自動生成させ、App Service上で動かしてみます。

$ rails g scaffold post title:string body:text
$ rails db:migrate

App ServiceにRailsアプリをpushしたとき自動的にdb:migrateは走らないのでとりあえずローカルでできたSQLite3ファイルをApp Serviceにpushするようにします。.gitignoreファイルを編集して/db/*.sqlite3ファイルをGitの管理対象外からGit管理対象とし、git pushします。

ただこの方法では、テーブルに値を書き込む際にロックが掛かってしまって書き込みができない問題が発生します。

f:id:miyohide:20190519102822p:plain

そもそもローカルで作ったSQLite3ファイルを無理やりApp Serviceに送っているのでこれは無理も無いことでしょう。

考察

ざっくりとAzure App ServiceでRailsアプリを動かすことをやってみました。短い間でのトライでしたが、とりあえず動かすことまでにたどり着けたのは一つの成果と思います。

あとで調べると、Azure App ServiceにRailsアプリをpushしたときに動く処理は以下のGitHubリポジトリに説明が書かれていました。

github.com

例えばpush時にdb:migrateをさせるには環境変数APP_COMMAND_LINEを独自に設定すれば良さそうです。

ただ、Rubyのバージョンが古いことやpackage.jsonと同居できないことから実際にはRailsアプリをDockerイメージ化して動かすのがよいのでは?とちょっと思っています。