Google Cloud RunでtDiaryを動かしてみた
$PORT の扱いにさえ気をつければ、あとは簡単!
Google CloudのCloud RunでtDiaryを動かしてみました。あくまで学習目的で、データの永続化やコンテナインスタンス間のデータ共有は考慮していませんが、簡単に触ったかぎりではうまく動いたようです。この記事ではデプロイまでの手順をご紹介します。
ざっと、以下のような流れです。
- プロジェクトの設定
- Dockerイメージの保存
- コンテナのデプロイ
- 動作確認
その前に、Cloud RunとtDiaryの概要をご説明します。
Cloud Runの概要
Cloud Runは、先月(2019年4月)開催のGoogle Cloud Next ‘19で発表された新サービスです。HTTPリクエストに応答できるDockerコンテナをデプロイするだけでWebサービスが公開できます。インフラはすべてGoogleに任せられ、オートスケールまでしてくれます。
まだベータ版なので、この記事の情報が古くなる可能性がある点にご留意ください。
tDiaryの概要
tDiaryはRubyで書かれた日記システムです。作者であるただただしさんの日記や、セキュリティ研究者である高木浩光さんの日記などで使われています。
データベースに依存しておらず、HerokuというPaaSサービスへのデプロイをサポートしていることから、Cloud Runの学習に適していると判断しました。
プロジェクトの設定
概要についてはこのくらいとして、ここからは、デプロイまでの手順をご紹介します。
何はともあれ、まずはプロジェクトを作成します。既存のプロジェクトを使ってもよいのですが、学習が終わったらプロジェクトごと削除できるほうが安心です。
次に、プロジェクトに対して課金を有効にします。Cloud Runは従量課金制ですが、無料枠があるので、学習目的であればコストを気にする必要性は低いでしょう。
その後、作成したプロジェクトでCloud Shellを起動し、下記のコマンドを実行します。これでCloud Runが使えるようになります。
$ gcloud services enable run.googleapis.com
Dockerイメージの保存
次に、Container RegistryにDockerイメージを保存します。具体的には以下の手順で進めます。
Gitリポジトリのclone
tDiaryのGitリポジトリをcloneします。Cloud Shellで下記のコマンドを実行すればOKです。
$ git clone https://github.com/tdiary/tdiary-core.git
$ cd tdiary-core
Dockerfileの編集
Dockerfileを下記のように編集します。テキストエディタはEmacs、nano、Vimが使えます。
$ cat Dockerfile
FROM ruby:2.6
MAINTAINER MATSUOKA Kohei @machuRUN mkdir -p /usr/src/app
WORKDIR /usr/src/appCOPY [ "Gemfile", "Gemfile.lock", "/usr/src/app/" ]
#RUN apt update && apt install libidn11-dev; \
RUN apt update && apt install libidn11-dev apache2-utils; \
echo 'gem "puma" \n\
gem "tdiary-contrib" \n\
gem "tdiary-style-gfm" \n\
gem "tdiary-style-rd" \n'\
> Gemfile.local; \
bundle --path=vendor/bundle --without=development:test --jobs=4 --retry=3COPY . /usr/src/app/
RUN if [ ! -e tdiary.conf ]; then cp tdiary.conf.beginner tdiary.conf; fi && \
bundle && \
bundle exec rake assets:copy#VOLUME [ "/usr/src/app/data", "/usr/src/app/public" ]
#EXPOSE 9292
EXPOSE $PORT
RUN htpasswd -cdb data/.htpasswd admin admpass
ENV HTPASSWD=data/.htpasswd
#CMD [ "bundle", "exec", "rackup", "-o", "0.0.0.0", "-p", "9292" ]
CMD bundle exec rackup -o 0.0.0.0 -p $PORT
編集のポイントは以下の通りです。
- 設定画面のBasic認証用に
apache2-utils
を追加し、.htpasswd
ファイルを作るようにした - ディスクが揮発的なので
VOLUME
の指定をコメントアウトした - ポート番号を
$PORT
で指定するようにした(Cloud Runから環境変数で渡されるため) CMD
では変数が展開されないのでシェル経由で実行するようにした(気づくのにしばらくかかりました…)
本質的なのは $PORT
に関わる3と4です。ここが理解できただけでも、学習した甲斐がありました。
Dockerイメージのビルドと保存
さて、Dockerfileが編集できたので、イメージのビルドと保存を進めましょう。下記のコマンドを実行すると、Cloud Buildによってイメージがビルドされ、Container Registryに保存されます。
$ gcloud builds submit --tag gcr.io/$DEVSHELL_PROJECT_ID/tdiary
ちなみに、$DEVSHELL_PROJECT_ID
にはプロジェクトIDがあらかじめ設定されています。
コンテナのデプロイ
ここまでくれば、あとはコンテナをCloud Runにデプロイするだけです。下記のコマンドひとつで実現できます。
$ gcloud beta run deploy tdiary \
--image gcr.io/$DEVSHELL_PROJECT_ID/tdiary \
--region us-central1 \
--allow-unauthenticated
リージョンは、現時点では us-central1
のみ指定可能です。--allow-unauthenticated
は、未認証の呼び出しを許可するためのフラグで、サービスを公開する場合に指定します。
デプロイが完了すると、サービスのURLが下記のように出力されます。
Service [tdiary] revision [tdiary-00001] has been deployed and is serving traffic at https://tdiary-**********-uc.a.run.app
動作確認
サービスのURLにアクセスし、tDiaryの初期画面が表示されることを確認します。
「サイトの情報」のリンク先には admin
/ admpass
でアクセスできます。Dockerfileで下記を指定しているためです。
RUN htpasswd -cdb data/.htpasswd admin admpass
アクセスすると、設定画面が表示されます。タイトルを編集して「OK」ボタンを押し、保存してみましょう。
日記の投稿は、右上の「追記」リンクからできます。
以上で、Cloud RunでのtDiaryの動作が確認できました。
まとめ
この記事では、Cloud Runの学習のため、tDiaryコンテナを動かしてみました。実運用するにはデータの外部保存が課題となりますが、ステートレスなサービスならすぐにでも始められそうです。
今後も同様のPaaSが出てきそうなので、DockerベースのWebサービスを開発する場合には、ポート番号は固定せずに $PORT
で受けるとよいかもしれません。ただし CMD
で変数が展開されない罠には注意が必要です。