Как развернуть облачную функцию Go Google, размещенную в подпакете? - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть следующая настройка, и я пытаюсь создать многофункциональный проект GCP Cloud Function, но мне не удается развернуть какие-либо функции из-за ошибки «generi c», которая не очень помогает.

Структура моего проекта выглядит так: для простоты я выписываю только функцию1, но есть функция2 и т. Д. c.

Использование облачных функций * Поддержка 1005 * и go mod support

Структура проекта:

.
├── go.mod
├── function1
│   └── function1.go
├── common
│   └── common.go // Contains struct GCSEvent see https://cloud.google.com/functions/docs/calling/storage#functions-calling-storage-go
└── main.go

Фрагменты кода:

// go.mod
module github.com/me/myproject

go 1.13
// function1/function1.go
package function1

import (
    "github.com/me/myproject/common"
    // Other imports
)

func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    // Do Stuff
}
// common/common.go
package common

// See https://cloud.google.com/functions/docs/calling/storage#functions-calling-storage-go
type GCSEvent struct {
    // ...
}
// main.go
package main

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
    // Other imports
)

func main() {
    // Call Function1 from the command line for manual testing
    event := common.GCSEvent{/*...*/}
    function1.Function1(context.Background(), event)
}

function1.go ссылки common.go с использованием go Синтаксис импорта модуля, который GCP должен уметь разрешать.

Чтобы развернуть функцию, которую я вызываю gcloud, из каталога root проекта:

gcloud functions deploy Function1 --runtime=go113 <more arguments...>

И ошибка Я получаю

ОШИБКА: (gcloud.functions.deploy) OperationError: code = 3, message = Ошибка сборки: подробности ошибки сборки недоступны

Я упомянул совсем не очень помогает.

1 Ответ

1 голос
/ 02 февраля 2020

Для решения первой ошибки

ОШИБКА: (gcloud.functions.deploy) OperationError: code = 3, message = Ошибка сборки: подробности ошибки сборки недоступны

Я должен был понять, что облачные функции могут быть развернуты только (?) Из каталога root проекта, но моя облачная функция была в подпакете function1/

Чтобы решить эту проблему, я создал функцию прокси в новом файле functions.go в root проекта.

// functions.go DO NOT USE SEE BELOW
// functions.go DO NOT USE SEE BELOW
// functions.go DO NOT USE SEE BELOW
package main // Please note that this package is _wrong_ which will become clear further down in the answer

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
)

// Proxy function to the real Function1 in package function1
func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    return backupdelegate.Function1(ctx, gcsEvent)
}

Развертывание этого казалось успешным, пока я не получил новое сообщение об ошибке, немного менее запутанным, но все еще запутанным:

ОШИБКА: (gcloud.functions.deploy) OperationError: code = 3, message = Ошибка сборки: go: загрузка github.com/GoogleCloudPlatform/functions-framework-go v0.3.0

Я проверил go.mod и go.sum, но они не содержали ссылок на functions-framework-go. Это было то, что GCP скачивал «для меня», вместо того, чтобы просто сказать, что я делаю неправильно.

Так было до тех пор, пока я не прочитал описание GoogleCloudPlatform / functions-framework- go что я понял, что это, вероятно, связано с основной функцией моего кода.

После тестирования нескольких вещей я пришел к выводу, что:

  • Proxy Function1 не должен находиться в пакете с именем main
  • Чтобы сохранить исполняемый файл main. go Мне пришлось переместить его в другой каталог

Окончательная структура и изменения файла:

.
├── go.mod
├── function1
│   └── function1.go
├── common
│   └── common.go
├── testing
│   └── main.go
└── functions.go
// functions.go
// THIS IS THE CORRECT VERSION OF THE PROXY FUNCTION(S)
package functions

import (
    "github.com/me/myproject/function1"
    "github.com/me/myproject/common"
    "context"
)

// Proxy function to the real Function1 in package function1
func Function1(ctx context.Context, gcsEvent common.GCSEvent) error {
    return backupdelegate.Function1(ctx, gcsEvent)
}

Как видно из структуры проекта, мне пришлось переместить main.go в подпапку, потому что go допускает только один пакет на папку.

После этих последних изменяет успешно развернутые функции.

Этот ответ помог мне с структурированием подпакетов, go подарил ему немного любви: Как я могу использовать подпакеты с Go в облачных функциях Google?

В качестве последней заметки я хотел бы немного выделить документацию по облачным функциям GCP, в которой отсутствуют некоторые сложные примеры и которая не дает четкого представления о наименовании пакетов, размещении функций и т. Д. по крайней мере для Go проектов.

...