>  기사  >  백엔드 개발  >  GCP Cloud Run에 Go 서비스를 배포하는 방법

GCP Cloud Run에 Go 서비스를 배포하는 방법

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-03 06:14:01810검색

How to Deploy a Go service to GCP Cloud Run

GCP Cloud Run에 Go 서비스를 배포하려면 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)
    }

}

런타임/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
}

도커파일 생성

# 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"]

Env 변수 설정

셸 스크립트를 사용하여 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에 배포

배포 스크립트 실행

env-variables.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을 설정할 수 없다고 명시되어 있지만 주요 문제는 env 변수가 설정되지 않았거나 내 경우에는 firebase account_key.json이 배포용으로 잘못 설정된 것과 같은 것입니다.


모든 설정이 완료되면 연결을 테스트하고 요청을 수행할 수 있습니다.

Vercel에 프런트엔드를 배포했으며 아래에서 Cloud Run 로그를 볼 수 있습니다

How to Deploy a Go service to GCP Cloud Run

몇 가지 주요 구성과 자동화 스크립트를 사용하면 Go 서비스를 GCP Cloud Run에 배포하는 작업을 간소화할 수 있습니다. 

권한 문제나 잘못된 환경 변수 등 일반적인 오류가 있을 수 있지만 Cloud Run 로그를 통해 문제를 해결하는 방법을 이해하면 원활한 배포가 보장됩니다.
내 저장소는 여기에서 찾을 수 있습니다.

위 내용은 GCP Cloud Run에 Go 서비스를 배포하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.