GCPのCloudRunというサービスを使うことがあったので簡単な使い方をメモっときます。
CloudRunとは
公式URLより https://cloud.google.com/run?hl=ja
コンテナ化されたアプリケーションをすばやく安全にデプロイ、スケーリングできる、フルマネージド型のコンピューティング プラットフォーム
とあります。 コンテナに入れたwebアプリを、そのままデプロイできるってことですね。 GCPのContainerRegistoryにコンテナをpushし、CloudRunでデプロイするだけで動かせます。
CloudRunの料金
https://cloud.google.com/run/pricing?hl=ja
ちょっと試すくらいならほぼ無料で使えます。
あとContainerRegistoryの料金がかかりますが、これも微々たるものです。 https://cloud.google.com/container-registry/pricing?hl=ja 個人で試すには懐が痛まなくて好きそうです。
注意
CloudRunからCloudRun、または他のサーバレスを無限ループで呼ぶような処理があると危険です。そこは個人で気をつけてください。 例:https://blog.mmmcorp.co.jp/blog/2019/12/25/lambda-cloud-bankruptcy/ これはAWSですが、GCPでも起こりえます。
サンプル
GOで簡単なエコーサーバーを作ります
package main import ( "fmt" "log" "net/http" "net/http/httputil" ) func handler(w http.ResponseWriter, r *http.Request) { dump, err := httputil.DumpRequest(r, true) if err != nil { http.Error(w, fmt.Sprint(err), http.StatusInternalServerError) return } fmt.Println(string(dump)) fmt.Fprintf(w, "<html><body>hello Cloud Run!!!</body></html>") } func main() { var httpServer http.Server http.HandleFunc("/", handler) log.Println("start http listening :8080") httpServer.Addr = ":8080" log.Println(httpServer.ListenAndServe()) }
8080ポートにアクセスすると、「hello Cloud Run!!!」の文字列を返すサーバーです。 実行して確認します。
$ go run main.go 2020/06/18 20:01:04 start http listening :8080
サーバーが起動したのでアクセスしてみる
レスポンスが帰ってきました。
次にこれをビルドして実行するDockerfileを作ります。
FROM golang:latest #ディレクトリ作成 WORKDIR /go/src/go-image #ホストOSのmain.goをWORKDIRにコピー COPY main.go . #バイナリを生成 RUN go install -v . #バイナリを実行 CMD ["go-image"]
これをビルドします。
$ docker build -t gcr.io/<自分のプロジェクトID>/cloudrun-test:v1 .
ローカルで実行してみます
$ d run -p 8080:8080 gcr.io/<自分のプロジェクトID>/cloudrun-test:v1
アクセスします。
動きました。ちゃんとコンテナの中で起動することが確認できました。
コンテナレジストリへのpush
今回はステージングをかります。 gcloudコマンドで事前にログインしています。
GCPにpushする。
docker push gcr.io/<自分のプロジェクトID>/cloudrun-test:v1
入ったことを確認
CloudRunへのデプロイと実行
サービスを作成をクリック
適当に入力して「次へ」をクリック
さっきpushしたイメージを選択して作成ボタンをクリック
しばらくするとデプロイが完了し、エンドポイントが作成されます。
ここにアクセスします。
動きました。 ローカルで作ったコンテナが簡単にデプロイでき、動かすことができます。 タイムアウトなど制限もありますが、ローカルで動いてるコンテナを簡単にデプロイできるのは便利です。