Cloud Runにアプリをデプロイする方法まとめ

2021/10/31に公開されました。
2021/10/31に更新されました。

Cloud Runのデプロイ方法3種類まとめました。ソースコードから直接デプロイする方法が簡単!!!


author: nomoto

はじめに

初めましてnomotoです。

今回は業務の中でCloud Runにデプロイする機会があったので備忘録がわりにまとめました。

上手くいかなかった点も合わせて紹介しておりますので参考にしてみてください。


環境

go1.17

Cloud SDKがインストールされている。

Cloud SDK インストール方法


方法

1.コンテナ化 →Container Registry→Cloud Run(全てコマンドで実行)

2.コンテナ化 →Container Registry→Cloud Run(Cloud Runにデプロイをコンソールから行う)

3.ソースコード →Cloud Run(コマンド1つでデプロイ)


1.アプリの準備

まず初めにサンプルアプリケーションを準備します。 コードは公式ドキュメントのものを使います。

mkdir helloworld
cd helloworld
go mod init github.com/GoogleCloudPlatform/golang-samples/run/helloworld
touch main.go

main.go

// Sample run-helloworld is a minimal Cloud Run service.
package main

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

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

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

        // Start HTTP server.
        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("NAME")
        if name == "" {
                name = "World"
        }
        fmt.Fprintf(w, "Hello %s!\n", name)
}
go run main.go

を実行。

ブラウザでhttp://localhost:8080を開くと Hello World! が表示されていることを確認。

(方法3ソースコードからCloud Runにデプロイは4 の手順へ)


2.アプリをコンテナ化し、Container Registry にアップロード

Dockerfileと.dockerignoreファイルを作成する。

touch {Dockerfile,.dockerignore}

Dockerfile

# Use the offical golang image to create a binary.
# This is based on Debian and sets the GOPATH to /go.
# https://hub.docker.com/_/golang
FROM golang:1.16-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN go build -mod=readonly -v -o server

# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    ca-certificates && \
    rm -rf /var/lib/apt/lists/*

# Copy the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server

# Run the web service on container startup.
CMD ["/app/server"]

.dockerignore

# The .dockerignore file excludes files from the container build process.
#
# https://docs.docker.com/engine/reference/builder/#dockerignore-file

# Exclude locally vendored dependencies.
vendor/

# Exclude "build-time" ignore files.
.dockerignore
.gcloudignore

# Exclude git history and configuration.
.gitignore

プロジェクトを切り替える。

gcloud config set project PROJECT名

プロジェクト名を表示。

gcloud config get-value project

PROJECT-IDを指定して実行。

gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld

3.コンテナイメージを Cloud Run にデプロイ

パターン1 コマンドから実行

PROJECT-IDとREGIONを指定して実行。

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed --region REGION

以下が出れば成功、Service URLが表示されます。

✓ Deploying... Done.
✓ Creating Revision...
✓ Routing traffic...
Done.

※公式ドキュメントには以下の記載でしたが自分の場合404エラーが出てしまったのでリージョンを指定。

gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed

パターン2 コンソールから実行

1.コンソールを開く。

cd-1

2.サービスの作成からコンテナイメージのURLを選択、自動でサービス名が入力されるので次へ。

cd-2

3.未認証の呼び出しを許可を選択し、作成。

cd-3

4.緑のチェックが表示されれば成功。


4.ソースコードから直接 Cloud Run にデプロイ

サンプルアプリケーションが準備できたら直接コマンド1つでデプロイできます。便利ですね。

REGIONを指定して実行。

gcloud run deploy helloworld --source . --region REGION

以下が出れば成功、Service URLが表示されます。

✓ Building and deploying new service... Done.
✓ Uploading sources...
✓ Building Container...
✓ Creating Revision...
✓ Routing traffic...
✓ Setting IAM Policy...

Done.

※公式ドキュメントでは下記のようにリージョンを指定していない。

gcloud run deploy helloworld --source .

以下のエラーが出てしまったため指定。

ERROR: Error in retrieving repository from Artifact Registry.
ERROR: (gcloud.run.deploy) INVALID_ARGUMENT: Request contains an invalid argument.

まとめ

今回はCloud Runのデプロイ方法を3種類まとめましたが、ソースコードから直接デプロイする方法が簡単でした。状況に応じて他の方法でのデプロイに切り替えるのが良いですね。



GI Cloud は事業の拡大に向けて一緒に夢を追う仲間を募集しています

当社は「クラウドで日本のIT業界を変革し、世の中をもっとハッピーに」をミッションに掲げ、Google Cloudに特化した技術者集団として、お客様にコンサルティングからシステム開発、運用・保守まで一気通貫でサービスを提供しています。

まだ小規模な事業体ですが、スタートアップならではの活気と成長性に加えて、大手総合商社である伊藤忠グループの一員としてやりがいのある案件にもどんどんチャレンジできる環境が整っています。成長意欲の高い仲間と共にスキルを磨きながら、クラウドの力で世の中をもっとハッピーにしたい。そんな我々の想いに共感できる方のエントリーをお待ちしています。

採用ページ

※本記事は、ジーアイクラウド株式会社の見解を述べたものであり、必要な調査・検討は行っているものの必ずしもその正確性や真実性を保証するものではありません。

※リンクを利用する際には、必ず出典がGIC dryaki-blogであることを明記してください。
リンクの利用によりトラブルが発生した場合、リンクを設置した方ご自身の責任で対応してください。
ジーアイクラウド株式会社はユーザーによるリンクの利用につき、如何なる責任を負うものではありません。