はじめに
この記事ではGoogle Cloud Runの概要と基本的な使い方を紹介します。
Cloud Runの細かな説明は公式ドキュメントを読んでいただくこととして、ここではなるべくイメージをつかむための説明を心がけて行こうと思います。
この記事を通じて「簡単そうだな!」とか「Cloud Runなんて怖くない!」みたいな感想を持ってもらえたら嬉しいです。
📝免責事項
Cloud Runには無料利用枠が設定されていますが、その無料枠を超過すると料金が請求されます。
この記事で紹介するサンプルアプリは1~2回動かすくらいなら無料枠を超えない想定ですが、仮に料金が発生したとしても当方は責任を負いかねますのでご了承ください。
Cloud Runの料金については公式の案内をご確認ください。
Cloud Runの概要
Cloud Runはコンテナ化したアプリをサーバにアップロード(以下「デプロイ」)し、HTTPリクエストやコマンドを通じてアプリを実行できるようにするサービスです。
また、Cloud Runはアプリの実行環境をアプリを動かす時だけ提供します。このためCloud Runは実際にリソースを使った分だけが課金対象になり余計なコストがかかりにくくなっています。
📝コンテナとは
コンテナとは、OSやアプリ、各種設定などを1つにまとめたものです。
コンテナのホストは内部的には特定のディレクトリをルートディレクトリとして扱い、マシン内にあたかももう1つ別のシステムがあるような振る舞いをさせているのですが、ここで一番重要なのはコンテナの最大の利点は「どんな環境でも同じようにアプリを動かせる」ということです。
Cloud Runはアプリをコンテナとしてデプロイさせることにより、異なる環境・言語で開発されたアプリを統一された環境で実行できるようにしているわけですねー
デプロイの種類
Cloud Runにデプロイするアプリは次の2種類に分かれます。
-
Cloud Run Services
HTTPリクエストやイベントをトリガーに動くアプリ。
(使用例: Webサービス、RESTfull API など)
-
Cloud Run Jobs
コマンドやイベントをトリガーに動くアプリ。
(使用例: データバッチ処理、レポート生成 など)
以下は Cloud Run Services と Cloud Run Jobs の簡単な仕様比較です。
項目 | Cloud Run Services | Cloud Run Jobs |
---|---|---|
実行環境 | コンテナ | コンテナ |
トリガー | HTTPリクエスト/イベント | コマンド/イベント |
スケーリング | トラフィックの変動に応じて自動スケール | 必要に応じてインスタンス数を手動設定 |
デプロイ数 | 最大1000 | 最大1000 |
リビジョン数 | 最大1000 | 最大1000 |
メモリ | 512MiB~32GiB | 512MiB~32GiB |
CPU | 1vCPU~8vCPU | 1vCPU~8vCPU |
処理時間 | 最大1時間 | 最大24時間 |
演習の準備
プロジェクトの作成
-
Google Cloudダッシュボードを開き「プロジェクトを作成」を選択してください。
-
プロジェクトの作成画面が開いたらcloud-run-drillなどの名称で新規プロジェクトを作成してください。
※ プロジェクトIDは重複が許されません。
※ 以後"cloud-run-drill"というIDは各自のプロジェクトIDに読み替えてください
Google Cloud APIの有効化
-
Artifact Registry APIの有効化
Artifact Registry APIサービスの詳細ページにアクセスして「有効にする」を選択してください。
このAPIはGoogle Cloud CLIでコンテナイメージをプッシュする際などに使用します。
-
Cloud Run Admin APIの有効化
Cloud Run Admin APIサービスの詳細ページにアクセスして「有効にする」を選択してください。
このAPIはCloud Runにアプリをデプロイしたりやデプロイを更新するのに使用します。
ロールの割り当て
-
IAMロールの設定画面で自分のアカウントに次のロールを付与してください。
-
Artifact Registry 管理者:
リポジトリを作成、管理するための管理者アクセス権。
演習用のリポジトリを作成するために使用。
-
BigQueryジョブユーザー:
ジョブを実行するためのアクセス権。
(クエリをジョブとして実行する場合に使用)
-
BigQueryデータ編集者:
データセットのすべてのコンテンツを編集するためのアクセス権。
(データセット内にテーブルを作成する場合に使用)
-
Cloud Run デベロッパー:
すべてのCloud Runリソースに対する読み取りと書き込みアクセス権。
ジョブやサービスを作成するために使用。
-
Cloud Run 起動元:
Cloud Runサービスを起動する権限。
ジョブやサービスを利用するために使用。
-
サービスアカウントユーザ:
オペレーションをサービスアカウントとして実行する権限。
(サービスアカウントを利用する場合に使用)
-
ストレージフォルダ管理者:
フォルダとオブジェクトに対する完全な制御権限。
(フォルダやオブジェクト(ファイル)の作成に使用)
-
ログ閲覧者:
Cloud Runなどのログを確認する権限。
ジョブやサービスの実行ログを確認するために使用。
-
Cloud Run Jobsのデプロイ
それではいよいよ Cloud Run でジョブを作って行きましょう。
Cloud Shell Editorを開く
-
Cloud Shell Editorを開き、「Open Folder」から任意のディレクトリをワークスペースとして追加してください。
📝Cloud Shell Editorとは
Cloud Shell EditorとはCloud Shellというクラウド上のシェル環境をブラウザでグラフィカルに操作するためのエディタアプリです。
Cloud Shellの詳細については公式ドキュメントに譲りますが、Cloud ShellおよびCloud Shell Editorには Google Cloud CLI や Docker などの演習に必要なアプリがプリインストールされていて無料で使えるのでお試しには丁度いいかなと思います。
作業ディレクトリの作成
-
任意のディレクトリに run-python というディレクトリを作成して移動してください。
mkdir run-python cd run-python
※ Cloud Shell Editorを開いていれば操作はGUIからもできますが、簡単のため操作の詳細はコマンドで補足します(以下略)
Dockerfileの作成
-
run-python ディレクトリ直下に Dockerfile という名前のファイルを作成します。
cloudshell open Dockerfile
-
Dockerfileを以下のように編集してください。
FROM python:3.11-slim COPY . /job WORKDIR /job RUN pip install --upgrade pip ENV TZ=Asia/Tokyo CMD ["python", "main.py"]
- FROM: コンテナのベースイメージを記述
- COPY: 資材のコピー元(.)とコピー先(/job)のディレクトリを指定
- WORKDIR: 作業ディレクトリを指定(cdコマンドのようなもの)
- RUN: コンテナ上で実行するコマンドを記述
- ENV: コンテナ上に登録する環境変数を記述
- CMD: コンテナ起動時に実行されるコマンドを記述
アプリの作成
-
run-python ディレクトリ直下に main.py という名前のファイルを作成します。
cloudshell open main.py
-
main.pyの内容を以下のように編集してください。
import sys def main(): for arg in sys.argv: print(arg) if __name__ == "__main__": main()
Dockerイメージのビルド
-
Cloud Runにデプロイするジョブをコンテナイメージとしてビルドします。
docker build -t run-python .
Dockerイメージのプッシュ
-
次のコマンドを実行してcloud-run-drillプロジェクトへの認証を対話的に進めてください。
gcloud init
-
Artifact Registoryにリポジトリを作成していない場合は以下のコマンドでリポジトリを作成します。
gcloud artifacts repositories create sample-repo \ --repository-format=docker \ --location=asia-northeast1 \ --description="Cloud Run Sample Repository" \ --project="cloud-run-drill"
- create sample-repo: "sample-repo"という名前のリポジトリを作成
- --location: コンテナイメージのアップロード先リージョン
- --description: リポジトリの説明文(任意)
- --project: コンテナイメージのアップロード先プロジェクト
-
コンテナイメージのアップロード先リージョンへの接続認証を行います。
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
-
コンテナイメージにタグ付けます。
docker tag run-python:latest \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/run-python:latest
※ Artifact RegistryのURIは以下のようなフォーマットになっています。
「リージョン名-docker.pkg.dev/プロジェクト名/リポジトリ名/イメージ名:タグ名」
-
Artifact Registryにコンテナイメージをプッシュします。
docker push asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/run-python:latest
ジョブの作成
-
Cloud Run ジョブ を作成します。
gcloud run jobs create run-python \ --image asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/run-python:latest \ --region=asia-northeast1 \ --tasks=1 \ --cpu=1 \ --memory=512Mi \ --max-retries=0 \ --parallelism=1 \ --task-timeout=300
- create run-python: "run-python"という名前のジョブを作成
- --image: アプリのコンテナイメージを指定
- --region: アプリのデプロイ先リージョンを指定
- --tasks: 並行稼働させるVMインスタンスの数を指定
- --cpu: 1つのVMインスタンスに割り当てるVCPU数を指定
- --memory: 1つのVMインスタンスに割り当てるメモリ容量を指定
- --max-retries: ランタイムエラーが発生した場合の再試行回数を指定
- --parallelism: ある時点で同時に実行されるタスクの最大数を指定
- --task-timeout: タスクのタイムアウト時間(秒)を指定
ジョブの実行
-
Cloud Run ジョブを実行します。
gcloud run jobs execute run-python --region=asia-northeast1
-
ログを確認しましょう。
ジョブの呼び出しが完了するとターミナルに "Or visit https://..." と表示されるので、そこに記載されているURLをブラウザで開いてください。
クリーンアップ
Cloud Run や Artifact Registry は無償ではないので、今後使用しないリソースは以下の手順でクリーンアップしておきましょう。
ジョブの削除
-
ジョブの一覧を確認します。
gcloud run jobs list
-
ジョブを削除します。
gcloud run jobs delete run-python --project cloud-run-drill --region asia-northeast1
-
ジョブが削除されていることを確認してください。
gcloud run jobs list
イメージの削除
-
イメージの一覧を確認します。
gcloud artifacts docker images list \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo
-
イメージを削除します。
gcloud artifacts docker images delete \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/run-python
-
イメージが削除されていることを確認してください。
gcloud artifacts docker images list \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo
Cloud Run Servicesのデプロイ
続いてCloud Runでサービスもデプロイしてみましょう。
作業ディレクトリの作成
-
任意のディレクトリに hello-app というディレクトリを作成して移動ください。
mkdir hello-app cd hello-app
Dockerfileの作成
-
hello-app ディレクトリ直下に Dockerfile という名前のファイルを作成します。
cloudshell open Dockerfile
-
Dockerfileの内容を以下のように編集してください。
FROM python:3.11-slim COPY . /app WORKDIR /app RUN pip install --upgrade pip RUN pip install --no-cache-dir -r requirements.txt ENV TZ=Asia/Tokyo CMD ["python", "main.py"]
アプリの作成
-
hello-app ディレクトリ直下に main.py という名前のファイルを作成します。
cloudshell open main.py
-
main.pyの内容を以下のように編集してください。
import os from flask import Flask app = Flask(__name__) @app.route("/") def hello_world(): return f"Hello, Cloud Run!\n" if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
requirements.txtの作成
-
hello-app ディレクトリ直下に requirements.txt という名前のファイルを作成します。
cloudshell open requirements.txt
-
requirements.txtの内容を以下のように編集してください。
Flask==3.0.3
※ コンテナ上のPythonにインストールするライブラリの一覧を記述します
Dockerイメージのビルド
-
Cloud Runにデプロイするサービスをコンテナイメージとしてビルドします。
cd hello-app docker build -t hello-app .
Dockerイメージのプッシュ
-
コンテナイメージにタグ付けます。
docker tag hello-app:latest \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/hello-app:latest
-
Artifact Registryにコンテナイメージをプッシュします。
docker push asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/hello-app:latest
サービスの作成
-
Cloud Runのサービスを作成する
gcloud run deploy hello-app \ --image asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/hello-app:latest \ --no-allow-unauthenticated \ --region=asia-northeast1 \ --cpu=1 --memory=512Mi \ --min-instances=0 \ --max-instances=1 \ --timeout=10 \ --concurrency=1
- deploy hello-app: "hello-app"という名前のサービスをデプロイする
- --no-allow-unauthenticated:承認済みのクライアントからのみ実行許可する
- --min-instances: 最小インスタンス数
- --max-instances: 最大インスタンス数
- --timeout: タイムアウト時間(秒)
- --concurrency: 1インスタンスあたりの最大同時リクエスト数
サービスの実行
-
サービスのエントリポイントを確認します。
# サービスの一覧を表示 gcloud run services list # サービスの詳細を表示 gcloud run services describe hello-app --region=asia-northeast1
※「URL」欄に表示さるURLがエンドポイントです
-
アクセストークンを取得する
今回は認証済みのユーザしかサービスを実行できないようにしているため、リクエストに認証情報(トークン)を載せる必要があります。
以下のコマンドでトークンを取得しておきましょう。
# TOKEN変数に現在認証しているアカウントのアクセストークンを代入 TOKEN=$(gcloud auth print-identity-token)
-
サービスを実行する
事前に取得したエンドポイントとアクセストークンを使ってCurlコマンドでサービスを実行してみます。
curl -H "Authorization: Bearer $TOKEN" https://hello-app-xxxxxxxx.a.run.app
※ "https..."から始まるURLはエンドポイントのURLと置き換えてください
※ コマンドラインに「Hello, Cloud Run!」と表示されればテストは成功です!
クリーンアップ
サービスの削除
-
サービスの一覧を確認します。
gcloud run services list
-
サービスを削除します。
gcloud run services delete hello-app --project cloud-run-drill --region asia-northeast1
-
サービスが削除されていることを確認します。
gcloud run services list
イメージの削除
-
イメージの一覧を確認します。
gcloud artifacts docker images list \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo
-
イメージを削除します。
gcloud artifacts docker images delete \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo/hello-app
-
イメージが削除されていることを確認します。
gcloud artifacts docker images list \ asia-northeast1-docker.pkg.dev/cloud-run-drill/sample-repo
おわりに
Cloud Runにシンプルなジョブやサービスをデプロイする手順を紹介しました。
Cloud Runのイメージは湧いてきたでしょうか?
この記事が分かりやすかったら次の記事も読んでいただけると嬉しいです。