Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Feb 4, 2021 - コメント - 日記

CloudRunでSinatra動かしてみた

GoogleCloudPlatform (以下GCP)にはCloudFunctionsCloudRun という2つのサーバレスサービスがあります。簡単にいうとこの2つは動作環境が違います。CloudFunctionsは開発者のコードを固定されたOS環境で動かすためのものであるのに対し、CloudRunは開発者が持ち込んだDockerコンテナを動かします。どちらを利用するべきか考える順番はCloudFunctionsCloudRunです。双方の違いは「自由と簡単」のトレードオフです。

今回CloudRunを初めて使ってみましたので記事にしてみました。

CloudRunでサービスを作るには、Dockerのコンテナイメージを用意しなくてはいけません。その際以下の様な作法?があります。

  • CloudRunで動くコンテナは動作時に決まる$PORT環境変数で待ち受ける
  • Volume, Networkなどは利用できない

その他権限系など無理とかいろいろありそうですが、とりあえず簡単なアプリを作ってみます。

Sinaraアプリを作成

SinatraでさっくりHellow, World!と返すアプリを作成します。

ソースは以下に置きました

tumf/sinatra-cloudrun

1
2
3
4
5
6
7
require 'sinatra'
set :port, ENV.fetch('PORT',4567)
set :bind, '0.0.0.0'

get '/' do
  "Hello, World!"
end

ポイントは、CloudRunが実行時に$PORT環境変数で指定するポートでリクエストを待ち受ける。

簡単ですね、Dockerfile は以下のようになっています。

FROM ruby:2.7

RUN gem install sinatra
WORKDIR /code
COPY . /code
RUN bundle install

CMD ["bundle", "exec", "ruby", "./app.rb"]

CloudRunサービスの作成

CloudRunで動かすのは非常に簡単です。サービスの作成からリージョンを選ぶ。

これをdocker build .してDockerリポジトリにpushしますが、GCPの外のDockerリポジトリ(hub.docker.com)とかは使えないので、今回はgithubをCloudRegistryにリンクしてGCP上でビルドして対応しました。

Githubをリポジトリプロバイダに選んで

ビルドするブランチを設定

あとは、未認証で動くように設定で完了

サービスに表示されるURLにアクセスすることでアプリを実行することができます。

実行した感じ

簡単ですね。