Google Cloud Functinos を試してみる
ぼちぼちと、GCPを使って環境を作ろうと思っているのだけれど、
いかんせん仕事ではないのでまとまった時間が取れない。
試行錯誤してきたが、何とか形にするためには、もっと開発効率をあげる必要がある
ということで、FirebaseやGoogle Cloud APIと親和性が高そうな、Google Cloud Functionsを試す。
ざっと概要を読んで、チュートリアルを動かして感覚をつかみたい。
HTTPのチュートリアル
https://cloud.google.com/functions/docs/tutorials/http?hl=ja
1.準備
- GCPプロジェクト 課金有効にする
- SDKバージョンを最新に
> gcloud components update
2.開発環境を準備
2.1 Node.js
Node.js と Python と Goが選択できるが、Node.jsを選択する
https://cloud.google.com/nodejs/docs/setup?hl=ja
2.2 NVM
Windowsでは、Node.jsのバージョン管理ツールNVMが利用できないので、以下を利用する
nvm-windows https://blog.clock-up.jp/entry/2018/02/10/nodejs-manager-on-windows
準備として、以前NVMを利用せずに単独でNode.jsをインストールしていた場合、既存Node.jsのアンインストールとnpmディレクトの削除を行う。
npmディレクトリは以下にある。
C:\Users\{User}\AppData\Roaming\npm
Download – install (nvm-setup.zip) インストーラーをダウンロードし解凍、インストールする。
https://github.com/coreybutler/nvm-windows/releases
nvmコマンドが使えるようになるので、最新のNodeをインストールしアクティブにする
> nvm install latest > nvm list 13.11.0 > nvm use 13.11.0 Now using node v13.11.0 (64-bit)
ユーザー名に空白が含まれていたため、以下のエラーが発生した。インストーラーで、インストール先にブランクを含まないパスを指定することで回避
エラー内容
C:\Users\Hiroto Yagi>nvm use 13.11.0 exit status 1: 'C:\Users\Hiroto' is not recognized as an internal or external command, operable program or batch file.
NGなパスの例
C:\Users\Hiroto Yagi\AppData\Roaming\nvm
インストーラで空白を含まないパスを指定する
3.アプリケーションの準備
以下からサンプルをクローンする
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
今回のサンプルプロジェクトのフォルダへ
cd nodejs-docs-samples/functions/helloworld/
// [START functions_helloworld_get] /** * HTTP Cloud Function. * This function is exported by index.js, and is executed when * you make an HTTP request to the deployed function's endpoint. * * @param {Object} req Cloud Function request context. * More info: https://expressjs.com/en/api.html#req * @param {Object} res Cloud Function response context. * More info: https://expressjs.com/en/api.html#res */ exports.helloGET = (req, res) => { res.send('Hello World!'); }; // [END functions_helloworld_get]
4.関数のデプロイ
関数をデプロイする。
- –runtime :優先する Node.js のバージョンを指定
- –allow-unauthenticated :認証なしで関数にアクセス
> gcloud functions deploy helloGET --runtime nodejs8 --trigger-http --allow-unauthenticated API [cloudfunctions.googleapis.com] not enabled on project [426030064127]. Would you like to enable and retry (this will take a few minutes)? (y/N)? y Enabling service [cloudfunctions.googleapis.com] on project [426030064127]... Operation "operations/acf.1a3f3574-f2ee-47e6-aa8a-ae5c7c023bb8" finished successfully. Deploying function (may take a while - up to 2 minutes)...WARNING: Setting IAM policy failed, try "gcloud alpha functions add-iam-policy-binding helloGET --member=allUsers --role=roles/cloudfunctions.invoker" Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 entryPoint: helloGET httpsTrigger: url: https://us-central1-typea-gcp-api-trial.cloudfunctions.net/helloGET ingressSettings: ALLOW_ALL labels: deployment-tool: cli-gcloud name: projects/typea-gcp-api-trial/locations/us-central1/functions/helloGET runtime: nodejs8 serviceAccountEmail: typea-gcp-api-trial@appspot.gserviceaccount.com sourceUploadUrl: https://storage.googleapis.com/gcf-upload-us-central1-4fc76f27-799e-40e6-ba7b-606e7e3f0e01/fb7e562d-1c64-421c-8752-69e6d378959f.zip?GoogleAccessId=service-426030064127@gcf-admin-robot.iam.gserviceaccount.com&Expires=1584448781&Signature=qNToHvXwpCyMwnq3fLx%2FnZUggs4xm9Y8ZUv5QgjDUhVYoqqstSUEgD5sSKqmeXPwERls2z5sO3ydKdTJjjfen7AeLSuY%2BVZgdC4bbWIrUbosyoyBAi58a%2F%2BiDODYNT9jr8uUdmMZZCmaaoiu96Y3%2BtKcMWaNppT1KchXJL1EBG053GAtPwAqfVOy%2Ba3OVk51%2BXu4q4Upt3zlCiii0SRwi6z%2F5gVEc4hdCf0GcNk7txUWdOPrzvXz0JdIxcplcBp8r%2Fu%2FqJSgr6mL0tGi0UQdUYtsV7iqhSk%2FCtNtOJvwbN%2ByWTiSr2%2FN51pBVOuT2PB5MQavZrhLTq4j6HAvu6gD%2BA%3D%3D status: ACTIVE timeout: 60s updateTime: '2020-03-17T12:10:56.296Z' versionId: '1'
5.関数の実行
デプロイ時に結果として表示される、URLにアクセスする。
url: https://us-central1-typea-gcp-api-trial.cloudfunctions.net/helloGET
実行された!
5.1 関数のリスト
> gcloud functions list NAME STATUS TRIGGER REGION helloGET ACTIVE HTTP Trigger us-central1
5.2 関数の削除
最後に削除しとく。
> gcloud functions delete helloGET Resource [projects/typea-gcp-api-trial/locations/us-central1/functions /helloGET] will be deleted. Do you want to continue (Y/n)? y Waiting for operation to finish...done. Deleted [projects/typea-gcp-api-trial/locations/us-central1/functions/helloGET].