ドキュメントとしてはここ
GitHubはここにある
実際のコード
import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" ) // Create channel to listen for signals. var signalChan chan (os.Signal) = make(chan os.Signal, 1) func main() { // Determine port for HTTP service. port := os.Getenv("PORT") if port == "" { port = "8080" log.Printf("defaulting to port %s", port) } srv := &http.Server{ Addr: ":" + port, Handler: http.HandlerFunc(handler), } // SIGINT handles Ctrl+C locally. // SIGTERM handles Cloud Run termination signal. signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM) // Start HTTP server. go func() { log.Printf("listening on port %s", port) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatal(err) } }() // Receive output from signalChan. sig := <-signalChan log.Printf("%s signal caught", sig) // Timeout if waiting for connections to return idle. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() // Add extra handling here to clean up resources, such as flushing logs and // closing any database or Redis connections. // Gracefully shutdown the server by waiting on existing requests (except websockets). if err := srv.Shutdown(ctx); err != nil { log.Printf("server shutdown failed: %+v", err) } log.Print("server exited") }
*ドキュメントから転記
こんな感じ。