ちょっと話題の記事

こんなに簡単にコンテナをデプロイできちゃって良いんですか?GCP Cloud Runでコンテナを爆速デプロイしてみた

2019.05.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Cloud Runとは

Cloud Run  |  Google Cloud

Cloud Runは、HTTPでリクエストを受ける事が可能なステートレスコンテナを実行できるサービスです。
Knativeによって構築されており、Cloud Runによる管理または、GKEクラスタ上にデプロイする事が可能です。前者の場合、開発者がインフラストラクチャを意識する必要が無く、スケールアップ/ダウンも自動で行われます。この為、開発者はコア機能の実装にのみ集中できます。

Cloud Runは現在ベータ版です。

前提条件

  • プロジェクトの課金が有効になっている
  • Cloud Shellの使用方法を理解している

やってみた

Using System Packages Tutorial  |  Cloud Run  |  Google Cloud
上記の公式チュートリアルを参考に触ってみました。

APIの有効化

下記リンクにアクセスしてCloud Run APIを有効化します。有効化する際に、選択中のプロジェクトが意図したプロジェクトか確認を怠らないようにしましょう。

Cloud RUN APIの有効化

gcloudコマンドの設定

今回作業は全てCloud Shellで行います。Cloud Shellを起動します。
Cloud Runは現在ベータ版で、デフォルトではgcloudコマンドから操作できません。gcloud beta componentをインストールし操作可能にします。

gcloud components install beta

プロジェクトIDとデフォルトリージョン(今回Cloud Runを動かすリージョン)を設定します。us-central1を設定しました。

export PRIJECT_ID='YOUR_PROJECT_ID'
export REGION='us-central1'
gcloud config set project ${PRIJECT_ID}
gcloud config set run/region ${REGION}

サンプルアプリのダウンロード

サンプルアプリは、HTTPでDOT言語を受け取ると、GraphvizによってPNGを生成して描画します。


画像引用元: https://cloud.google.com/run/docs/tutorials/system-packages

ダウンロードと解凍を行います。

curl -O https://cloud.google.com/run/docs/samples/cloudrun-system_package-nodejs.tar.gz
tar -zxvf cloudrun-system_package-nodejs.tar.gz

コンテナのデリバリ

コンテナをCloud Buildを使ってビルドします。

gcloud builds submit --tag gcr.io/${PRIJECT_ID}/graphviz

Cloud Runで実行します。認証無し(誰からでもHTTPリクエストを受け付ける)で立ち上げて良いか確認されるので、yで回答します。

gcloud beta run deploy graphviz-web --image gcr.io/${PRIJECT_ID}/graphviz

Allow unauthenticated invocations to new service [graphviz-web]?
(y/N)?  y

Deploying container to Cloud Run service [graphviz-web] in project ${PRIJECT_ID} region [us-central1]
✓ Deploying new service... Done.

  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [graphviz-web] revision [graphviz-web-00001] has been deployed and is serving traffic at https://${SERVICE_DOMAIN}

正常にデプロイが完了しました!! traffic atの後のURLをメモして置いてください。

動作テスト

DOT言語でHTTPリクエストを行い、PNGが返ってくるかテストします。${SERVICE_DOMAIN}はメモした物に置き換えてください。

  • https://${SERVICE_DOMAIN}/diagram.png?dot=digraph Run { rankdir=LR Code -> Build -> Deploy -> Run }
  • https://${SERVICE_DOMAIN}/diagram.png?dot=digraph Run { alpha; beta; }

環境変数の定義

Cloud Runは実行中のアプリに環境変数を与える事が可能です。
TEST=80を与えてみました。

gcloud beta run deploy graphviz-web --image gcr.io/${PRIJECT_ID}/graphviz --set-env-vars="TEST=80"
Deploying container to Cloud Run service [graphviz-web] in project ${PROJECT_ID} region [us-central1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [graphviz-web] revision [graphviz-web-00002] has been deployed and is serving traffic at https://${SERVICE_DOMAIN}

.

コンソールで確認すると、新しいリビジョンに切り替わり、TEST=80が設定されていました。

ちなみに、最初はPORT=80と設定してみようとしたのですが、予約済み変数であるとエラーが出てリジェクトされてしまいました。これは、Cloud Runで動かすコンテナは環境変数PORTで指定されたポートをLISTENしステートレスでなければならないという制約を無視する環境変数なのでブロックされたと思われます。(わざとリクエストを受け付けられない状態にしてロールバックをやってみようとしていました。)

ロールバック

Cloud Runにはロールバックという機能はありませんでした。しかし、コンテナを動かすというサービスなので、以前のバージョンのコンテナを指定してデプロイすれば容易にロールバック可能だと考えています。

おまけ(コンソール周りのキャプチャ)

メトリクス・ログが取得されコンソールに表示されていました。

メトリクス

ログ

あとがき

タイトルどおりですが触ってみて、こんなにも簡単にコンテナをデプロイできてしまって良いのだろうかと衝撃を受けました。
特に触れていませんでしたが、Stackdriverと連携が可能なので、今回の通りに設定するだけでモニタリングとログ管理が完了しています。
しかも、スケールアップ/ダウンやロードバランスについて気にする必要もない...すごいですね。
あえて指摘するならば、ステートレスなコンテナしか動作ができないので、レガシーなアプリをそのままコンテナにして動かすといった場合には使用できないという事ぐらいでしょうか(ステートレスに作り変えるべきと言うことは置いておいて)
以上でした!!