Cloud Functionsで一度デプロイした関数を更新する方法

Google Cloud PlatformにあるCloud Functionsは非常に強力です。Node.JSベースのJavaScriptで書かれた関数をCloud Functionsにデプロイするだけで、 あら不思議、スケールするAPIのエンドポイントが出来上がってしまいます。

例えば、以下のようなコードを書いて、

exports.helloGET = function helloGET (req, res) {
  res.send('Hello, World!');
};

これをgcloudコマンドでデプロイするだけで、

$ gcloud beta functions deploy helloGET --trigger-http

curlコマンドで、

$ curl https://[GCP_REGION]-[PROJECT_ID].cloudfunctions.net/helloGET
Hello, World!

と返事をしてくれるでしょう。本来はもっと準備が必要ですが、その手順はここ に書いてあります。

コードを変更した後の再デプロイをしても反映されない

さて、上記のコードを以下のように変更したとします。

exports.helloGET = function helloGET (req, res) {
  res.send('Hello, Yoichiro!');
};

再度gcloudコマンドでデプロイします。

$ gcloud beta functions deploy helloGET --trigger-http
Deploying function (may take a while - up to 2 minutes)...done.                                                      
availableMemoryMb: 256
entryPoint: helloGET
・・・
status: ACTIVE
timeout: 60s
updateTime: '2018-01-17T11:24:53Z'
versionId: '2'

お、うまくいったぞ、と思ってアクセスしてみると、

$ curl https://[GCP_REGION]-[PROJECT_ID].cloudfunctions.net/helloGET
Hello, World!

コードの変更が反映されていないことが分かります。ダメじゃん。

コードの修正を反映させるためには

この問題、gcloudコマンドにオプションを指定するだけで、解決します。具体的には、ソースコードの場所を教えてあげるための --source オプションを付与すれば良いです。

$ gcloud beta functions deploy helloGET --source . --trigger-http

試してみると、

$ curl https://[GCP_REGION]-[PROJECT_ID].cloudfunctions.net/helloGET
Hello, Yoichiro!

きっと反映されていることがわかると思います。

まとめ

StackOverflowのこの記事の 存在に気がつくまで、Cloud Functionsのコンソールから削除して上げ直して・・・を繰り返していました。どう考えても不具合だと思うので、 --source オプションを指定せずとも更新されるように、早く直って欲しいですね。

このエントリーをはてなブックマークに追加

関連記事

2023年のRemap

Remapにファームウェアビルド機能を追加しました

Google I/O 2023でのウェブ関連のトピック

2022年を振り返って

現在のRemapと今後のRemapについて