Cloud Scheduler로 Cloud Run 작업 트리거

1. 개요

이 실습에서는 Cloud Run 작업을 만들고 Cloud Scheduler 작업을 설정합니다. 설정 스크립트를 사용하여 Cymbal Eats 메뉴 서비스를 배포합니다. Cymbal Eats Menu Service에 대한 API를 호출하는 Cloud Run 작업을 만듭니다. Google Cloud CLI를 사용하여 작업을 실행하고 작업 일정을 설정합니다. 로그를 검토하고 메뉴 서비스에 API를 호출하여 메뉴 항목이 삭제되었는지 확인하여 실행을 확인합니다.

Cloud Run 작업이란 무엇인가요?

Cloud Run 작업은 웹 요청을 처리하는 대신 운영 태스크 또는 데이터 처리를 실행하는 컨테이너를 실행합니다. 컨테이너가 작업을 실행하고 완료되면 종료됩니다.

서비스 정리 작업

정리 서비스 작업은 실패 상태인 메뉴 항목을 검색하여 삭제합니다. 새 메뉴 항목이 생성되면 Vision API를 통해 이미지를 분석하여 음식인지 여부를 감지합니다. 이 유효성 검사에 실패한 이미지의 경우 메뉴 항목 상태가 실패로 업데이트되고 이후 정리 작업에 의해 삭제됩니다.

d74200f0bd14d350.png

학습할 내용

이 실습에서는 다음 작업을 진행하는 방법을 학습합니다.

  • Cloud Run 작업 만들기
  • Cloud Run 작업 실행
  • Cloud Scheduler 작업 만들기
  • 작업 실행 확인

기본 요건

  • 이 실습에서는 Cloud 콘솔 및 셸 환경에 익숙하다고 가정합니다.
  • 이전 Cloud Run 및 Cloud Scheduler 경험은 유용하지만 필수는 아닙니다.

2. 설정 및 요구사항

Cloud 프로젝트 설정

  1. Google Cloud Console에 로그인하여 새 프로젝트를 만들거나 기존 프로젝트를 재사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 프로젝트 이름은 이 프로젝트 참가자의 표시 이름입니다. 이는 Google API에서 사용하지 않는 문자열이며 언제든지 업데이트할 수 있습니다.
  • 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유하며, 변경할 수 없습니다(설정된 후에는 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로 PROJECT_ID로 식별됨)를 참조해야 합니다. 생성된 ID가 마음에 들지 않으면 무작위로 다른 ID를 생성할 수 있습니다. 또는 직접 시도해 보고 사용 가능한지 확인할 수도 있습니다. 이 단계 이후에는 변경할 수 없으며 프로젝트 기간 동안 유지됩니다.
  • 참고로 세 번째 값은 일부 API에서 사용하는 프로젝트 번호입니다. 이 세 가지 값에 대한 자세한 내용은 문서를 참고하세요.
  1. 다음으로 Cloud 리소스/API를 사용하려면 Cloud 콘솔에서 결제를 사용 설정해야 합니다. 이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 튜토리얼이 끝난 후에 요금이 청구되지 않도록 리소스를 종료하려면 만든 리소스를 삭제하거나 전체 프로젝트를 삭제하면 됩니다. Google Cloud 새 사용자에게는 미화 $300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.

환경 설정

검색창 오른쪽에 있는 아이콘을 클릭하여 Cloud Shell을 활성화합니다.

eb0157a992f16fa3.png

Cloud Shell에서 다음 명령어를 실행하여 저장소의 애플리케이션 코드를 클론하고 메뉴 서비스가 포함된 디렉터리로 이동합니다.

git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git && cd cymbal-eats/menu-service

설정 스크립트를 사용하여 Cloud Run에 메뉴 서비스를 배포합니다. 메뉴 서비스는 백엔드에 Cloud SQL Postgres 데이터베이스를 사용하여 Quarkus 프레임워크로 빌드된 Java 기반 마이크로서비스입니다. 메뉴 서비스는 다음 단계에서 만들 Cloud Run 작업의 런타임 종속 항목입니다.

./setup.sh

배포에 필요한 모든 구성요소를 만드는 데 10분 정도 걸립니다.

위 명령어를 실행한 후 다음 단계를 계속 진행합니다.

3. Cloud Run 작업 코드 살펴보기

더하기 아이콘을 클릭하여 Cloud Shell에서 새 탭을 엽니다.

45f480cd1b9a995.png

정리 서비스가 포함된 디렉터리로 이동하여 작업을 구성하는 파일을 검토합니다.

cd ~/cymbal-eats/cleanup-service

이 디렉터리의 정리 서비스에는 필요한 종속 항목(httpie, jq)과 함께 정리 서비스 작업을 위한 컨테이너 이미지를 정의하는 Dockerfile가 포함되어 있습니다.

Dockerfile

FROM ubuntu:latest 
RUN apt-get update && apt-get install -y httpie jq && apt-get clean
COPY script.sh /
RUN chmod +x /script.sh
CMD ["/script.sh"]
ENTRYPOINT ["/bin/bash"]

