miyazi888の覚え書き日記

学習したことを書き留めてます。

GCP Cloud RunでDockerfileを作らなくてもデプロイして動作が可能か検証

Cloud Runで何かのアプリをデプロイする時にはコンテナイメージを作ったり、githubと連携したりする必要がある、と誤解していましたが、デプロイコマンドの--sourceオプションを使用することでローカルのソースからデプロイまで可能という記事を読んで、自分でも試してみました。

手順

検証用のアプリ作成

アクセスするとJSONを返却するだけの検証用APIサーバを作成します。

main.go

package main

import (
    "encoding/json"
    "log"
    "net/http"
    "os"
)

type Hello struct {
    Title string
    Desc  string
    Ver   string
}

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        json.NewEncoder(w).Encode(Hello{Title: "Hello", Desc: "BuildPack", Ver: "0.0.1"})
    })
    port := os.Getenv("PORT")

    log.Printf("Listening on %v", port)
    log.Fatal(http.ListenAndServe(":"+port, nil))
}

動作確認

まずはローカルで動作確認します。 ターミナルを開いて上記のコマンドでAPIサーバを起動。

export PORT=8080
go run main.go

別のターミナルを開き、APIサーバにリクエストを投げてみます。

> curl http://localhost:8080/
{"Title":"Hello","Desc":"BuildPack","Ver":"0.0.1"}

意図したレスポンスが返却されてきました。

Cloud Runへのデプロイ

以下のコマンドでcloudrunへデプロイする。 ポイントは--sourceオプション。

PORT番号については自動的にPORT環境変数が設定されており、デフォルトで8080が設定されている為、ここでは特に指定しない。

gcloud run deploy sample-app --region asia-northeast1 --platform managed --allow-unauthenticated --source .

しばらくするとデプロイ完了と共にURLが表示されると思うのでそこにリクエストを投げます。

Service URL: https://sample-app-aoytzwylua-an.a.run.app
> curl https://sample-app-aoytzwylua-an.a.run.app                                                                                                                        main
{"Title":"Hello","Desc":"BuildPack","Ver":"0.0.1"}

無事にデプロイできていました。

感想

裏側ではbuildpackによる、コンテナイメージが生成され、それがCloud Runにデプロイされているようでした。 便利。