概要
Azure App ServiceのLinux版にてFree版が提供されました。
物は試しと先日のYokohama.rbにてRailsアプリを動かしてみました。
ただ、SQLite3がロックされた状態になり、データの書き込みができない状態でしたので完全に動いたとは言えない状態です。
環境を作る
Azure PortalからApp Serviceを選択します。Rubyが2.3か2.4しかないのが寂しいところ。
Free版はJapan Eastには無いみたいでApp Serviceを作成しようとするとエラーが発生して作成できませんでした。場所をEast Asiaにすると作成できました。
準備
ローカルのGitからApp Serviceにpushすることでアプリケーションのデプロイができます。「デプロイセンター」の画面から画面に従い操作をするとクローン先や認証情報が取得することができます(スクリーンショット取り忘れた...)
また、簡単のために環境変数RAILS_ENV
をdeployment
にします。「構成」の場所にて設定する場所があるので環境変数を設定します。
他のページは日本語化されているのに、このページが英語なのはなんでなんだろう...
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の初期画面が表示されます。
RDBMSへのCRUD操作
Railsのscaffold
を使って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します。
ただこの方法では、テーブルに値を書き込む際にロックが掛かってしまって書き込みができない問題が発生します。
そもそもローカルで作ったSQLite3ファイルを無理やりApp Serviceに送っているのでこれは無理も無いことでしょう。
考察
ざっくりとAzure App ServiceでRailsアプリを動かすことをやってみました。短い間でのトライでしたが、とりあえず動かすことまでにたどり着けたのは一つの成果と思います。
あとで調べると、Azure App ServiceにRailsアプリをpushしたときに動く処理は以下のGitHubリポジトリに説明が書かれていました。
例えばpush時にdb:migrate
をさせるには環境変数APP_COMMAND_LINE
を独自に設定すれば良さそうです。
ただ、Rubyのバージョンが古いことやpackage.json
と同居できないことから実際にはRailsアプリをDockerイメージ化して動かすのがよいのでは?とちょっと思っています。