GCP云函数在从命令行部署时返回404错误。

huangapple go评论115阅读模式
英文:

gcp cloud function returns 404 when deployed from command line

问题

如果我在控制台部署示例 hello world,URL/触发器是有效的。如果我从命令行部署,代码和云函数控制台中的属性看起来是完全相同的,但是URL返回404错误。我找不出差异/问题所在。

如果使用以下命令行方式部署 hello world 示例,部署的触发器/URL将显示"404 页面未找到"。

  1. gcloud functions deploy hellogo --entry-point=HelloWorld --trigger-http --region=us-central1 --memory=128MB --runtime=go116 --allow-unauthenticated

以下是示例代码:

  1. // Package p contains an HTTP Cloud Function.
  2. package p
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "html"
  7. "io"
  8. "log"
  9. "net/http"
  10. )
  11. // HelloWorld prints the JSON encoded "message" field in the body
  12. // of the request or "Hello, World!" if there isn't one.
  13. func HelloWorld(w http.ResponseWriter, r *http.Request) {
  14. var d struct {
  15. Message string `json:"message"`
  16. }
  17. if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
  18. switch err {
  19. case io.EOF:
  20. fmt.Fprint(w, "Hello World!")
  21. return
  22. default:
  23. log.Printf("json.NewDecoder: %v", err)
  24. http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
  25. return
  26. }
  27. }
  28. if d.Message == "" {
  29. fmt.Fprint(w, "Hello World!")
  30. return
  31. }
  32. fmt.Fprint(w, html.EscapeString(d.Message))
  33. }

希望这些信息对你有帮助。

英文:

If I deploy the example hello world within the console, the url/trigger works. If I deploy from command line it looks to be exact same code / attributes in cloud functions console, but the url is 404. I can't spot the difference/issue.

The deployed trigger/url shows - "404 page not found" for the below hello world example if deployed this way from command line.

  1. gcloud functions deploy hellogo --entry-point=HelloWorld --trigger-http --region=us-central1 --memory=128MB --runtime=go116 --allow-unauthenticated

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-html -->

  1. // Package p contains an HTTP Cloud Function.
  2. package p
  3. import (
  4. &quot;encoding/json&quot;
  5. &quot;fmt&quot;
  6. &quot;html&quot;
  7. &quot;io&quot;
  8. &quot;log&quot;
  9. &quot;net/http&quot;
  10. )
  11. // HelloWorld prints the JSON encoded &quot;message&quot; field in the body
  12. // of the request or &quot;Hello, World!&quot; if there isn&#39;t one.
  13. func HelloWorld(w http.ResponseWriter, r *http.Request) {
  14. var d struct {
  15. Message string `json:&quot;message&quot;`
  16. }
  17. if err := json.NewDecoder(r.Body).Decode(&amp;d); err != nil {
  18. switch err {
  19. case io.EOF:
  20. fmt.Fprint(w, &quot;Hello World!&quot;)
  21. return
  22. default:
  23. log.Printf(&quot;json.NewDecoder: %v&quot;, err)
  24. http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
  25. return
  26. }
  27. }
  28. if d.Message == &quot;&quot; {
  29. fmt.Fprint(w, &quot;Hello World!&quot;)
  30. return
  31. }
  32. fmt.Fprint(w, html.EscapeString(d.Message))
  33. }

<!-- end snippet -->

答案1

得分: 1

尝试重现您的错误,但在我的环境中无法复制。我使用了与您相同的命令,并且可以成功访问URL或通过HTTP触发器调用部署的Hello World云函数。

成功的curl输出如下:

GCP云函数在从命令行部署时返回404错误。

我建议您检查您尝试访问的URL,因为根据这个GCP文档:

如果您尝试调用不存在的函数,Cloud Functions会响应一个HTTP/2 302重定向,将您带到Google账户登录页面。这是不正确的。它应该响应一个HTTP/2 404错误响应代码。这个问题正在解决中。

解决方案是:

确保正确指定函数的名称。您可以使用gcloud functions call进行检查,它会返回一个正确的404错误,表示函数不存在。

您还可以参考这个完整的指南,使用Go运行时快速启动您的云函数创建和部署。

英文:

Tried to reproduce your error but couldn't replicate on my end. I've use the same command as yours and I can successfully access the url or call via HTTP trigger the deployed hello world cloud function.

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

  1. gcloud functions deploy hellogo --entry-point=HelloWorld --trigger-http --region=us-central1 --memory=128MB --runtime=go116 --allow-unauthenticated

<!-- end snippet -->

Output of successful curl:

GCP云函数在从命令行部署时返回404错误。

I suggest you check the url you're trying to access since according to this GCP doc:

> If you attempt to invoke a function that does not exist, Cloud Functions responds with an HTTP/2 302 redirect which takes you to the Google account login page. This is incorrect. It should respond with an HTTP/2 404 error response code. The problem is being addressed.

The solution

> Make sure you specify the name of your function correctly. You can
> always check using gcloud functions call which returns the correct 404
> error for a missing function.

You can also refer to this complete guide to quickstart your CF creation and deployment using the Go runtime.

答案2

得分: 0

谢谢大家,我遇到的项目比这个函数还要复杂。在尝试在较大的项目中部署单个函数/文件后,我选择了这条路径。如果我简化为只有一个名为hello.gogo.mod的文件夹,确实可以通过命令行部署它:

gcloud functions deploy hellogo --entry-point=HelloWorld --trigger-http --region=us-central1 --memory=128MB --runtime=go116 --allow-unauthenticated

  1. // go.mod
  2. module github.com/nickfoden/hello
  3. go 1.16

感谢快速回复和帮助。与其尝试在现有项目中创建一个具有较大go.sum、多个文件夹和现有服务器/ API的单个函数,我将从这里开始,使用一个单独的文件和一个云函数,并在此基础上构建,看看在什么时候/是否再次遇到问题。

英文:

Thanks all, my project where I got stuck has more code in it than just this function. I went down this path after trying to deploy a single function/file within larger project. If I simplify down to a folder with just a hello.go and go.mod indeed it works :-/ to deploy it from command line:

gcloud functions deploy hellogo --entry-point=HelloWorld --trigger-http --region=us-central1 --memory=128MB --runtime=go116 --allow-unauthenticated

  1. // go.mod
  2. module github.com/nickfoden/hello
  3. go 1.16

Thank you for the fast replies and assistance. Rather than try to create a single function within existing project with larger go.sum, multiple folders, existing server/api etc. I am going to start from here having a single file with a cloud function and build on top of it and see at what point/if I get stuck again.

huangapple
  • 本文由 发表于 2022年2月12日 08:01:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/71087844.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定