寝ても覚めてもこんぴうた

プログラム書いたり、ネットワーク設計したり、サーバ構築したり、車いじったり、ゲームしたり。そんなひとにわたしはなりたい。 投げ銭は kyash_id : chidakiyo マデ

CloudRun 上でgoで書かれたサービスを動かす場合の基本的なmainの書き方

ドキュメントとしてはここ

cloud.google.com

GitHubはここにある

github.com

実際のコード

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")
}

*ドキュメントから転記

こんな感じ。