はじめに
こんにちは、仙台オフィスの阿部です。バックエンドエンジニアをやっています。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へのプッシュが成功していることがわかります。
最後に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にアクセスしてみます。
koを使うことで、Go製のアプリケーションさえ実装していれば、Dockerfileを準備することなく
- 環境変数の設定
- デプロイコマンド実行
このたった2ステップでCloud Runへのデプロイが完了し、簡単にWebサーバーを立ち上げることが可能です!なんと素晴らしい!!
まとめ
今回は簡単なアプリケーションを用意し、koでCloud Runへのデプロイまでを試してみました。もちろんGKEなどにもデプロイ可能で、もっと詳しく知りたい方は、koのREADMEや、Google Cloudのブログが参考となると思います。
記事の初めに、私はGoとCloud Runが好きだと記載しました。Goに関して言えば言語仕様が好きなのも理由ですが、数行の実装とDockerfileがあれば、すぐにWebサーバーを立ち上げられる体験が大きな理由となっています。これは、ApacheやTomcatなどのミドルウェアの設定を行ってWebアプリケーションを構築してきた私のキャリアがそうさせるのでしょう。これが、今やdockerすら必要とせずに可能となったことはとても素晴らしいことだと思います!
とはいえチーム開発においては、メンバーの開発環境を差異なく統一できるdocker(docker compose)はやはり必須だろうと思いますので、サクッとコンテナ化するだけ、もしくは個人開発の場で、koはgopherの強い味方になるものではないかと考えています。