[GCP]Serverless 서비스인 Cloud Run 알아보기 8부 — Cloud Run Jobs 서비스

이정운 (Jungwoon Lee)
google-cloud-apac
Published in
17 min readMar 15, 2023

안녕하세요 이정운 입니다.

Google Cloud 에서 제공하는 컨테이너 기반의 Serverless 솔루션인 Cloud Run 에 대해서 살펴보고 실제 테스트해보면서 써볼 수 있는 시간을 가져보는 시리즈를 하단과 같이 진행하고 있습니다.

[GCP]Serverless 서비스인 Cloud Run 알아보기 1부 — Cloud Run 개요
[GCP]Serverless 서비스인 Cloud Run 알아보기 2부 — 로컬에서 개발하기(Cloud Code)
[GCP]Serverless 서비스인 Cloud Run 알아보기 3부 — 업데이트 및 트래픽 조정
[GCP]Serverless 서비스인 Cloud Run 알아보기 4부 — 서버리스 VPC 액세스
[GCP]Serverless 서비스인 Cloud Run 알아보기 5부 — Eventarc 를 통한 이벤트 받기
[GCP]Serverless 서비스인 Cloud Run 알아보기 6부 — Cloud logging 과 Eventarc 를 통한 이벤트 처리
[GCP]Serverless 서비스인 Cloud Run 알아보기 7부 — Cloud Storage FUSE 를 활용하여 여러 서비스간의 데이터 공유

지난 시간까지 Serverless 서비스인 Cloud Run 에 대해서 알아봤는데 이번 시간에는 조금은 다른 형태의 서비스 요건을 Serverless 형태로 처리하기 위한 Cloud Run Jobs 서비스에 대해서 알아보도록 하겠습니다.

지금까지 설명된 Cloud Run 서비스는 요청을 수신 대기하고 이벤트를 받으면 해당 작업을 수행하는 Event-driven 형태의 방식이였습니다. Cloud Run Jobs 서비스는 이와 다르게 요청을 수신하는 것이 아니라 Job 을 직접 호출해야 하고 호출되면 해당 작업만 실행하고 완료되면 종료되는 형태를 가지고 있습니다. 다시 말해 Job 은 요청을 처리하거나 포트에서 수신할 수 있는 기능이 없고 마치 배치작업을 수행하는 것처럼 해당 작업만 실행하고 완료되면 컨테이너 실행이 종료됩니다. 따라서, 사용자는 Job 을 만들어서 일회성으로 또는 병렬로 일정에 따라 수행하거나 워크플로우의 일부로 실행할 수 있습니다.(배치 작업을 생각하시면 가장 쉽게 이해하실 수 있을듯 합니다.) Cloud Run Jobs 은 배치 형태의 업무를 컨테이너 형태로 로직을 작성하므로 빠르게 실행할 수 있으며 쉽게 병렬화 할 수 있다는 장점을 가지고 있습니다.

추가로, Cloud Run 과 Cloud Run Jobs 서비스의 차이는 하단에 첨부 드리는 동영상과 비교표를 통해 살펴보시면 이해하시는데 도움이 될 것 같습니다.

Introducing Cloud Run Jobs
https://www.youtube.com/watch?v=e07TvWMmVI8

그럼 이번에도 역시 설명보다는 기 언급한 것처럼 실제 테스트를 직접 해보면서 Cloud Run Jobs 이 어떻게 동작하고 활용될 수 있는지 살펴볼 수 있는 시간을 가져보도록 하겠습니다

#1) Cloud Run Jobs 시작해보기

Getting started with Cloud Run jobs
https://codelabs.developers.google.com/codelabs/cloud-starting-cloudrun-jobs#0

Cloud Run Jobs 에 대해서는 잘 정리된 Codelabs 이 있어서 이를 기반으로 테스트 해보고 어떻게 동작하는지 살펴보는 시간을 가지도록 하겠습니다. 테스트에 앞서 환경설정 값들을 사용하기 위한 설정을 먼저 수행합니다.

PROJECT_ID=프로젝트ID
REGION=리전명(예:asia-northeast3)
gcloud config set core/project $PROJECT_ID
gcloud config set run/region $REGION

