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にデプロイされているようでした。 便利。