Récemment, Serverless Framework a annoncé le support des Google Cloud Functions. Même s’il était possible de déployer simplement des Google Cloud Functions via le CLI officiel, ce framework permet d’industrialiser le processus de développement et déploiement des fonctions. Reprenons notre classique exemple et voyons comment le déployer avec ce nouveau couple.

La Google Cloud Function

Sans surprise, l’initialisation du projet se fait de cette façon :

$ serverless create --template google-nodejs --path my-service
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "C:\Users\pnom\serverless\google\my-service"

 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.14.0
 -------'

Serverless: Successfully generated boilerplate for template: "google-nodejs"

$ cd my-service
$ npm install

Ensuite, voici la fonction à exposer et qui doit se trouver dans le fichier index.js :

'use strict';

exports.hello = (request, response) => {
  response.status(200).send(JSON.stringify({ "message": "Hello " + request.body.name }));
};

Il faut également préciser dans le fichier de configuration serverless.yml l’identifiant du projet, le fichier où se trouve votre clé GCP et la fonction hello :

service: my-service

provider:
  name: google
  runtime: nodejs
  project: my-project-id
  credentials: /Users/pnom/.gcloud/keyfile.json

plugins:
  - serverless-google-cloudfunctions

package:
  exclude:
    - node_modules/**
    - .gitignore
    - .git/**

functions:
  hello:
    handler: hello
    events:
     - http: hello-world

Déploiement

Il n’y a plus qu’à demander le déploiement de la fonction qui sera exposée via Google Cloud Endpoints :

$ serverless deploy
Serverless: Packaging service...
Serverless: Compiling function "hello"...
Serverless: Creating deployment...
Serverless: Checking deployment create progress...
.
Serverless: Done...
Serverless: Uploading artifacts...
Serverless: Artifacts successfully uploaded...
Serverless: Updating deployment...
Serverless: Checking deployment update progress...
.........
Serverless: Done...
Service Information
service: my-service
project: my-project-id
stage: dev
region: us-central1

Deployed functions
hello
  https://us-central1-my-project-id.cloudfunctions.net/hello

Exécution

La fonction est invocable directement avec serverless :

$ serverless invoke -f hello -d '{"name":"you"}'
Serverless: botbelvj2fxw {"message":"Hello you"}

Mais la méthode la plus universelle est d’utiliser curl :

$ curl -H 'Content-Type: application/json' -d '{"name":" you"}' https://us-central1-my-project-id.cloudfunctions.net/hello
{"message":"Hello you"}

Comme d’habitude, les traces applicatives sont accessibles dans le terminal :

$ serverless logs -f hello
Serverless: Displaying the 10 most recent log(s):

2017-06-07T21:44:38.364746304Z: Function execution took 96 ms, finished with status code: 200
2017-06-07T21:44:38.269143279Z: Function execution started
2017-06-07T21:44:16.171434676Z: Function execution took 9 ms, finished with status code: 200
2017-06-07T21:44:16.163581255Z: Function execution started
2017-06-07T21:43:01.576274186Z: Function execution took 20 ms, finished with status code: 200
2017-06-07T21:43:01.557565786Z: Function execution started
2017-06-07T21:42:18.863188914Z: Function execution took 201 ms, finished with status code: 200
2017-06-07T21:42:18.662673016Z: Function execution started
2017-06-07T21:28:24.931930999Z: Function execution took 363 ms, finished with status code: 200
2017-06-07T21:28:24.570613073Z: Function execution started

Nettoyage

$ serverless remove
Serverless: Removing artifacts in deployment bucket...
Serverless: Removing deployment...
Serverless: Checking deployment remove progress...
...
Serverless: Done...

Conclusion

Si vous êtes habitué à utiliser Serverless Framework, vous n’allez pas être perdu. En revanche, le support de la plateforme de Google est encore assez jeune. Par exemple, il est impossible de personnaliser la configuration de la fonction via Cloud Endpoints. De même, il n’est possible ne configurer qu’un seul déclencheur par fonction. Reste à voir si ses limitations proviennent de GCP ou du framework… Et à quelle vitesse chacun évolueront !

Cette première version du plugin Google est donc très encourageante. A suivre avec attention !