☁
12/04 Google Cloud Functions with Cloud SDK
この記事は、Serverless Hello World Advent Calendar 2020の4日目です。
Cloud SDKインストール
% echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
% sudo apt-get install apt-transport-https ca-certificates gnupg
% curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
% sudo apt-get update && sudo apt-get install google-cloud-sdk
% gcloud init
関数の作成
Cloud Functionsはコードジェネレータ等は特に用意していないようなので、素直に書いていきます。
% mkdir helloworld
% cd helloworld
% npm init
% npm install escape-html
サンプルは公式ドキュメントのそのままです。
const escapeHtml = require('escape-html');
/**
* HTTP Cloud Function.
*
* @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.helloHttp = (req, res) => {
res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
};
デプロイ
gcloud functions deploy
コマンドでデプロイします。
最初の引数は、上で定義した関数の名前に対応しています。
% gcloud functions deploy helloHttp --runtime nodejs12 --trigger-http --allow-unauthenticated
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
Deploying function (may take a while - up to 2 minutes)...⠛
For Cloud Build Stackdriver Logs, visit: https://console.cloud.google.com/logs/viewer?XXXX
Deploying function (may take a while - up to 2 minutes)...done.
availableMemoryMb: 256
buildId: 8fe487da-0dc2-41f1-abc4-ee6aa33bfbc9
entryPoint: helloHttp
httpsTrigger:
url: https://us-central1-helloworld-297620.cloudfunctions.net/helloHttp
ingressSettings: ALLOW_ALL
labels:
deployment-tool: cli-gcloud
name: projects/helloworld-297620/locations/us-central1/functions/helloHttp
runtime: nodejs12
serviceAccountEmail: helloworld-297620@appspot.gserviceaccount.com
sourceUploadUrl: XXXX
status: ACTIVE
timeout: 60s
updateTime: '2020-12-04T20:33:41.354Z'
versionId: '2'
Stackdriver LogsのURLが出力されるので、そこからデプロイ処理の詳細を見ることができます。親コンテナを取ってきて、その上にライブラリ等を展開し、コンテナとしてGCR(Container Registry)に登録しています。
動作確認
ではさっそく叩いてみます。
% curl -v 'https://us-central1-helloworld-297620.cloudfunctions.net/helloHttp?name=world'
* Trying 216.239.36.54:443...
* TCP_NODELAY set
* Connected to us-central1-helloworld-297620.cloudfunctions.net (216.239.36.54) port 443 (#0)
...(省略)...
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x564bb282adb0)
> GET /helloHttp?name=world HTTP/2
> Host: us-central1-helloworld-297620.cloudfunctions.net
> user-agent: curl/7.68.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< content-type: text/html; charset=utf-8
< etag: W/"c-00hq6RNueFa8QiEjhep5cJRHWAI"
< function-execution-id: b7te2qdzmu5o
< x-powered-by: Express
< x-cloud-trace-context: cef5bfab5659c38ee825fb503329a21e;o=1
< date: Fri, 04 Dec 2020 20:39:31 GMT
< server: Google Frontend
< content-length: 12
< alt-svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
<
* Connection #0 to host us-central1-helloworld-297620.cloudfunctions.net left intact
Hello world!%
無事動いていることが確認できました。
Discussion