12/04 Google Cloud Functions with Cloud SDK

2020/12/05に公開

この記事は、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