컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
빠른 시작: Cloud Run에서 Go 작업 빌드 및 만들기

Cloud Run에서 Go 작업 빌드 및 만들기

간단한 Cloud Run 작업을 만들고 컨테이너 이미지에 패키징하고 컨테이너 이미지를 Container Registry에 업로드한 후 Cloud Run에 배포하는 방법을 알아봅니다. 표시된 언어 외에 다른 언어도 사용할 수 있습니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. Google Cloud CLI를 설치하고 초기화합니다.
  5. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  6. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  7. Google Cloud CLI를 설치하고 초기화합니다.

샘플 작업 작성

Go에서 작업을 작성하려면 다음 안내를 따르세요.

  1. jobs라는 새 디렉터리를 만들고 이 디렉터리로 이동합니다.

    mkdir jobs
    cd jobs
    
  2. 같은 디렉터리에 실제 작업 코드에 대한 main.go 파일을 만듭니다. 다음 샘플 줄을 복사합니다.

    package main
    
    import (
    	"fmt"
    	"log"
    	"math/rand"
    	"os"
    	"strconv"
    	"time"
    )
    
    type Config struct {
    	// Job-defined
    	taskNum    string
    	attemptNum string
    
    	// User-defined
    	sleepMs  int64
    	failRate float64
    }
    
    func configFromEnv() (Config, error) {
    	// Job-defined
    	taskNum := os.Getenv("CLOUD_RUN_TASK_INDEX")
    	attemptNum := os.Getenv("CLOUD_RUN_TASK_ATTEMPT")
    	// User-defined
    	sleepMs, err := sleepMsToInt(os.Getenv("SLEEP_MS"))
    	failRate, err := failRateToFloat(os.Getenv("FAIL_RATE"))
    
    	if err != nil {
    		return Config{}, err
    	}
    
    	config := Config{
    		taskNum:    taskNum,
    		attemptNum: attemptNum,
    		sleepMs:    sleepMs,
    		failRate:   failRate,
    	}
    	return config, nil
    }
    
    func sleepMsToInt(s string) (int64, error) {
    	sleepMs, err := strconv.ParseInt(s, 10, 64)
    	return sleepMs, err
    }
    
    func failRateToFloat(s string) (float64, error) {
    	// Default empty variable to 0
    	if s == "" {
    		return 0, nil
    	}
    
    	// Convert string to float
    	failRate, err := strconv.ParseFloat(s, 64)
    
    	// Check that rate is valid
    	if failRate < 0 || failRate > 1 {
    		return failRate, fmt.Errorf("Invalid FAIL_RATE value: %f. Must be a float between 0 and 1 inclusive.", failRate)
    	}
    
    	return failRate, err
    }
    
    func main() {
    	config, err := configFromEnv()
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	log.Printf("Starting Task #%s, Attempt #%s ...", config.taskNum, config.attemptNum)
    
    	// Simulate work
    	if config.sleepMs > 0 {
    		time.Sleep(time.Duration(config.sleepMs) * time.Millisecond)
    	}
    
    	// Simulate errors
    	if config.failRate > 0 {
    		if failure := randomFailure(config); failure != nil {
    			log.Fatalf("%v", failure)
    		}
    	}
    
    	log.Printf("Completed Task #%s, Attempt #%s", config.taskNum, config.attemptNum)
    }
    
    // Throw an error based on fail rate
    func randomFailure(config Config) error {
    	rand.Seed(time.Now().UnixNano())
    	randomFailure := rand.Float64()
    
    	if randomFailure < config.failRate {
    		return fmt.Errorf("Task #%s, Attempt #%s failed.", config.taskNum, config.attemptNum)
    	}
    	return nil
    }
    

    Cloud Run 작업을 사용하면 작업이 실행될 태스크의 수를 지정할 수 있습니다. 이 샘플 코드에서는 기본 제공 CLOUD_RUN_TASK_INDEX 환경 변수를 사용하는 방법을 보여줍니다. 각 태스크는 실행 중인 컨테이너의 복사본 하나를 나타냅니다. 태스크는 일반적으로 병렬로 실행됩니다. 각 태스크에서 데이터 하위 집합을 독립적으로 처리할 수 있는 경우 여러 태스크를 사용하는 것이 유용합니다.

    각 태스크는 CLOUD_RUN_TASK_INDEX 환경 변수에 저장된 색인을 인식합니다. 기본 제공 CLOUD_RUN_TASK_COUNT 환경 변수에는 작업 실행 시 --tasks 매개변수를 통해 제공되는 태스크 수가 포함됩니다.

    또한 표시된 코드는 기본 제공 CLOUD_RUN_TASK_ATTEMPT 환경 변수를 사용하여 태스크를 재시도하는 방법을 보여줍니다. 이 환경 변수에는 처음 시도할 때 0부터 시작하여 연속으로 재시도할 때마다 1씩 증가하여 --max-retries까지 이 태스크를 재시도한 횟수가 포함됩니다.

    또한 코드를 사용하면 재시도를 테스트하기 위한 방법으로 오류를 생성하고 오류 로그를 생성하여 어떻게 표시되는지 확인할 수 있습니다.

  3. 다음 콘텐츠로 go.mod이라는 파일을 만듭니다.

    module github.com/GoogleCloudPlatform/golang-samples/run/jobs
    
    go 1.17
    

코드가 완료되었으며 컨테이너에 패키징될 수 있습니다.

작업 컨테이너 빌드 및 저장소로 보내기

중요: 이 빠른 시작에서는 빠른 시작에 사용 중인 프로젝트에 소유자 역할이나 편집자 역할이 있다고 가정합니다. 그렇지 않은 경우 필요한 권한은 Cloud Run 배포 권한, Cloud Build 권한, Artifact Registry 권한을 참조하세요.

빌드팩을 사용하여 컨테이너를 빌드합니다.

gcloud builds submit --pack image=gcr.io/PROJECT_ID/logger-job

Cloud Run에서 작업 만들기

방금 빌드한 컨테이너를 사용하여 작업을 만들려면 다음 명령어를 실행합니다.

gcloud beta run jobs create job-quickstart \
    --image gcr.io/PROJECT_ID/logger-job \
    --tasks 50 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.5 \
    --max-retries 5 \
    --region REGION

여기서 PROJECT_ID는 프로젝트 ID이고 REGION은 리전입니다(예: us-central1). 다양한 매개변수를 테스트 목적으로 사용할 값으로 변경할 수 있습니다. SLEEP_MS는 작업을 시뮬레이션하고 FAIL_RATE로 인해 태스크의 X%가 실패하므로 동시 로드를 사용하여 실패한 태스크를 재시도할 수 있습니다.

Cloud Run에서 작업 실행

방금 만든 작업을 실행하려면 다음 명령어를 실행합니다.

gcloud beta run jobs execute job-quickstart

리전을 입력하라는 메시지가 표시되면 리전(예: us-central1)을 선택합니다.

로컬에서 테스트

작업을 로컬에서 실행할 수 있습니다.

docker run --rm -e FAIL_RATE=0.9 -e SLEEP_MS=1000 gcr.io/PROJECT_ID/logger-job
PROJECT_ID는 프로젝트 ID입니다.

다음 단계

코드 소스에서 컨테이너를 빌드하고 저장소로 푸시하는 방법에 대한 자세한 내용은 다음을 참조하세요.