koでCloud Runへのデプロイまでを試してみた感想

はじめに

こんにちは、仙台オフィスの阿部です。バックエンドエンジニアをやっています。GoとCloud Runが好きです。

今回のブログですが、Goで書かれたアプリケーションを簡単かつ迅速にコンテナ化できるkoを使って、Cloud Runへのdeployまでを試してみた体験が素晴らしかったのでその手順と感想を述べたいと思います。

koとは

koは、Googleが開発したオープンソースツールです。Goプログラムからコンテナイメージをビルドして、それをコンテナレジストリにpushするために使用します。アプリケーションのコンテナ化にはdockerを利用することがデファクトスタンダードとなっていますが、koはdockerいらずでコンテナ化を実現します。

弊社とGo

本題に入る前に、弊社でGoがどのように利用されているかを簡単にご紹介します。

弊社は大きく2つのサービスを提供しています。会社名と同じサービス名の「videomarket」と、D2C型のサービスを提供する「MIRAIL」です。両サービスともバックエンドのAPIにGoを利用しています。その他、両サービスを支えるバックオフィスやバッチなどの開発でもGoを利用しており、社内でGoを利用するケースは以前に比べて格段に大きくなってきています。

また、社内にはGoコミュニティをオーガナイズしている者も在籍していたり、勉強会などへの参加も活発に行われています。

Cloud Runへのdeployまで

本題に戻り、ここからCloud Runへのdeployまでの手順を紹介します。 まずはkoのインストールです。Mac上でHomebrewを使ったインストールであれば

brew install ko

でインストールできますが、ko自体がGo製ですのでgo installコマンドでもインストール可能です。その場合は、

go install github.com/google/ko

となります。

次に環境変数の設定です。KO_DOCKER_REPOという環境変数名でプッシュ先のコンテナレジストリを指定します。今回はGCPのレジストリサービスであるGoogle Container Registory(GCR)を使用しますので、

export KO_DOCKER_REPO=asia.gcr.io/my-project

を指定します。my-projectは適宜読み替えてください。

試しにGCRにプッシュしてみます。今回コンテナ化するアプリケーションは以下です。Webサーバーを実装する、よく見るものですね。

package main

import (
    "log"
    "net/http"
)

const port = "8080"

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, ko!"))
    })
    if err := http.ListenAndServe(":"+port, nil); err != nil {
        log.Fatalf("err: %v", err)
    }
}

GCRへのプッシュはko build コマンドを実行します。

$ ko build .
2022/03/26 16:34:06 Using base gcr.io/distroless/static:nonroot@sha256:80c956fb0836a17a565c43a4026c9c80b2013c83bea09f74fa4da195a59b7a99 for ko-test
2022/03/26 16:34:07 Building ko-test for linux/amd64
2022/03/26 16:34:07 Publishing asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:latest
2022/03/26 16:34:08 existing blob: sha256:7ea42ed1f7114f5f907fef79aaa9eb2c307bb8ca5d55d12088009a8aed8828f3
2022/03/26 16:34:08 existing blob: sha256:b50a0ce328fcdd9cbf2e4d4363965ca81697afa4c4a01f48a1249e77e73a5bf0
2022/03/26 16:34:09 asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:sha256-020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab.sbom: digest: sha256:5e085de14cc20bf8d95db86b83bf075d8c2289d9aca32fa96753d8cedc4a9fc1 size: 367
2022/03/26 16:34:09 Published SBOM asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:sha256-020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab.sbom
2022/03/26 16:34:10 existing blob: sha256:21ffb480dd820615d1daa1586a4efa2ed7f011af8e2449617066a692197ee994
2022/03/26 16:34:10 existing blob: sha256:2df365faf0e3007f983fadd7a65ba51d41b488eb2ed8fc70f4bf97043cfea560
2022/03/26 16:34:10 existing blob: sha256:80da64cfb2df5fbe01a920e1eb5741aee21d89c39e2078ce71cbd2bc4d6268d7
2022/03/26 16:34:10 existing blob: sha256:250c06f7c38e52dc77e5c7586c3e40280dc7ff9bb9007c396e06d96736cf8542
2022/03/26 16:34:11 asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:latest: digest: sha256:020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab size: 750
2022/03/26 16:34:11 Published asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5@sha256:020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab
asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5@sha256:020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab

