2021年7月7日水曜日

GCP の Cloud Run を試してみた

GCP の Cloud Run を試してみた

概要

Cloud Run はコンテナ化したアプリをデプロイすることができるプラットフォームです コンテナ化さえしていれば何でもデプロイできるので便利です (ローカルパスなどをマウントしていない場合) 今回は簡単な Web アプリを作成してデプロイしてみました

環境

  • macOS 11.4
  • docker
  • Ruby 3.0.1p64
  • Cloud Run
  • Container Registry

サンプルアプリの作成

今回は Ruby アプリをデプロイしてみます まずはアプリを作成します

  • mkdir test
  • cd test
  • bundle init
  • vim Gemfile
gem "sinatra"
gem "thin"
  • bundle config path vendor
  • bundle install
  • bundle lock --add-platform x86_64-linux
  • vim app.rb
require 'sinatra/base'

class WebApp < Sinatra::Application
  get '/' do
    'ok'
  end
end
require './app'

run WebApp

サンプルアプリのビルドとプッシュ

次に docker を使ってアプリをビルドします gcloud コマンドに専用のビルドコマンドがあるのでそれを使うとレジストリの認証をしてプッシュまでしてくれます

  • vim Dockerfile
FROM ruby:3.0.0

WORKDIR /usr/src/app
COPY Gemfile Gemfile.lock ./
ENV BUNDLE_FROZEN=true
RUN gem install bundler && bundle install

COPY . ./

CMD ["bundle", "exec", "rackup", "config.ru", "-o", "0.0.0.0", "-p", "8080"]

デフォルトだと Cloud Run は 8080 でアプリがリッスンすることを想定しているので 8080 を指定します

  • vim .dockerignore
Dockerfile
.bundle/
vendor/

dockerignore も作成します ビルドは Cloud Build を使うため不要なファイルはビルドに含めないようにします

  • gcloud builds submit --tag us.gcr.io/PROJECT_ID/test

PROJECT_ID の部分は gcloud projects list で確認できます またプッシュ可能なレジストリのリージョンは「gcr.io」「us.gcr.io」「eu.gcr.io」「asia.gcr.io」があり今回は us.gcr.io を選択しています

これは Cloud Run と Registry のリージョンを同じにするためでありそうすることでデプロイ時のネットワーク転送料が無料になります

gcloud build コマンドを使うとクラウドビルドしてくれるのでローカルで docker が動作している必要はありません

GCP の管理画面からコンテナレジストリの一覧を確認するとちゃんとイメージがプッシュされているのが確認できると思います

サンプルアプリのデプロイ

イメージがプッシュできたら Cloud Run にデプロイしてみます 今回は UI からデプロイしてみます

サービスの作成

まずはサービスを作成します Cloud Run の画面から「サービス作成」をクリックします

そしてサービス名とリージョンを指定します 今回は us-central-1 を指定します

次に先程プッシュしたイメージを選択します

最後のアプリを起動させるトリガーを選択します 今回は Web アプリなので Ingress で「すべてのトラフィックを許可する」を選択します また認証は「未認証の呼び出しを許可」にチェックを入れます

これで「作成」をクリックするとアプリのデプロイが完了します

動作確認

デプロイが完了すると以下のようにアクセス可能な URL が表示されます (何度かデプロイミスしたのでエラーの履歴があります)

あとは表示されている URL にアクセスするとアプリが動作しているのが確認できると思います

クリーンアップ

プロジェクトを作成できるのであればプロジェクトごと削除しましょう

プロジェクトを削除できないのであれば Cloud Run 上のサービスと Registry 上にプッシュしたイメージを削除しましょう

おまけ: コマンドでデプロイする

UI でやった作業をコマンドで行うこともできます いくつか質問されるので答える必要がありますが認証の部分の設定になるので UI でデプロイしていればわかると思います

  • gcloud run deploy --image us.gcr.io/PROJECT_ID/test --platform managed

最後に

Cloud Run に Web アプリをデプロイしてみました CPU やメモリの量を調整したり起動トリガーなどもいろいろ変更できるのでかなり使えるサービスだと思います

アプリをコンテナ化しているのであればプッシュするだけで起動できるのでわざわざインスタンスを構築する必要もなくなります

またクラウドストレージにクラウドビルドのリソースも残っているのでそれらも削除しておきましょう

トラブルシューティング

Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform is x86_64-linux. Add the current platform to the lockfile with `bundle lock --add-platform x86_64-linux` and try again.

が表示される場合は bundle lock --add-platform x86_64-linux してからビルド&プッシュしましょう クラウドビルドを使っているためプラットフォームが異なるのが原因です

Dockerfile の書き方にも少しくせがあります 自分が遭遇したエラーは

bundler: command not found: rackup
Install missing gem executables with `bundle install`

bundle config path vendor を Dockerfile から削除するとうまくパスが見えました

参考サイト

0 件のコメント:

コメントを投稿