Google Cloud Run を使ってデプロイしたものの、生成された URL にアクセスしても 503 Service Unavailable になってしまい解決に手間取ってしまったのでブログに残しておくことにする。

環境

OS: MacBook Air (M1, 2020)
言語: Go1.17.5 darwin/arm64

デプロイ方法

Docker を使ってビルドしたコンテナを push し、gcloud run deploy でデプロイした。Dockerfile は下記の通りマルチステージビルドを採用した。

FROM golang:1.17.12-bullseye as deploy-builder
WORKDIR /app

# キャッシュを効かせるため、先に go mod download に必要なものだけコピー
COPY ./app/go.mod .
COPY ./app/go.sum .
RUN go mod download

COPY ./app .

RUN GOOS=linux GOARCH=amd64 go build -trimpath -ldflags "-w -s"

# -------------------------------
FROM debian:bullseye-slim as deploy
RUN apt-get update
# deploy-builder の実行ファイルだけをコピー
COPY --from=deploy-builder /app/app .

CMD ["./app"]

Cloud Run のログを見てみる

503 になってしまっているログの詳細に以下のように書かれていた。

The request failed because either the HTTP response was malformed or connection to the instance had an error. Additional troubleshooting documentation can be found at: https://cloud.google.com/run/docs/troubleshooting#malformed-response-or-connection-error

よく見ると1つ前のログでエラーが発生していることが分かった。

Failed to iterate: rpc error: code = Unavailable desc = connection error: desc = “transport: authentication handshake failed: x509: certificate signed by unknown authority”

“x509: certificate signed by unknown authority cloud run” でググると firebase - Issue with connecting Golang application on Cloud Run with Firestore - Stack Overflow という記事を見つけた。

どうやらできるだけ軽量にするために選んだ debian:bullseye-slim に、ルート証明書を提供するパッケージが含まれていないことが原因だったらしい。

対応策

デプロイ用イメージに ca-certificates をインストールすることにした。

FROM debian:bullseye-slim as deploy
- RUN apt-get update
+ RUN apt-get update && apt-get install ca-certificates

デプロイを再実行。しかし Docker イメージのビルドに失敗した。どうやら ca-certificatesopenssl がないとインストールできないらしい。

 => ERROR [2/2] RUN apt-get update && apt-get install ca-certificates                                            10.5s
------
 > [2/2] RUN apt-get update && apt-get install ca-certificates:
#5 0.341 Get:1 http://deb.debian.org/debian bullseye InRelease [116 kB]
#5 0.878 Get:2 http://deb.debian.org/debian-security bullseye-security InRelease [48.4 kB]
#5 2.028 Get:3 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
#5 2.148 Get:4 http://deb.debian.org/debian bullseye/main arm64 Packages [8071 kB]
#5 8.834 Get:5 http://deb.debian.org/debian-security bullseye-security/main arm64 Packages [185 kB]
#5 8.907 Get:6 http://deb.debian.org/debian bullseye-updates/main arm64 Packages [4160 B]
#5 9.544 Fetched 8469 kB in 9s (903 kB/s)
#5 9.544 Reading package lists...
#5 9.848 Reading package lists...
#5 10.14 Building dependency tree...
#5 10.22 Reading state information...
#5 10.32 The following additional packages will be installed:
#5 10.32   openssl
#5 10.34 The following NEW packages will be installed:
#5 10.34   ca-certificates openssl
#5 10.35 0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
#5 10.35 Need to get 989 kB of archives.
#5 10.35 After this operation, 1868 kB of additional disk space will be used.
#5 10.35 Do you want to continue? [Y/n] Abort.
------
executor failed running [/bin/sh -c apt-get update && apt-get install ca-certificates]: exit code: 1

そのため、openssl もインストールするように書き換えた。

- RUN apt-get update && apt-get install ca-certificates
+ RUN apt-get update && apt-get install ca-certificates openssl

これでデプロイが通り、URL へのアクセスも 200 が返ってくるようになった!