はじめに
Google Cloud Run を使ってみました。
Google Cloud Run を使ってみた - Qiita
同様にサーバアプリをクラウド環境で実行できるサービスが Google Cloud にあります。試してみたいと思います。
どの GCP サービスを選ぶ? 正しい選択のための決定木 | Google Cloud 公式ブログ
Google App Engine を使ってみる
Google App Engine とは
App Engine は、Python や Java で作成されたサーバアプリを実行できる、Google が提供するクラウドサービスです。
Amazon Elastic Beanstalk 、Azure App Service が同様のサービスのようです。
デプロイするアプリを用意する
以前に作成した Node.js アプリでもいいのですが、シンプルなウェブアプリを用意しましょう。
const express = require('express');
const app = express();
app.use(express.json());
function hello(req, res) {
let name = "App Engine";
if (req.query.name) {
name = req.query.name;
} else if (req.body && req.body.name) {
name = req.body.name;
}
res.send(`Hello, ${name}!`);
}
app.all('/', hello);
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
{
"name": "hello-appengine",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^5.1.0"
}
}
開発環境からデプロイする
上記の Node.js アプリを App Engine にデプロイして実行してみたいと思います。
Google App Engine (GAE) チュートリアル はじめの一歩編 | クラウドサービス徹底比較・徹底解説 (2022年版)
①Google Cloud にプロジェクトを用意する。そのプロジェクトで
課金 を有効にする
②App Engine サービスで「アプリを作成」する
③開発環境に Google Cloud CLI をインストールする
④Google Cloud CLI 環境でアカウントとプロジェクトを切替しておく
gcloudコマンドのアカウントやプロジェクトを切り替える方法 #GoogleCloud - Qiita
⑤デプロイしたいアプリのディレクトリに移動する
⑥デプロイする
app.yaml を用意して実行言語を指定します。
runtime: nodejs22
以下のコマンド実行してデプロイします。
$ gcloud app deploy
ソースコード一式がクラウドサーバにアップロードされます。
ローカルのフォルダにある node_modules などはアップロードしないよう .gcloudignore を用意するといいですね。
.gcloudignore
.git
.gitignore
node_modules/
Google Cloud のプロジェクトを見ると
-
Artifact Registryに「gae-standard」が作成される -
Cloud Storageにバケット「staging.(プロジェクトID).appspot.com」が作成される -
App Engineにサービス「default」が作成される -
公開 URL が取得できる
Cloud Code を使って GUI でデプロイするのは用意されていないようです。
GitHub からデプロイする
ウェブアプリを作っている開発者は、ソースコード管理に Git を使っていることでしょう。GitHub と連携して、リポジトリのソースコードが更新されると App Engine にデプロイされるようにできます。
Github Actions を利用して Google App Engine にデプロイする
App Engine と Cloud Run の違い
App Engine は、Python や Java で作成されたサーバアプリを実行できるサービスです。それは Cloud Run も同じですよね。どこが違うのでしょうか。
で、Cloud Run と App Engine って何が違うの? #GoogleCloud - Qiita
App Engine はコンテナイメージを「管理しなくていい」ようにしている、逆に言うと「管理できない」のが、コンテナを管理できる Cloud Run と一番の違いと言えそうです。「管理しなくていい」に関しては、Cloud Run もコンテナイメージの作成をサービスに任せることが可能になっているので、App Engine の強みと言えなくなっていますね。
さらに、実行できるアプリが「プロジェクトごと一つだけ」なのも大きな違いです。
課金ルールが違うので、同じサーバアプリを運用しても料金が違いそうです。
App Engine は 2008 年にサービスが開始しています。当初は Python と Java しか利用できず、当時の自分は(今もそうだが)Python も Java も使わなかったので、利用を考えなかったことを思い出します。
Google Cloud Functions を使ってみる
Cloud Functions とは
Cloud Functions は、Node.js 、Python 、Go 、Java 、Ruby 、PHP 、.NET で書かれたプログラムを、HTTP アクセスなどをトリガーにして実行できる、Google が提供するクラウドサービスです。
Amazon Lambda 、Azure Functions が同様のサービスのようです。
Cloud Functions と Cloud Run の違い
Cloud Functions も Cloud Run も、クラウドサーバでプログラムを実行するサービスですね。どこが違うのでしょうか。
で、Cloud Functions と Cloud Run って何が違うの? #GoogleCloud - Qiita
Cloud Run や App Engine が「サーバアプリを実行」するの対して、Cloud Functions は「関数(プロシージャ)を実行」します。
以前の WebSocket を使ったアプリは、起動し続けないといけないので Cloud Run で実行できますが、Cloud Functions はだめですね。
課金ルールが違うので、同じ機能のプログラムを運用しても料金が違いそうです。
ソースコードを用意する
デプロイするプログラムを用意します。
const functions = require('@google-cloud/functions-framework');
functions.http('hello', (req, res) => {
var name = "Cloud Functions";
if (req.query.name) {
name = req.query.name;
}
else if (req.body.name) {
name = req.body.name;
}
res.send(`Hello, ${name}!`);
});
{
"name": "hello-cloudfunctions",
"dependencies": {
"@google-cloud/functions-framework": "^3.1.0"
}
}
前述の Node.js アプリから関数 hello だけ抜出しています。↑
開発環境からコードをデプロイする
上記の Node.js プログラムを Cloud Functions にデプロイして実行してみたいと思います。
gcloudでCloud Functions の関数をデプロイする方法 | Hakky Handbook
①Google Cloud にプロジェクトを用意する。そのプロジェクトで
課金 を有効にする
Cloud Run API を有効にする
Cloud Build API を有効にしておく
Cloud Functions API を有効にしておく
②開発環境に Google Cloud CLI をインストールする
③Google Cloud CLI 環境でアカウントとプロジェクトを切替しておく
④デプロイしたいアプリのディレクトリに移動する
⑤デプロイする
$ gcloud functions deploy hellogcf --source=. --gen2 --region=us-central1 --runtime=nodejs22 --entry-point=hello --trigger-http --allow-unauthenticated
以下の指定します。gcloud run deploy は対話形式で指定できましたが、gcloud function deploy はコマンドラインでオプション指定するしかないようです。
- 関数名
- ソースコードの場所
- Cloud Functions サービスの世代(省略可)
- リージョン
- 実行言語
- エントリポイント
- トリガータイプ
- 認証
ソースコード一式がデプロイされます。Google Cloud のプロジェクトを見ると
-
Artifact Registryに「gcf-artifacts」が作成される -
Cloud Storageにバケット「gcf-(世代)-sources-(プロジェクトNO)-(リージョン)」「gcf-(世代)-uploads-(プロジェクトNO)-(リージョン)」が作成される -
Cloud Runにサービスが作成される -
公開 URL が取得できる
ローカルのフォルダにある node_modules などはコンテナにコピーしないよう .gcloudignore も用意するといいですね。
VS Code+Cloud Code でデプロイする
VS Code で拡張機能 Cloud Code を使ってみたいと思います。Cloud Shell Editor でも同じです。
VS Code(Cloud Code)を利用したGC環境へのCloud Functions のデプロイ #GoogleCloud - Qiita
前述の CLI を使った作業が、IDE から GUI で操作できます。
①Google Cloud にプロジェクトを用意する(前述の通り)
②VS Code に拡張機能 Cloud Code をインストールする
③拡張機能 Cloud Code → Cloude Functions で、Google Cloud にログインして、プロジェクトを選択する
④デプロイしたいアプリのディレクトリを開く
⑤Deploy Function を実行する。
対話形式で以下の指定します。設定した内容は launch.json に記録されます。
- 関数名
- Cloud Functions サービスの世代
- リージョン
- 実行言語
以下の指定は Cloud Console 画面でするしかないようです。
- トリガーを追加
- 認証
Google Cloud Console でデプロイする
Cloud Functions は、Google Cloud Console 画面だけで管理できます。
これから始める Cloud Functions 入門 | google-cloud-jp
①Google Cloud にプロジェクトを用意する(前述の通り)
②Cloud Run サービスで「関数を作成」する
設定画面で以下の指定します。
- 関数名
- リージョン
- 実行言語
- トリガータイプ
- 認証
「作成」します
③管理画面のエディタでソースコードを編集する
編集し終えたら「保存して再デプロイ」します。
GitHub リポジトリからデプロイする
ウェブアプリを作っている開発者は、ソースコード管理に Git を使っていることでしょう。GitHub と連携して、リポジトリのソースコードが更新されると Cloud Functions にデプロイされるようにできます。
Cloud Functions:CI/CDパイプラインの構築手順
開発環境でデバッグする
Cloud Functions にデプロイしたコードは関数だけなので、このままでローカルの開発環境で実行してデバッグできません。どうしたものでしょうか。
実行できるコードにする
App Engine などにデプロイしたコードなら、アプリなので実行できます。こちらのコードを Cloud Functions にデプロイしても、問題なく動作しました。とはいえ、不要なコードや設定が含まれたまま、デプロイして実行するのは抵抗あります。
functions-framework で実行する
調べていると、Google が提供するライブラリ functions-framework を使う方法が紹介されていました。
Cloud Run関数(functions)をローカル環境でデバッグする方法
上記の記事は Python を使ったものなので、それを参考にして Node.js プログラムを実行してみます。
まず、functions-framework ライブラリを開発環境にインストールします。
$ npm install @google-cloud/functions-framework
以下のコマンド実行すると、指定した関数を呼出できるウェブサーバが起動します。
$ npm node_modules/.bin/functions-framework --target=hello --sinature-type=http --port=8080 --debug
そのウェブサーバにアクセスします。curl でもいいし、ウェブブラウザでもいいでしょう。
$ curl -X POST "http://localhost:8080" -H "Content-Type: application/json" -d '{ "name": "Developer" }'
これを VS Code でデバッグ実行できるように設定しておきます。↓
{
"configurations": [
{
"name": "Start Server",
"type": "node",
"request": "launch",
"runtimeArgs": [
"node_modules/.bin/functions-framework",
"--target=hello",
"--port=8080"
],
"console": "integratedTerminal"
},
{
"name": "Launch Chrome",
"request": "launch",
"type": "chrome",
"url": "http://localhost:8080"
}
]
}



