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
アクセスします。
動きました。ちゃんとコンテナの中で起動することが確認できました。
今回はステージングをかります。
gcloudコマンドで事前にログインしています。
GCPにpushする。
docker push gcr.io/<自分のプロジェクトID>/cloudrun-test:v1
入ったことを確認
CloudRunへのデプロイと実行
サービスを作成をクリック
適当に入力して「次へ」をクリック
さっきpushしたイメージを選択して作成ボタンをクリック
しばらくするとデプロイが完了し、エンドポイントが作成されます。
ここにアクセスします。
動きました。
ローカルで作ったコンテナが簡単にデプロイでき、動かすことができます。
タイムアウトなど制限もありますが、ローカルで動いてるコンテナを簡単にデプロイできるのは便利です。