koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話

koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話

いつの間にか、Secret ManagerとCloud Runの連携がPublic Previewではなくなっていたので、触ってみた。

Secret Manager | Google Cloud
Securely store API keys, passwords, certificates, and other sensitive data with Google Cloud’s Secret Manager.

せっかくなので前からちょいと気になっていた ko を使ってbuild,pushをしていこうと思う。

ko を使用して Go アプリケーションを Cloud Run に迅速にデプロイ | Google Cloud Blog
※この投稿は米国時間 2021 年 2 月 17 日に、Google Cloud blog に投稿されたものの抄訳です。開発者がコンテナを使用して作業することが多くなるに従い、ソースコードからアプリケーションがデプロイされるまでの時間を短縮することの重要性が増しています。コンテナ イメージのビルドをより迅速か
GitHub - google/ko: Build and deploy Go applications on Kubernetes
Build and deploy Go applications on Kubernetes. Contribute to google/ko development by creating an account on GitHub.

またGCRにpushしようとしたところ、GCRはすでに古く Artifact Registry

となるものが出ていたので、こちらも触ってみる。

Container Registry からの移行 | Artifact Registry のドキュメント | Google Cloud
>コンテナ イメージ、Java パッケージ、Node.js モジュールなど、複数のアーティファクト形式。

個人的に気になった主な違いは、コンテナイメージ以外のpkg類を保存できるようになっているのと、リージョン単位でもリポジトリを使えるようになっていること。

余談

ドキュメントを読んでいて知ったのだが、`mirror.gcr.io` というものがあり、Docker Hubで頻繁にアクセスされる公開イメージはキャッシュされているらしい。これをうまく使えば、Dockerのpull 制限をうまく回避できそうで今後使っていこうと思った。

キャッシュに保存された Docker Hub イメージの pull | Container Registry のドキュメント | Google Cloud

実際に動かしていく

今回はCloud Shellで全ての作業をしていく。

実際に動かすコードは下記になり、Secretの情報を画面に表示してみる。

Go

package main

import (
        "fmt"
        "log"
        "net/http"
        "os"
)

func main() {
        log.Print("starting server...")
        http.HandleFunc("/", handler)

        port := os.Getenv("PORT")
        if port == "" {
                port = "8080"
                log.Printf("defaulting to port %s", port)
        }

        log.Printf("listening on port %s", port)
        if err := http.ListenAndServe(":"+port, nil); err != nil {
                log.Fatal(err)
        }
}

func handler(w http.ResponseWriter, r *http.Request) {
        name := os.Getenv("TEST")
 
        fmt.Fprintf(w, "Hello %s!\n", name)
}

Artifact Registry

今回はkoという名前のリポジトリを、リージョンで作成。

ko

いつもならここでDockerfileを準備してbuildし、Registryにpushするのだが、今回はkoを使う。そのため、Dockerfileの準備はしない。

// koのinstall
go install github.com/google/ko@latest

// 対象のリポジトリ
export KO_DOCKER_REPO=us-east1-docker.pkg.dev/${YOUR_PROJECT_ID}/ko

// artifactのpermissionを得る
gcloud auth configure-docker us-east1-docker.pkg.dev

build & push

ko publish ./

そうすると、Artifact Registryにimageがpushされているのがわかる。

Secret Manager

これはメチャクチャ簡単で、今回は AIUEO という値を保存するSecretを作成。

Cloud Run

あとはCloud Runで先程作成したimageとSecretを選択し、環境変数へと展開する。

アクセス

あとは、発行されるURLにアクセスすると、Secretが読み込まれて表示されているのが分かる。