일정에 따라 서비스 실행

Cloud Scheduler를 사용하면 Cloud Run 서비스를 일정에 따라 안전하게 트리거할 수 있습니다. 크론 작업을 사용하는 것과 유사합니다.

사용 가능한 사용 사례는 다음과 같습니다.

  • 일정 간격으로 백업 수행
  • 다음과 같은 반복 작업을 수행합니다.
    • 사이트맵 재생성
    • 이전 데이터, 콘텐츠, 구성, 버전 삭제
    • 데이터 시스템 간 콘텐츠 동기화
    • 일일 이메일 알림 처리
    • 다운스트림 서비스에 대한 액세스 확인 및 보고
  • 청구서와 같은 문서 생성

이 페이지에서는 Cloud Scheduler와 Cloud Run을 동일한 Google Cloud 프로젝트 내에서 안전하게 사용하는 방법을 보여줍니다.

시작하기 전에

사용 중인 프로젝트에서 Cloud Scheduler API를 사용 설정합니다.

서비스 만들기 및 배포

서비스를 만들고 배포하려면 다음 안내를 따르세요.

  1. 서비스에서 일정에 따라 실행하려는 작업을 구현합니다.

  2. 서비스에서 작업 요청을 수신할 것으로 예상되는 요청 유형을 확인합니다(예시: GET 또는 POST). 서비스를 호출하는 예약된 작업을 만들려면 이것과 일치하는 HTTP 메서드를 지정해야 합니다.

  3. Cloud Scheduler에 사용 중인 서비스를 배포할 때는 인증되지 않은 호출을 허용하지 않아야 합니다.

다음 예시에서는 Terraform을 사용하여 Cloud Run 서비스를 배포하는 방법을 보여줍니다.

resource "google_cloud_run_v2_service" "default" {
  name     = "my-scheduled-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.run_api
  ]
}

us-docker.pkg.dev/cloudrun/container/hello를 자체 컨테이너 이미지에 대한 참조로 바꿉니다.

Cloud Scheduler에 대한 서비스 계정 만들기

Cloud Scheduler와 연결할 서비스 계정을 만들고, Cloud Run 서비스 호출 권한을 서비스 계정에 부여해야 합니다. 기존 서비스 계정을 사용하여 Cloud Scheduler를 나타내거나 새 계정을 만들 수 있습니다.

서비스 계정을 만들고 여기에 Cloud Run 서비스 호출 권한을 부여하려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 서비스 계정 페이지로 이동합니다.

    서비스 계정으로 이동

  2. 프로젝트를 선택합니다.

  3. Google Cloud 콘솔에 표시할 서비스 계정 이름을 입력합니다.

    Google Cloud 콘솔에서 이 이름을 기반으로 서비스 계정 ID가 생성됩니다. 필요한 경우 ID를 수정합니다. 나중에 이 ID를 변경할 수 없습니다.

  4. 선택사항: 서비스 계정에 대한 설명을 입력합니다.

  5. 만들고 계속하기를 클릭합니다.

  6. 선택사항: 역할 선택 필드를 클릭합니다.

  7. Cloud Run > Cloud Run Invoker를 선택합니다.

  8. 완료를 클릭합니다.

명령줄

  1. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
       --display-name "DISPLAYED_SERVICE_ACCOUNT_NAME"

    바꾸기

    • SERVICE_ACCOUNT_NAME을 Google Cloud 프로젝트 내에서 고유한 소문자 이름으로 바꿉니다(예: my-invoker-service-account-name).
    • DISPLAYED_SERVICE_ACCOUNT_NAME을 Console에서 이 서비스 계정에 표시하려는 이름으로 바꿉니다(예: My Invoker Service Account).
  2. Cloud Run의 경우 서비스를 호출할 수 있는 서비스 계정 권한을 부여합니다.

    gcloud run services add-iam-policy-binding SERVICE \
       --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
       --role=roles/run.invoker

    바꾸기

    • SERVICE를 Cloud Scheduler로 호출하려는 서비스 이름으로 바꿉니다.
    • SERVICE_ACCOUNT_NAME을 서비스 계정의 이름으로 바꿉니다.
    • PROJECT_ID를 Google Cloud 프로젝트 ID로 바꿉니다.
  3. 프로젝트의 리소스에 대한 특정 작업을 완료할 수 있는 권한을 갖도록 이 서비스 계정에 프로젝트에 대한 액세스 권한을 부여합니다.

    gcloud projects add-iam-policy-binding RESOURCE_ID \
       --member=PRINCIPAL --role=roles/run.invoker

    바꾸기

    • RESOURCE_ID: Google Cloud 프로젝트 ID

    • PRINCIPAL: 일반적으로 PRINCIPAL_TYPE:ID 형식을 사용하는 주 구성원 또는 구성원의 식별자입니다. 예를 들면 user:my-user@example.com입니다. PRINCIPAL가 가질 수 있는 값의 전체 목록은 정책 binding 참조를 확인하세요.

