Cloud Scheduler 및 Cloud Run을 사용하여 워크스테이션 작업 예약

이 튜토리얼에서는 Cloud Scheduler 및 Cloud Run을 사용하여 다음과 같은 작업을 자동으로 수행하는 방법을 보여줍니다.

  • 빠른 시작 풀 크기 자동 증감 예약
  • 정기적으로 워크스테이션 자동 시작

이 튜토리얼을 통해 일반적인 영업시간에 맞게 빠른 시작 풀 크기를 늘리거나 줄일 수 있습니다.

환경 준비

나중에 만드는 자동 스크립트에서 사용하게 될 다음 환경 변수를 설정합니다.

  1. 사용할 PROJECT_IDREGION 변수를 설정하세요.

    PROJECT_ID=$PROJECT_ID
    REGION=$REGION
    

    $REGION을 사용하려는 리전 이름으로 바꿉니다(예: us-central1).

    사용 가능한 리전에 대한 자세한 내용은 Cloud Workstations 위치를 참조하세요.

애플리케이션 아키텍처

이 솔루션에는 다음 Google Cloud 구성요소가 포함됩니다.

  • Cloud Run을 사용하여 WorkstationConfig빠른 시작 풀 크기를 업데이트합니다.
  • Cloud Scheduler 작업을 사용하여 설정된 일정에 따라 호출을 수행하여 WorkstationConfig를 업데이트합니다.

Cloud Scheduler 및 Cloud Run을 사용하여 워크스테이션 작업을 예약하는 시스템 아키텍처 다이어그램

Cloud Run 서비스 만들기

첫 번째 단계에서는 포트 8080에서 수신하는 HTTP 요청을 리슨하는 간단한 웹 서버를 설정합니다. 애플리케이션이 컨테이너화되어 있으므로 모든 언어로 서버를 작성할 수 있습니다.

