🐋

koを使ってCloud Run環境にデプロイする①

2022/05/10に公開

目指すもの

下記の記事のようにgcloud runを使って、koでビルドしたGoのアプリを簡単にフルマネージドサービスにデプロイできる状態。
今回の記事はコンテナ立ち上げ確認までとなります。
https://cloud.google.com/blog/ja/products/containers-kubernetes/ship-your-go-applications-faster-cloud-run-ko

前提

Cloud Run

フルマネージドのサーバーレスプラットフォームです。細かい違いはあれ、AWSだとApp Runnerが似ているイメージです。
フルマネージドの通り、Googleが持つカバー範囲(責任共有モデル)が広いといえます。
AWSですが下記が図解でわかりやすいです。

ko

Goのソースコードからイメージをよしなにビルドしてくれるやつ。
コンテナで立つのにDockerfile不要で、最小単位でいうとルート配下にmain.gogo.modだけ用意しておけばいい。

ハンズオン

構成

❯ tree .
.
├── go.mod
└── main.go

go.modは、go mod init <任意のモジュール名>で作成
main.goは下記。Hello, Worldを返すサーバーを立てる。

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, World")
}

func main() {
	http.HandleFunc("/", handler)
	http.ListenAndServe(":5000", nil)
}

koを使う

$ brew install ko
$ cd <main.goが置いてあるpj>
# 記事によっては、`ko publish .`ですが、renameしたようです。機能は同じです。
# ローカル確認したいときは`--local`を入れましょう。入れないとコンテナレジストリにpushしようとします。
$ ko build . --local
$ docker run -p 5000:5000 $(ko build .)
$ curl http://localhost:5000
Hello, World

ちなみにビルドされたアプリはDistrolessイメージが使われてます。
Alpineが5MiB程度のところ、Distrolessは2MiBと本当に最低限のイメージであり、シェルすらもありません。なので、docker execでshやbashで入ろうとしても入れないです。
バイナリの中に依存関係を持ってくれているGoだからこそ、親和性が高いイメージと言えそうです。

より詳しく知りたいなら下記の記事など
https://github.com/GoogleContainerTools/distroless
https://zenn.dev/unasuke/articles/5ee6e2067ab1ba

余談ですが、Cloud Native Buildpacksで使われるpaketobuildpacks/builder:tinyはtinyの通りdistrolessを使います。他のサイズではUbuntuベースです。

次回はデプロイまでレポートしようと思います。ありがとうございました。

Discussion