koでArtifact Registry にimageをbuild & pushし、Secret Manager を使って楽にCloud Runに環境変数展開した話
いつの間にか、Secret ManagerとCloud Runの連携がPublic Previewではなくなっていたので、触ってみた。
せっかくなので前からちょいと気になっていた ko
を使ってbuild,pushをしていこうと思う。
またGCRにpushしようとしたところ、GCRはすでに古く Artifact Registry
となるものが出ていたので、こちらも触ってみる。
>コンテナ イメージ、Java パッケージ、Node.js モジュールなど、複数のアーティファクト形式。
個人的に気になった主な違いは、コンテナイメージ以外のpkg類を保存できるようになっているのと、リージョン単位でもリポジトリを使えるようになっていること。
余談
ドキュメントを読んでいて知ったのだが、`mirror.gcr.io` というものがあり、Docker Hubで頻繁にアクセスされる公開イメージはキャッシュされているらしい。これをうまく使えば、Dockerのpull 制限をうまく回避できそうで今後使っていこうと思った。
実際に動かしていく
今回は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が読み込まれて表示されているのが分かる。