Python으로 웹 서버 리스너 애플리케이션을 작성하려면 다음을 수행합니다.

  1. workstation-config-updater라는 새 디렉터리를 만들고 이 디렉터리로 이동합니다.

    mkdir workstation-config-updater
    cd workstation-config-updater
    
  2. app.py라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.

    import os, subprocess
    from flask import Flask, request, abort
    
    app = Flask(__name__)
    
    @app.route("/", methods=["POST"])
    def update():
        app.logger.info("Update request received.")
        data = request.json
        cluster = data["cluster"]
        region = data["region"]
        pool_size = data["pool-size"]
    
        path = os.path.join(app.root_path, "update_config.sh")
        o = subprocess.run(
            [path, cluster, region, pool_size],
            stdout=subprocess.PIPE, stderr=subprocess.STDOUT, text=True
        )
        app.logger.info("Sending response:", o.stdout)
        return o.stdout
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0", port=8080, debug=True)
    

    이 코드는 PORT 환경 변수에서 정의된 포트를 리슨하고 update_config.sh 스크립트를 실행하는 기본 웹 서버를 만듭니다.

  3. update_config.sh라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.

    #!/bin/bash
    
    set -e
    
    if [ $# -ne 3 ]
    then
       echo "Usage: update_config.sh CLUSTER REGION POOL_SIZE"
       exit 1
    fi
    
    CLUSTER=$1
    REGION=$2
    POOL_SIZE=$3
    
    # list workstation configs
    echo "Attempting to list workstation configs in cluster $CLUSTER and region $REGION ..."
    for CONFIG in $(gcloud  workstations configs list --cluster $CLUSTER --region $REGION --format="value(NAME)"); do
        echo "Attempting to update Quick Pool Size to $POOL_SIZE for config $CONFIG ..."
        # update the workstation config pool-size
        RET=$(gcloud workstations configs update $CONFIG --cluster $CLUSTER  --region $REGION --pool-size=$POOL_SIZE)
        if [[ $RET -eq 0 ]]; then
            echo "Workstation config $CONFIG updated."
        else
            echo "Workstation config $CONFIG update failed."
        fi
    done
    
    

    이 스크립트는 gcloud 명령어를 사용하여 지정된 클러스터의 모든 WorkstationConfig를 나열하고 빠른 시작 풀 크기POOL_SIZE로 업데이트합니다.

  4. Dockerfile라는 파일을 만들고 이 파일에 다음 코드를 붙여넣습니다.

    FROM google/cloud-sdk
    
    RUN apt-get update && apt-get install -y python3-pip python3
    
    # Copy local code to the container image.
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    RUN /bin/bash -c 'ls -la; chmod +x ./update_config.sh'
    
    # Install production dependencies.
    RUN pip3 install Flask gunicorn
    
    # Run the web service on container startup
    CMD exec gunicorn --bind :8080 --workers 1 --threads 8 app:app
    

    이 코드는 애플리케이션을 컨테이너화하여 Cloud Run에 배포할 준비를 합니다.

Cloud Run에 배포

Cloud Run에 배포하려면 다음 명령어를 실행합니다.

gcloud run deploy --source . --project $PROJECT_ID --region $REGION
  1. 서비스 이름을 입력하라는 메시지가 표시되면 Enter 키를 눌러 기본 이름인 workstation-config-updater를 사용합니다.

  2. Artifact Registry API를 사용 설정하거나 Artifact Registry 저장소 만들기를 허용하라는 메시지가 표시되면 y를 누릅니다.

  3. 인증되지 않은 호출을 허용하라는 메시지가 표시되면 n을 누릅니다.

  4. 배포가 완료될 때까지 기다립니다.

  5. 서비스 URL이 다음 형식으로 표시되면 복사합니다.

SERVICE_URL=$SERVICE_URL

Cloud Run을 호출하도록 서비스 계정 구성

배포한 workstation-config-updater 서비스는 인증되지 않은 호출을 허용하지 않습니다.

Cloud Scheduler에는 workstation-config-updater 서비스를 호출하는 데 적절한 사용자 인증 정보가 있는 서비스 계정이 필요합니다.

서비스 계정 설정

  1. Cloud Scheduler 작업에 사용할 서비스 계정이 아직 없으면 새 서비스 계정을 만듭니다.

    gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \
        --description="$DESCRIPTION" \
        --display-name="$DISPLAY_NAME"
  2. 서비스 계정에서 Cloud Run을 호출할 수 있도록 필수 IAM 역할 바인딩을 추가합니다.

    gcloud run services add-iam-policy-binding workstation-config-updater \
        --member=serviceAccount:$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com \
        --region $REGION \
        --role=roles/run.invoker

인증을 사용하여 Cloud Scheduler 구성 만들기

  1. 작업을 만들고 Cloud Run에 배포에서 복사한 URL을 지정합니다.

    gcloud scheduler jobs create http workstation-pool-increaser-cron \
        --http-method=POST \
        --location=us-central1 \
        --schedule="0 9 * * 1-5" \
        --time-zone="America/Los_Angeles" \
        --headers "Content-Type=application/json" \
        --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "2"}' \
        --uri=$SERVICE_URL \
        --oidc-service-account-email=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com

    이 명령어는 WorkstationCluster $CLUSTER의 모든 WorkstationConfigs에 대해 빠른 시작 풀 크기를 월요일부터 금요일 오전 9시(PST)에 2로 늘리는 작업을 예약합니다.

    자세한 내용은 작업 일정 구성을 참조하세요.

  2. 마찬가지로 영업일이 끝날 때 워크스테이션 구성의 풀 크기를 0으로 줄이려면 다음을 실행합니다.

    gcloud scheduler jobs create http workstation-pool-decreaser-cron \
        --http-method=POST \
        --location=$REGION \
        --schedule="0 17 * * 1-5" \
        --time-zone="America/Los_Angeles" \
        --headers "Content-Type=application/json" \
        --message-body='{"cluster":"$CLUSTER", "region":"$REGION", "pool-size": "0"}' \
        --uri=$SERVICE_URL \
        --oidc-service-account-email=$SERVICE-ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

(선택사항) 작업 확인

작업이 예상대로 작동하는지 확인하려면 작업을 확인하면 됩니다.

  1. Google Cloud 콘솔에서 Cloud Scheduler 페이지로 이동합니다.

    Cloud Scheduler로 이동

    workstation-pool-increaser-cron이 작업 목록에 표시됩니다.

  2. workstation-pool-increaser-cron 작업 행에서 작업 > 작업 강제 실행을 클릭합니다.

    프로젝트에 생성된 첫 번째 작업이 실행되는 데 몇 분 정도 걸릴 수 있습니다.

  3. 최종 실행 상태 열에서 Success 상태는 작업이 성공적으로 실행되었음을 나타냅니다.

워크스테이션 구성이 업데이트되었는지 확인하려면 다음을 수행합니다.

  1. Google Cloud 콘솔에서 워크스테이션 구성 페이지로 이동합니다.

    워크스테이션 구성으로 이동

  2. 빠른 시작 풀 크기가 2인지 확인합니다.

  3. Cloud Run 서비스의 로그를 확인합니다.