아래에 나열된 실제 정리 스크립트에는 실패 상태의 메뉴 항목 목록을 가져와 메뉴 서비스에 API를 호출하여 삭제하는 명령어가 포함되어 있습니다.

script.sh

echo "FAILED_ITEM_AGE=$FAILED_ITEM_AGE"
echo "MENU_SERVICE_URL=$MENU_SERVICE_URL"
# Failed items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/failed | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber) )| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

# Processing items older than FAILED_ITEM_AGE in minutes
for id in $(http GET $MENU_SERVICE_URL/menu/processing | jq '[.[] | select(.updateDateTime < ((now - 60 * (env.FAILED_ITEM_AGE | tonumber))| strftime("%Y-%m-%dT%H:%M:%S.%f")))]'| jq '.[].id'); do
  echo "Deleting Menu Item : $MENU_SERVICE_URL/menu/$id"
  http GET $MENU_SERVICE_URL/menu/$id
  http DELETE $MENU_SERVICE_URL/menu/$id
done

스크립트에 관한 다음 사항에 유의하세요.

  • FAILED_ITEM_AGEMENU_SERVICE_URL 환경 변수는 배포 중에 설정되며 Cloud Run 작업에 의해 전달됩니다.
  • FAILED_ITEM_AGE - 실패한 항목이 삭제되기까지 남은 시간(분)입니다.
  • MENU_SERVICE_URL - Cymbal Eats 메뉴 서비스 URL

4. Cloud Run 작업 만들기

다음으로 컨테이너 이미지를 빌드하여 Artifact Registry에 게시합니다.

이 컨테이너 이미지는 Cloud Run 작업을 만드는 데 사용됩니다.

서비스 API를 사용 설정합니다.

gcloud services enable \
    run.googleapis.com \
    artifactregistry.googleapis.com \
    cloudscheduler.googleapis.com \
    --quiet

환경 변수를 설정합니다.

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')
export PROJECT_NAME=$(gcloud projects describe $PROJECT_ID --format='value(name)')
export REGION=us-east1
export MENU_SERVICE_NAME=menu-service

삭제 작업을 위한 Docker 이미지를 저장할 새 Artifact Registry 저장소를 만듭니다.

gcloud artifacts repositories create cymbal-eats --repository-format=docker --location=$REGION

Cloud Build를 사용해 컨테이너 이미지를 빌드하고 명령어 하나로 Artifact Registry에 푸시합니다.

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest

출력 예시:

DURATION: 35S
SOURCE: gs://cymbal-eats-14906-569_cloudbuild/source/1657126400.933586-dc3e91ec85934a55bb6d2f7012611365.tgz
IMAGES: us-east1-docker.pkg.dev/cymbal-eats-14906-569/cymbal-eats/cleanup-service (+1 more)
STATUS: SUCCESS

게시가 완료되면 Artifact Registry로 이동하여 게시된 이미지를 검토합니다.

fb95ae38baa7c543.png

두 번째 Cloud Shell 탭으로 다시 전환합니다. 다음 명령어를 실행하여 메뉴 서비스를 설명하고 URL을 환경 변수에 저장합니다. 이 환경 변수는 Cloud Run 작업을 구성하는 데 사용됩니다.

MENU_SERVICE_URL=$(gcloud run services describe $MENU_SERVICE_NAME \
 --region=$REGION \
 --format=json | jq \
 --raw-output ".status.url")

[FAILED_ITEM_AGE에서 설정]하고 1분이 지난 실패한 메뉴 항목을 삭제하는 Cloud Run 작업을 만듭니다.

gcloud beta run jobs create cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

출력 예시:

Creating Cloud Run job [cleanup-service] in project [cymbal-eats] region [us-east1]
OK Creating job... Done.
Done.
Job [cleanup-service] has successfully been created.

콘솔에서 Cloud Run 작업 섹션으로 이동하여 생성된 작업을 검토합니다.

작업을 클릭하고 사용 가능한 탭(기록, 로그, 구성, YAML)을 살펴봅니다.

b12c8e312de3b66.png

콘솔에서 작업의 구성 섹션을 검토하여 환경 변수가 설정되었는지 확인합니다.

724c2919d05349c8.png

(선택사항) Cloud Run 작업이 생성된 후에 실패한 항목 기간 또는 메뉴 서비스 URL 변수를 변경하려면 update 명령어를 사용하면 됩니다.

gcloud beta run jobs update cleanup-service \
  --image=$REGION-docker.pkg.dev/$PROJECT_NAME/cymbal-eats/cleanup-service:latest \
  --set-env-vars MENU_SERVICE_URL=$MENU_SERVICE_URL \
  --set-env-vars FAILED_ITEM_AGE=1 \
  --region $REGION

작업을 검증하려면 다음 명령어를 실행하여 Cloud Run 작업을 실행합니다.

gcloud beta run jobs execute cleanup-service --region=$REGION

출력 예시:

OK Creating execution... Done.                                   
  OK Provisioning resources...
Done.
Execution [cleanup-service-rlxs4] has successfully started running.

View details about this execution by running:
gcloud beta run jobs executions describe cleanup-service-rlxs4
 

