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


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

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

이 튜토리얼은 일반적인 업무 시간에 맞게 빠른 시작 풀 크기를 늘리거나 줄이는 데 도움이 됩니다.

목표

  1. 워크스테이션 구성의 빠른 시작 풀 크기를 업데이트하는 Cloud Run 서비스를 작성하고 배포하기
  2. PST 영업시간에 맞게 월~금 오전 9시~오후 5시에 실행되도록 1단계에서 만든 서비스를 예약하는 Cloud Scheduler 작업을 구성하기

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • Cloud Scheduler
  • Cloud Run

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Cloud Run, Cloud Scheduler, Cloud Workstations 사용 설정

    API 사용 설정

  5. Google Cloud CLI를 설치합니다.
  6. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  9. API Cloud Run, Cloud Scheduler, Cloud Workstations 사용 설정

    API 사용 설정

  10. Google Cloud CLI를 설치합니다.
  11. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init

환경 준비

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

  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 서비스의 로그를 확인합니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

테스트 프로젝트 삭제

Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 청구될 수 있습니다. 비용이 청구되지 않도록 컨테이너 이미지를 삭제하거나 Google Cloud 프로젝트를 삭제할 수 있습니다. Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.

  1. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

Cloud Scheduler 작업 삭제

개별 Cloud Scheduler 리소스를 삭제하려면 다음 안내를 따르세요.

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

    Cloud Scheduler로 이동

  2. 작업 옆에 있는 체크박스를 클릭합니다.

  3. 페이지 상단의 삭제 버튼을 클릭하고 삭제를 확인합니다.

다음 단계

  • Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항 살펴보기 Cloud 아키텍처 센터 살펴보기