GCPの管理コンソールからもGCRへのプッシュが成功していることがわかります。

f:id:yuji_abe:20220327003150p:plain
Container Registory

最後にCloud Runへのdeployです。今回はko-testというサービス名を指定しています。

$ gcloud run deploy ko-test --image=$(ko publish .) --platform managed --region asia-northeast1 --allow-unauthenticated
2022/03/26 23:22:31 Using base gcr.io/distroless/static:nonroot@sha256:80c956fb0836a17a565c43a4026c9c80b2013c83bea09f74fa4da195a59b7a99 for ko-test
2022/03/26 23:22:32 Building ko-test for linux/amd64
2022/03/26 23:22:33 Publishing asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:latest
2022/03/26 23:22:33 existing blob: sha256:b50a0ce328fcdd9cbf2e4d4363965ca81697afa4c4a01f48a1249e77e73a5bf0
2022/03/26 23:22:33 existing blob: sha256:7ea42ed1f7114f5f907fef79aaa9eb2c307bb8ca5d55d12088009a8aed8828f3
2022/03/26 23:22:34 asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:sha256-020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab.sbom: digest: sha256:5e085de14cc20bf8d95db86b83bf075d8c2289d9aca32fa96753d8cedc4a9fc1 size: 367
2022/03/26 23:22:34 Published SBOM asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:sha256-020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab.sbom
2022/03/26 23:22:35 existing blob: sha256:80da64cfb2df5fbe01a920e1eb5741aee21d89c39e2078ce71cbd2bc4d6268d7
2022/03/26 23:22:35 existing blob: sha256:21ffb480dd820615d1daa1586a4efa2ed7f011af8e2449617066a692197ee994
2022/03/26 23:22:35 existing blob: sha256:250c06f7c38e52dc77e5c7586c3e40280dc7ff9bb9007c396e06d96736cf8542
2022/03/26 23:22:35 existing blob: sha256:2df365faf0e3007f983fadd7a65ba51d41b488eb2ed8fc70f4bf97043cfea560
2022/03/26 23:22:36 asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5:latest: digest: sha256:020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab size: 750
2022/03/26 23:22:36 Published asia.gcr.io/my-project/ko-test-f7496ee7a44ade35280aa8d4cfba0ce5@sha256:020f8a66384796e6b18472e3d391f4723d8ab65aaac0c7ca5d4b3dde19b547ab
Deploying container to Cloud Run service [ko-test] in project [my-project] region [asia-northeast1]
✓ Deploying... Done.                                                                                                                                                                
  ✓ Creating Revision...                                                                                                                                                            
  ✓ Routing traffic...                                                                                                                                                              
  ✓ Setting IAM Policy...                                                                                                                                                           
Done.                                                                                                                                                                               
Service [ko-test] revision [ko-test-00003-soz] has been deployed and is serving 100 percent of traffic.
Service URL: https://ko-test-xxxxxxxxxx-an.a.run.app

払い出されたURLにアクセスしてみます。

f:id:yuji_abe:20220327003920p:plain
Hello, ko!

koを使うことで、Go製のアプリケーションさえ実装していれば、Dockerfileを準備することなく

  • 環境変数の設定
  • デプロイコマンド実行

このたった2ステップでCloud Runへのデプロイが完了し、簡単にWebサーバーを立ち上げることが可能です!なんと素晴らしい!!

まとめ

今回は簡単なアプリケーションを用意し、koでCloud Runへのデプロイまでを試してみました。もちろんGKEなどにもデプロイ可能で、もっと詳しく知りたい方は、koのREADMEや、Google Cloudのブログが参考となると思います。

github.com

cloud.google.com

記事の初めに、私はGoとCloud Runが好きだと記載しました。Goに関して言えば言語仕様が好きなのも理由ですが、数行の実装とDockerfileがあれば、すぐにWebサーバーを立ち上げられる体験が大きな理由となっています。これは、ApacheやTomcatなどのミドルウェアの設定を行ってWebアプリケーションを構築してきた私のキャリアがそうさせるのでしょう。これが、今やdockerすら必要とせずに可能となったことはとても素晴らしいことだと思います!

とはいえチーム開発においては、メンバーの開発環境を差異なく統一できるdocker(docker compose)はやはり必須だろうと思いますので、サクッとコンテナ化するだけ、もしくは個人開発の場で、koはgopherの強い味方になるものではないかと考えています。