1
votes

Comment appeler une fonction Go Cloud à partir d'une autre fonction Go Cloud dans GCP

Objectif: je souhaite réutiliser de nombreuses fonctions Go de deux fonctions Go avec des déclencheurs HTTP.

Ce que j'ai essayé et les étapes pour reproduire le problème: p>

  1. Dans GCP, créez une nouvelle fonction cloud Go 1.11, déclencheur HTTP
  2. Nommez-le: MyReusableHelloWorld
  3. Dans function.go , collez ceci:
// Package p contains an HTTP Cloud Function.
package p

import (
    "encoding/json"
    "fmt"
    "html"
    "net/http"
    "example.com/foo/Potatoes"
)

// HelloWorld prints the JSON encoded "message" field in the body
// of the request or "Hello, World!" if there isn't one.
func HelloWorld(w http.ResponseWriter, r *http.Request) {
    var d struct {
        Message string `json:"message"`
    }
    if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
        fmt.Fprint(w, "error here!")
        return
    }
    if d.Message == "" {
        fmt.Fprint(w, "oh boy Hello World!")
        return
    }
    fmt.Fprint(w, html.EscapeString(d.Message))
}
  1. Dans go.mod , collez ceci: module example.com/foo
  2. Dans la fonction à exécuter, collez ceci: Potatoes
  3. Cliquez sur déployer. Cela fonctionne.
  4. Créer une autre fonction sans serveur Go dans GCP
  5. En fonction. allez, collez ceci:
package Potatoes

import (   
    "net/http"
)


// Potatoes return potatoes
func Potatoes(http.ResponseWriter, *http.Request) {

}
  1. Dans go.mod , collez ceci: module example.com/foo
  2. Dans la fonction à exécuter, collez ceci: HelloWorld
  3. Cliquez sur déployer. Cela ne fonctionne pas. Vous avez l'erreur: chemin d'importation inconnu "example.com/foo/Potatoes": impossible de trouver le module fournissant le package example.com/ foo / Pommes de terre

J'ai également essayé toutes sortes de combinaisons pour le module / les packages à importer. J'ai essayé sans la partie example.com/.

Autre petit problème: Les fonctions que je souhaite réutiliser peuvent toutes être dans le même fichier et n'ont pas vraiment besoin de déclencheur, mais il ne semble pas que le fait de n'avoir aucun déclencheur soit possible.

Questions et documentation connexes je n'ai pas pu atteindre mon objectif:

  1. Comment puis-je utiliser un sous-package avec Go sur Google Cloud Functions?
  2. https://github.com/golang/go/wiki/Modules , section go.mod


0 commentaires

3 Réponses :


0
votes

Il est probable que chaque fonction cloud définie dans la console soit indépendante de l'autre. Si vous souhaitez réutiliser le code, il est préférable de le structurer selon le document suivant et de le déployer à l'aide de la commande gcloud.

https://cloud.google.com/functions/docs/writing/ #structuring_source_code


0 commentaires

0
votes

Vous mélangez les choses: gestion des packages et déploiement de fonctions.

Lorsque vous déployez une Cloud Function, si vous souhaitez (ré) utiliser, vous devez appeler if avec le package http.

Si vous créez un package que vous souhaitez inclure dans votre code source, vous devez vous fier au gestionnaire de packages. Avec Go, le dépôt Git, comme Github, est le meilleur moyen d'y parvenir (n'oubliez pas d'effectuer une version et de la nommer comme prévu par Go mod: vX.YZ)

Ici, votre code peut ne fonctionne pas sans plus d'ingénierie et de publication / gestion de packages.

Je réalise les mêmes choses mais avec un Dockerfile et j'ai déploré mon code dans Cloud Run (que je vous recommande si vous n'êtes pas orienté événement et uniquement Orienté HTTP. J'ai écrit un comparaison sur Medium )

  • Racine
    • go.mod
    • pkg / foo.go
    • pkg / go.mod
    • service / Helloworld.go
    • service / go.mod

Dans mon helloworld.go , je peux réutiliser le package foo . Pour cela, j'effectue cela dans mon fichier service / go.mod

module service/helloworld

go 1.12

require pkg/foo v0.0.0

replace pkg/foo v0.0.0 => ../pkg

Ensuite, lorsque vous construisez votre conteneur, vous exécutez votre go build service / Helloworld.go depuis le répertoire racine.


0 commentaires

2
votes

Vous ne pouvez pas invoquer une fonction cloud à partir d'une autre, car chaque fonction est dans son propre conteneur indépendamment.

Donc, si vous souhaitez déployer la fonction avec une dépendance qui ne peut pas être téléchargée à partir d'un gestionnaire de packages, vous devez assembler le code comme ici et déployer à l'aide de CLI


0 commentaires