그리고 테스트를 수행하기 위한 간단한 demo application 을 github 에서 다운로드 받습니다.

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git
cd jobs-demos/screenshot

다운로드 받은 샘플 애플리케이션 소스를 vi 로 살펴보셔도 되지만 Google cloud 의 Shell editor 가 훨씬 깔끔하게 볼 수 있게 환경을 제공하므로 shell editor 를 통해서 소스를 살펴보도록 하겠습니다.
(참고로 Cloud Shell editor 에 대한 설명은 링크 참고하시기 바라겠습니다. https://cloud.google.com/shell/docs/editor-overview)

edit screenshot.js

상단의 screenshot.js 가 샘플 애플리케이션의 메인 소스이고 node.js 로 작성되어있으며 간단하게 설명드리면 브라우저에서 특정 URL 접속후 스크린샷을 찍은 후 GCS bucket 에 해당 이미지를 저장하는 로직으로 되어있습니다.

추가적으로 컨테이너를 작성하기 위한 Dockerfile 이 하단과 같이 포함되어있는 것을 확인할 수 있습니다.

간단하게 소스를 확인했으면 실제 Cloud Run 에 돌릴 컨테이너를 작성하기 위해서 먼저 Artifact Registry 를 생성합니다. Artifact Registry는 조직에서 컨테이너 이미지 및 프로그램 언어 패키지(예: Maven 및 npm)를 관리할 수 있는 저장소이며 Docker Registry 의 Google cloud 버전으로 이해하시면 쉬울듯 합니다.(참고 링크 : https://cloud.google.com/artifact-registry)

gcloud artifacts repositories create containers --repository-format=docker --location=asia-northeast3

Artifact Registry 를 생성하면 Google cloud 콘솔에서 하단과 같이 확인할 수 있고 폴더 구조 형태를 가질 수 있다는 것을 확인할 수 있습니다.

컨테이너 저장소를 만들어두었으니 이제 샘플소스를 컨테이너 이미지로 빌드해서 저장소에 저장합니다. 이를 위해서 Google Cloud Build 를 사용할 수 있으며 하단과 같이 간단하게 CLI 로 수행 가능합니다. 참고로 Google Cloud Build 는 완전관리형태로 제공되는 CI/CD 솔루션으로 보시면 됩니다. (보다 자세한 내용은 링크를 참고하세요 — https://cloud.google.com/build)

gcloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_ID/containers/screenshot:v1

정상적으로 샘플 소스에서 컨테이너 이미지를 만들어서 Artifact Registry 에 저장이 되면 하단과 같이 screenshot 이라는 이미지를 확인할 수 있습니다.

추가적으로 이미지를 클릭해보시면 아시겠지만 Artifact Registry 가 기본적으로 가지고 있는 기능중에 하나는 취약점 스캔을 통한 분석이 자동으로 이루어진다는 것입니다. 그래서 해당 이미지의 우측에 발견된 취약점 개수를 확인할 수 있습니다.

또한, 해당 숫자를 클릭하면 하단과 같이 취약점에 대한 상세 내용을 확인할 수 있습니다.

그리고 각각의 CVE 의 VIEW FIX 버튼을 클릭하면 좀 더 상세 정보를 확인할 수 있습니다.

특히, CVE 공식 링크를 클릭하면 취약점에 대한 상세 내용과 어떤 버전이 취약한지, 취약점을 수정한 패키지가 어떤것인지까지 확인할 수 있습니다.

여기서 간단하게 해당 취약점을 제거할 수 있는 가장 쉬운 방법을 하나 보여드리면 하단과 같이 Dockerfile 에서 지정된 base image 를 가급적 최신 버전을 사용하는 것입니다.

버전을 업데이트한 이미지를 만들어서 Artifact Registry 에 저장후 살펴보면 취약점이 약 절반 가까이 줄어든 것을 확인할 수 있습니다.

특히, Critical 은 대부분 없어진 것을 확인할 수 있습니다.(하나 남은거는 확인해봤더니 바로 어제 업데이트 되어서 아직 공식 이미지에는 반영이 안된거였습니다.)

#2) Cloud Run Jobs 테스트 해보기

이제 실제로 Cloud Run Job 서비스를 테스트 해보기 위해서 먼저 해당 서비스가 사용할 권한을 가지고 있을 Service Account 를 하나 생성합니다. SA 생성후에 필요한 권한을 넣어주면 되는데 여기서는 데모 목적이라 간단하게 roles/storage.admin 을 부여하도록 하겠습니다.
(Service account 에 대한 상세 내용이 궁금하신 분은 링크를 참고하세요 — https://cloud.google.com/iam/docs/service-account-overview)

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"
gcloud projects add-iam-policy-binding $PROJECT_ID \
--role roles/storage.admin \
--member serviceAccount:screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

SA 에 권한을 부여했으면 이제 Cloud Run Jobs 서비스를 gcloud 명령을 통해서 생성합니다. 이때 task 와 같이 작업을 몇번 실행할지에 대한 옵션이나, task-timeout 과 같이 타임아웃값등 다양한 옵션을 추가로 넣을 수 있습니다. 좀 더 상세 옵션이 궁금하신 분들은 해당 링크를 참고하시기 바라겠습니다. (https://cloud.google.com/sdk/gcloud/reference/beta/run/jobs/create)

gcloud beta run jobs create screenshot \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/containers/screenshot:v1 \
--args="https://example.com" \
--args="https://cloud.google.com" \
--tasks=2 \
--task-timeout=5m \
--region=$REGION \
--set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID \
--service-account=screenshot-sa@$PROJECT_ID.iam.gserviceaccount.com

정상적으로 컨테이너 이미지가 빌드되고 Cloud Run Jobs 이 생성되었다면 Google cloud 콘솔 > Cloud Run 의 Jobs 탭에서 하단과 같이 screenshot 애플리케이션 형태로 올라온 것을 확인할 수 있습니다.

Job 애플리케이션 이름을 클릭하면 하단과 같이 상세 정보도 확인하실 수 있습니다.

처음에도 말씀드렸지만 Cloud Run Jobs 은 일반적인 Cloud Run 과 달리 요청을 처리하는 형태가 아니기 때문에 스케줄링 하거나 수행이 필요할 때 해당 작업을 직접 수행해야 합니다. gcloud 명령을 통해서 Job 이 정상적으로 수행되는지 실행해보도록 하겠습니다. (참고로 Job 을 수행하려면 해당 User 는 roles/run.invoker 권한을 가지고 있어야 합니다.)

gcloud beta run jobs execute screenshot --region=$REGION

디폴트 형태로 Job 을 수행하게 되면 Job 애플리케이션이 배치 형태로 동작하게 되고 Google cloud 관리 콘솔에서 하단과 같이 status 를 확인할 수 있습니다.

해당 Execution ID 를 클릭하면 Task 별 상세 내용을 확인 가능합니다.

추가로 상세 메뉴에서는 기본 정보이외에 Logs 도 같은 콘솔에서 바로 확인할 수 있습니다.

해당 screenshot Job 이 정상적으로 수행되었으면 하단과 같이 지정된 GCS bucket 에 node.js 애플리케이션을 통해서 캡쳐된 이미지 파일이 생성된 것을 확인할 수 있습니다.

GCS 에서 해당 이미지를 직접 확인도 해보실 수 있습니다.

#3) Cloud Run Jobs 스케줄링 해보기

이전 파트까지는 Cloud Run Jobs 을 생성하고 수행하는 테스트를 해봤습니다. 그런데 일반적으로 배치성 업무들은 특정 시간 배치, 일배치와 같이 주기적으로 수행되는 경우가 많습니다. 이를 고려하여 이번에는 Cloud Run Jobs 를 Cloud Scheduler 와 연동하여 간단하게 스케줄링을 해보도록 하겠습니다. 참고로 Cloud Scheduler 는 Google cloud 에서 솔루션 형태로 제공하는 완전 관리형 스케줄러로서 cron job 형태로 배치 작업을 예약하거나 스케줄링을 자동화 할 수 있습니다.

먼저 Cloud Scheduler 서비스를 사용하기 위해서 해당 API 를 enable 합니다.

gcloud services enable cloudscheduler.googleapis.com

그리고 Cloud Run Jobs 을 수행하기 위한 Service Account 를 하나 생성하고 roles/run.invoker 권한을 부여합니다.

gcloud iam service-accounts create run-invoke-001 --display-name="SA for Scheduler"

gcloud projects add-iam-policy-binding $PROJECT_ID \
--role roles/run.invoker \
--member serviceAccount:run-invoke-001@$PROJECT_ID.iam.gserviceaccount.com

정상적으로 해당 작업이 완료되면 Google cloud 관리콘솔 > IAM 메뉴에서 하단과 같이 Service Account 와 권한을 확인 가능합니다.

gcloud 명령을 사용하여 Cloud Scheduler 의 작업을 생성합니다. — schedule 뒤에 들어갈 cron job 은 일반적으로 사용하는 cron job 과 동일한 형태이며 가이드에서 사용한 “0 9 * * *” 는 매일 오전 9시에 해당 Job 을 수행하라는 의미입니다.
(보다 자세한 내용은 링크를 참고하세요 — https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules)

gcloud scheduler jobs create http screenshot-scheduled --schedule "0 9 * * *" \
--http-method=POST \
--uri=https://$REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/screenshot:run \
--oauth-service-account-email=run-invoke-001@jwlee-myproject-01.iam.gserviceaccount.com \
--location $REGION

이렇게 Cloud Scheduler 와 연동 작업을 생성하면 Google cloud 관리 콘솔 > Cloud Run > Triggers 탭 메뉴에서 하단과 같이 연동된 Cloud Scheduler 작업을 확인할 수 있습니다.

당연히 Cloud Scheduler 메뉴에서도 직접 해당 스케줄링을 확인 가능합니다. (참고로 해당 메뉴의 우측에 Actions 메뉴에서 Force run 메뉴가 있어서 즉시 수행해 볼 수도 있습니다.)

지금까지 Serverless 서비스인 Cloud Run 알아보기 시리즈의 8번째 이야기로 배치 서비스 요건을 Serverless 형태로 처리하기 위한 Cloud Run Jobs 에 대해서 알아보았습니다. 컨테이너 형태로 Job 을 만든후에 배치형태로 일회성이나 워크플로우의 일부로 실행 가능하므로 다양한 배치 관련 업무를 Serverless 형태로 처리할 수 있는 이점이 있다는 것을 알 수 있습니다. 예를 들어 배치성으로 GCS 의 파일을 옮기거나 Cloud SQL 과 같은 DB 의 데이터를 이관하는 등의 다양한 요건에 활용될 수 있지 않을까 합니다. 그럼 여기까지해서 이번 이야기에 대해서는 마무리를 하고 다음에 다시 다른 이야기로 돌아오도록 하겠습니다. ^^&

Disclaimer: 본 글의 작성자는 Google 직원이지만 Google cloud 를 공부하는 한 개인으로서 작성된 글입니다. 본 글의 내용, 입장은 Google 을 대변하지 않으며 Google 이 해당 콘텐츠를 보장하지 않습니다.

참고 자료 #1

Introducing Cloud Run Jobs
https://www.youtube.com/watch?v=e07TvWMmVI8

Getting started with Cloud Run jobs
https://codelabs.developers.google.com/codelabs/cloud-starting-cloudrun-jobs#0

Cloud Shell Editor interface overview
https://cloud.google.com/shell/docs/editor-overview

Service accounts overview
https://cloud.google.com/iam/docs/service-account-overview

gcloud beta run jobs create
https://cloud.google.com/sdk/gcloud/reference/beta/run/jobs/create

Configure cron job schedules
https://cloud.google.com/scheduler/docs/configuring/cron-job-schedules

--

--

이정운 (Jungwoon Lee)
google-cloud-apac

Technical engineer who dreams better future. (These thoughts are my own personal opinions, and do not reflect or represent Google’s opinions or plans.)