로그 탭으로 전환하여 작업의 출력을 검토합니다. 로그에 실패한 항목 기간 및 메뉴 서비스 URL이 표시됩니다.

518cb00036a2561f.png

5. Cloud Run 작업 일정 설정

Cloud Scheduler는 엔터프라이즈 수준의 완전 관리형 크론 작업 스케줄러로서 일괄 및 빅데이터 작업, 클라우드 인프라 작업 등을 비롯한 거의 모든 작업의 예약을 돕습니다.

Cloud Scheduler 작업으로 작업할 때의 보안 권장사항 중 하나는 별도의 사용자 인증 정보로 각 작업을 실행하는 것입니다. 이 단계에서는 삭제 스케줄러 작업에서 사용할 서비스 계정을 만듭니다.

export SCHEDULER_SERVICE_ACCOUNT=cleanup-scheduler-job-sa

gcloud iam service-accounts create ${SCHEDULER_SERVICE_ACCOUNT}

Cloud Run 작업을 호출하려면 Cloud Scheduler 작업에 권한이 필요합니다.

Cloud Scheduler 작업에서 사용되는 서비스 계정에 Cloud Run Invoker 역할을 부여합니다.

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member="serviceAccount:${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role="roles/run.invoker"

다음으로 정리 서비스 작업을 실행할 일정을 설정합니다.

Cloud Scheduler에서는 여러 대상 유형이 지원됩니다.

  • HTTP
  • Pub/Sub
  • App Engine HTTP

HTTP 대상 유형을 사용하여 스케줄러 작업을 만듭니다.

여기서는 시연을 위해 5분마다 실행되도록 예약합니다.

gcloud scheduler jobs create http cleanup-schedule \
    --location $REGION \
    --schedule="*/5 * * * *" \
    --uri="https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/cleanup-service:run" \
    --http-method POST \
    --oauth-service-account-email ${SCHEDULER_SERVICE_ACCOUNT}@${PROJECT_ID}.iam.gserviceaccount.com

Cloud Run 작업을 호출하는 데 사용되는 uri 매개변수를 검토합니다.

  • REGIONPROJECT_ID - 삭제 서비스 작업이 배포된 Cloud Run 리전 및 프로젝트 ID
  • cleanup-service - Cloud Run 작업의 이름

콘솔에서 Cloud Scheduler로 이동하여 생성된 스케줄러 작업을 검토합니다.

3bc9120df7fc6ed.png

작업 메뉴에서 사용 가능한 옵션을 검토합니다.

7945908025dd2f2b.png

6. Cloud Run 작업 테스트

메뉴 서비스 엔드포인트를 사용하여 기존 메뉴 항목과 상태를 검토합니다.

curl ${MENU_SERVICE_URL}/menu | jq

출력:

Ready 상태로 메뉴 항목 3개가 표시됩니다.

메뉴 항목 #1의 상태를 Failed로 변경합니다.

curl -X PUT "${MENU_SERVICE_URL}/menu/1" \
  -H 'Content-Type: application/json' \
  -d '{"status": "Failed"}' | jq

1분 동안 기다립니다. 메뉴 항목이 삭제되려면 FAILED_ITEM_AGE 매개변수에서 설정한 대로 1분이 지나야 합니다.

다음 예약된 실행을 기다리거나 콘솔에서 작업을 강제로 실행할 수 있습니다.

UI 또는 명령줄을 통해 작업을 트리거하는 방법에는 여러 가지가 있습니다.

이 예시에서는 Cloud Shell에서 명령어를 실행하여(옵션 #3) 작업을 트리거합니다.

  1. Cloud Scheduler에서 '작업 강제 실행'을 선택합니다. 수행할 수 있습니다.

6c8cbeae6165ba4a.png

  1. Cloud Run 작업에서 '실행'을 클릭합니다. 버튼을 클릭합니다.

229c22288882b5c3.png

  1. Cloud Shell에서 다음 명령어를 실행합니다.
gcloud beta run jobs execute cleanup-service --region=$REGION

Cloud Run 작업 섹션으로 이동하여 로그 탭을 열고 메뉴 항목이 삭제되었는지 확인합니다.

50829ae27b135b2d.png

'삭제'의 로그 필터링 키워드를 사용하여 로그를 찾습니다.

d94fb9e444b1c1b8.png

메뉴 서비스 엔드포인트를 사용하여 REST 엔드포인트를 통해 기존 메뉴 항목을 확인합니다.

curl ${MENU_SERVICE_URL}/menu | jq

출력:

Ready 상태로 메뉴 항목 2개가 표시됩니다.

7. 축하합니다.

축하합니다. Codelab을 완료했습니다.

학습한 내용

  • Cloud Run 작업을 만드는 방법
  • Cloud Run 작업을 실행하는 방법
  • Cloud Scheduler 작업을 만드는 방법
  • 작업 실행을 확인하는 방법

다음 단계:

다른 Cymbal Eats Codelab 살펴보기:

삭제

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

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 튜토리얼에서 만든 프로젝트를 삭제하는 것입니다.