Terraform

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

Terraform을 사용하여 서비스 계정을 만들려면 다음을 실행합니다.

resource "google_service_account" "default" {
  account_id   = "scheduler-sa"
  description  = "Cloud Scheduler service account; used to trigger scheduled Cloud Run jobs."
  display_name = "scheduler-sa"

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.iam_api
  ]
}

resource "google_cloud_run_service_iam_member" "default" {
  location = google_cloud_run_v2_service.default.location
  service  = google_cloud_run_v2_service.default.name
  role     = "roles/run.invoker"
  member   = "serviceAccount:${google_service_account.default.email}"
}

Cloud Scheduler 작업 만들기

지정된 시간에 서비스를 호출하는 작업을 만들어야 합니다. 이를 위해서는 Console 또는 명령줄을 모두 사용할 수 있습니다.

Console 또는 gcloud 명령줄을 사용하여 작업을 만들 수 있습니다. 해당 탭을 클릭하세요.

콘솔

  1. Cloud 스케줄러 콘솔 페이지로 이동합니다.

    Cloud Scheduler로 이동

  2. 작업 만들기를 클릭합니다.

    스크린샷

  3. 작업의 이름을 지정합니다.

  4. 구성 문자열을 사용하여 작업이 실행되는 빈도 또는 작업 주기를 지정합니다. 예를 들어 문자열 0 */3 * * *은 3시간마다 작업을 실행합니다. crontab 호환 문자열이라면 어떤 문자열도 여기에 제공할 수 있습니다.

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

  5. 드롭다운 목록에서, 작업 빈도에 사용할 시간대를 선택합니다.

  6. 대상으로 HTTP를 지정합니다.

    1. 서비스의 정규화된 URL을 지정합니다(예: https://myservice-abcdef-uc.a.run.app). 작업이 이 URL로 요청을 전송합니다.

    2. HTTP 메서드를 지정합니다. 이 메서드는 이전에 배포된 Cloud Run 서비스에 사용되는 것과 일치해야 합니다. 기본값은 POST입니다.

    3. 필요 시, 대상으로 전송할 데이터를 지정합니다. 이 데이터는 POST 또는 PUT HTTP 메서드를 선택할 때 요청 본문에 담겨서 전송됩니다.

    4. 인증 설정을 표시하려면 더 보기를 클릭합니다.

    5. 드롭다운 메뉴에서 OIDC 토큰 추가를 선택합니다.

    6. 서비스 계정 필드에서 이전에 만든 서비스 계정의 서비스 계정 이메일을 복사합니다.

    7. 대상 필드에서 서비스의 전체 URL을 복사합니다.

  7. 만들기를 클릭하여 작업을 만들고 저장합니다.

명령줄

Cloud Scheduler에서 인증된 Cloud Run 서비스에 액세스하려면 OIDC 인증을 사용해야 합니다. OIDC 인증에는 서비스 계정과 대상 플래그가 포함됩니다. 자세한 내용은 HTTP 대상에 인증 사용을 참조하세요.

Cloud Scheduler 작업을 만들려면 다음 안내를 따르세요.

gcloud scheduler jobs create http test-job --schedule "5 * * * *" 
--http-method=HTTP-METHOD
--uri=SERVICE-URL
--oidc-service-account-email=SERVICE-ACCOUNT-EMAIL
--oidc-token-audience=SERVICE-URL

바꾸기

  • HTTP-METHOD를 HTTP 메서드(예: GET, POST, PUT 등)로 바꿉니다.
  • SERVICE-URL을 서비스 URL로 바꿉니다.
  • SERVICE-ACCOUNT-EMAIL을 서비스 계정 이메일로 바꿉니다.

Terraform

Terraform 구성을 적용하거나 삭제하는 방법은 기본 Terraform 명령어를 참조하세요.

Cloud Run 서비스의 Cloud Scheduler 작업을 만들려면 다음을 실행합니다.

resource "google_cloud_scheduler_job" "default" {
  name             = "scheduled-cloud-run-job"
  region           = "us-central1"
  description      = "Invoke a Cloud Run container on a schedule."
  schedule         = "*/8 * * * *"
  time_zone        = "America/New_York"
  attempt_deadline = "320s"

  retry_config {
    retry_count = 1
  }

  http_target {
    http_method = "POST"
    uri         = google_cloud_run_v2_service.default.uri

    oidc_token {
      service_account_email = google_service_account.default.email
    }
  }

  # Use an explicit depends_on clause to wait until API is enabled
  depends_on = [
    google_project_service.scheduler_api
  ]
}

Cloud Run 서비스는 사용자가 정의한 빈도에 따라 Cloud Scheduler 작업의 요청을 통해 트리거됩니다. 이 서비스 로그를 조사하여 이를 확인하고 모니터링할 수 있습니다.

다음 단계