ホームページ  >  記事  >  バックエンド開発  >  Go サービスを GCP Cloud Run にデプロイする方法

Go サービスを GCP Cloud Run にデプロイする方法

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-03 06:14:01810ブラウズ

How to Deploy a Go service to GCP Cloud Run

Go サービスを GCP Cloud Run にデプロイするには、Dockerfile のセットアップや環境変数の構成など、いくつかの手順が必要です。 

このガイドでは、プロセスを順を追って説明します。

GCP プロジェクトを設定する

まだアカウントを作成していない場合は、GCP アカウントの作成に移動して始めます。

  1. GCP プロジェクトを作成します。
  • GCP コンソールに移動し、新しいプロジェクトを作成します。

  • デプロイメント用のプロジェクト ID をメモします。

How to Deploy a Go service to GCP Cloud Run

  1. 必要な API を有効にします。
  • Cloud Run API と Container Registry API を有効にします。
  1. Google Cloud SDK をインストールします
  • gcloud init を使用してリポジトリを初期化します。

Go サービスを作成する

Go アプリがローカルで実行できることを確認し、Dockerfile をセットアップします。

cmd/main.go

// cmd/main.go
func main() {
 flag.Parse()

 a := app.Application{}

 if err := a.LoadConfigurations(); err != nil {
        log.Fatalf("Failed to load configurations: %v", err)
    }

    if err := runtime.Start(&a); err != nil {
        log.Fatalf("Failed to start the application: %v", err)
    }

}

runtime/base.go

func Start(a *app.Application) error {
    router := gin.New()

    router.Use(cors.New(md.CORSMiddleware()))

    api.SetCache(router, a.RedisClient)
    api.SetRoutes(router, a.FireClient, a.FireAuth, a.RedisClient)

    err := router.Run(":" + a.ListenPort)
    log.Printf("Starting server on port: %s", a.ListenPort)
    if err != nil {
        return err
    }

    return nil
}

Dockerfile を作成する

# Use the official Go image as the base image
FROM golang:1.18

WORKDIR /app

# Copy the Go module files
COPY go.mod go.sum ./

RUN go mod download

# Copy the rest of the application code
COPY . .

RUN go build -o main  ./cmd/main.go

CMD ["./main"]

環境変数を設定する

シェル スクリプトを使用して GCP の環境変数の設定を自動化します

として env-variables.sh.

// env-variables.sh
#!/bin/bash

# Environment variables
export PROJECT_ID=recepies-6e7c0
export REGION=europe-west1

export REDIS_URL="rediss://default:AVrvA....-lemur-23279.u....:6379"
export FIREBASE_ACCOUNT_KEY="/app/config/account_key.json"
export CLIENT_URL="https://.....vercel.app/"

deploy-with-yaml.sh としてのデプロイメント スクリプト。

#!/bin/bash

source env-variables.sh

#Comment if correctly deployed
docker build -t gcr.io/$PROJECT_ID/recipe-server:latest .
docker push gcr.io/$PROJECT_ID/recipe-server:latest

#Uncomment if json needs to be added to GCP 
# gcloud secrets create firebase-account-key --data-file=/mnt/c/own_dev/RecipesApp/server/config/account_key.json --project=recepies-6e7c0

#Add permission IAM
gcloud projects add-iam-policy-binding recepies-6e7c0 \
    --member="serviceAccount:service-988443547488@serverless-robot-prod.iam.gserviceaccount.com" \
    --role="roles/artifactregistry.reader"

gcloud run deploy recipe-service \
  --image gcr.io/$PROJECT_ID/recipe-server:latest \
  --region $REGION \
  --platform managed \
  --set-env-vars REDIS_URL=$REDIS_URL,CLIENT_URL=$CLIENT_URL,FIREBASE_ACCOUNT_KEY=$FIREBASE_ACCOUNT_KEY

GCP Cloud Run へのデプロイ

展開スクリプトを実行します

環境変数.sh

一般的な問題とトラブルシューティング

  • 権限の問題: Cloud Run サービス エージェントにイメージを読み取る権限があることを確認してください。
  • 環境変数: 必要な環境変数がすべて正しく設定されていることを確認します。
  • ポート構成: PORT 環境変数が正しく設定されていることを確認します。

How to Deploy a Go service to GCP Cloud Run

必要に応じてすべての設定が完了すると、イメージがビルドされ、GCP プロジェクトの Artifact Registry にプッシュされていることがわかります。結局、これを手に入れました。

a9099c3159f5: Layer already exists
latest: digest: sha256:8c98063cd5b383df0b444c5747bb729ffd17014d42b049526b8760a4b09e5df1 size: 2846
Deploying container to Cloud Run service [recipe-service] in project [recepies-6e7c0] region [europe-west1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
Done.
Service [recipe-service] revision [recipe-service-00024-5mh] has been deployed and is serving 100 percent of traffic.
Service URL: https://recipe-service-819621241045.europe-west1.run.app

何度も遭遇した標準エラーがありますか?

Deploying container to Cloud Run service [recipe-service] in project [recepies-6e7c0] region [europe-west1] X Deploying… - Creating Revision… . Routing traffic… Deployment failed ERROR: 
(gcloud.run.deploy) Revision 'recipe-service-00005-b6h' 
is not ready and cannot serve traffic. Google Cloud Run Service Agent service-819621241045@serverless-robot-prod.iam.gserviceaccount.com must have permission to read the image, 
gcr.io/loyal-venture-436807-p7/recipe-server:latest. Ensure that the provided container image URL is correct and that the above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that the image is from project [loyal-venture-436807-p7], which is not the same as this project [recepies-6e7c0]. Permission must be granted to the Google Cloud Run Service 
Agent service-819621241045@serverless-robot-prod.iam.gserviceaccount.com from this project. See https://cloud.google.com/run/docs/deploying#other-projects

多くの場合、PORT=8080 を設定できなかったと表示されますが、主な問題は、環境変数が設定されていない、または私の場合は firebase account_key.json がデプロイ用に誤って設定されているなど、別の何かです。


すべてが設定されたら、接続をテストしてリクエストを実行できます。

Vercel にフロントエンドをデプロイしました。以下に Cloud Run ログが表示されます

How to Deploy a Go service to GCP Cloud Run

Go サービスの GCP Cloud Run へのデプロイは、いくつかの主要な構成と自動スクリプトを使用して効率化できます。 

権限の問題や環境変数の誤りなど、一般的なエラーが発生する可能性がありますが、Cloud Run ログを使用してエラーをトラブルシューティングする方法を理解することで、スムーズなデプロイが保証されます。
私のリポジトリはここにあります。

以上がGo サービスを GCP Cloud Run にデプロイする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。