Go용 크론을 사용하여 태스크 예약

App Engine Cron Service를 사용하면 지정된 시간이나 주기적인 간격으로 작동하는 정기 예약 태스크를 구성할 수 있습니다. 이러한 태스크를 일반적으로 크론 작업이라고 합니다. 이러한 크론 작업은 App Engine Cron Service에 의해 자동으로 트리거됩니다. 예를 들어 크론 작업을 사용하여 일일 보고 이메일을 보내거나 10분마다 캐시된 일부 데이터를 업데이트하거나 매시간 요약 정보를 업데이트할 수 있습니다.

크론 작업은 예약된 일정에 따라 URL에 HTTP GET 요청을 합니다. 이 URL의 핸들러는 호출 시 로직을 실행합니다. 크론 작업 요청에는 push 태스크 큐의 경우와 동일한 제한이 적용됩니다.

시작하기 전에

일정을 배포하거나 업데이트하려면 계정에 다음 IAM 역할 중 하나가 필요합니다.

  • 소유자
  • 편집자

Google Cloud Platform Console의 IAM 페이지에서 권한을 설정할 수 있습니다.

크론 작업 만들기

  1. 애플리케이션의 루트 디렉터리에 app.yaml과 함께 cron.yaml 파일을 만듭니다.
  2. 파일에 <cron> 항목을 하나 이상 추가하고 필요한 <url><schedule> 요소를 포함하여 작업에 필요한 요소를 정의합니다.

    다음은 매일 실행되는 기본 크론 작업을 만드는 예입니다.

    cron:
    - description: "daily summary job"
      url: /tasks/summary
      target: beta
      schedule: every 24 hours
    

    타겟팅 사양은 선택사항이며 서비스/버전 이름입니다. 해당되는 경우 타겟이 앱의 호스트 이름 앞에 추가되어 작업 경로가 해당 서비스/버전으로 지정됩니다. 타겟을 지정하지 않으면 작업이 트래픽에 대해 구성된 default 서비스 버전에서 실행됩니다.

  3. 크론 작업 URL의 핸들러를 만듭니다. 이 핸들러는 예약하려는 모든 태스크를 실행합니다. 핸들러는 200~299(경계 포함) 범위의 HTTP 상태 코드로 응답하여 성공을 표시합니다. 다른 상태 코드도 반환될 수 있으며 이 코드는 크론 작업을 다시 시도하는 데 사용됩니다.

cron.yaml 구문과 옵션에 대해 자세히 알아보기.

개발 서버에서 크론 작업 테스트

로컬 개발 서버는 크론 작업을 자동으로 실행하지 않습니다. 기능을 테스트하도록 사용자가 크론 작업의 URL에 직접 요청할 수 있습니다. 로컬 크론 또는 예약된 작업 인터페이스를 사용하여 curl 또는 유사한 도구로 작업의 URL을 트리거할 수 있습니다.

로컬 개발 서버의 admin 인터페이스를 사용하여 http://localhost:8000/cron에서 크론 작업을 볼 수 있습니다.

실패한 크론 작업 다시 시도

크론 작업의 요청 핸들러가 200~299(경계 포함) 범위를 벗어나는 상태 코드를 반환하면 App Engine은 작업이 실패한 것으로 간주합니다. 기본적으로 실패한 작업은 503 상태 코드가 반환되지 않는 한 다시 시도되지 않습니다. 503 상태 코드가 반환된 경우에는 성공하거나 200~299 상태 코드가 반환될 때까지 매분마다 실패한 작업이 다시 시도됩니다.

실패한 작업을 다시 시도하도록 설정하려면 다음 안내를 따르세요.

  1. cron.yaml 파일에 retry_parameters 블록을 포함합니다.
  2. retry_parameters 블록에서 retry 매개변수를 선택하고 설정합니다.

    예를 들어 이 샘플 cron.yaml 파일에는 최대 5번(기본값) 재시도하고 백오프가 처음에 2.5초로 시작하여 매번 2배로 증가하도록 구성된 단일 크론 작업이 포함되어 있습니다.

    cron:
    - description: "retry demo"
      url: /retry
      schedule: every 10 mins
      retry_parameters:
        min_backoff_seconds: 2.5
        max_doublings: 5
    

크론 재시도 옵션에 대해 자세히 알아보기

크론 작업 배포

cron.yaml 구성 파일에 지정된 크론 작업을 배포하려면 다음 명령어를 실행합니다.

gcloud

gcloud app deploy cron.yaml

appcfg

원본 App Engine SDK를 사용할 경우 다음을 실행합니다.

appcfg.py update_cron [YOUR_APP_DIR]

모든 크론 작업 삭제

모든 크론 작업을 삭제하려면 다음 안내를 따르세요.

  1. cron.yaml 파일의 콘텐츠를 다음과 같이 수정합니다.

    cron:
    
  2. cron.yaml 파일을 App Engine에 배포합니다.

크론용 URL 보호

크론 핸들러는 app.yaml에 정의된 일반 핸들러에 지나지 않습니다. 관리자 계정에 대한 액세스를 제한하여 사용자가 예약된 태스크에서 사용되는 URL에 액세스하지 못하도록 할 수 있습니다. 예약된 태스크는 관리자 전용 URL에 액세스할 수 있습니다. login: admin의 핸들러 구성에 app.yaml을 추가하여 URL을 제한할 수 있습니다.

app.yaml에서의 예시는 다음과 같습니다.

runtime: go
api_version: go1

handlers:
- url: /report/weekly
  script: _go_app
  login: admin
자세한 내용은 app.yaml 참조에서 로그인 또는 관리자 상태 요구 방법을 확인하세요.

크론 작업을 테스트하려면 관리자로 로그인하고 브라우저에서 핸들러 URL을 방문합니다.

Cron Service에서 보내는 요청에는 HTTP 헤더가 포함됩니다.

X-Appengine-Cron: true

X-Appengine-Cron 헤더는 Google App Engine에 의해 내부적으로 설정됩니다. 요청 핸들러가 이 헤더를 발견하면 요청이 크론 요청임을 신뢰할 수 있습니다. 앱에 대한 외부 사용자 요청에 있는 헤더는 삭제됩니다. 단, 테스트용으로 헤더를 설정할 수 있는 로그인한 애플리케이션 관리자의 요청인 경우에는 헤더가 삭제되지 않습니다.

Google App Engine은 IP 주소 0.1.0.1에서 크론 요청을 발송합니다.

Google Cloud Endpoints 호출

크론 작업의 url 필드에는 Google Cloud Endpoint를 지정할 수 없습니다. 크론 작업이 Google Cloud Endpoint를 호출하도록 하려면 앱에서 핸들러가 제공하는 타겟으로 요청을 보내고 핸들러 코드에서 엔드포인트 클래스와 메서드를 호출합니다.

GCP Console에서 크론 작업 보기

GCP Console의 크론 작업 페이지에서 예약된 크론 작업을 확인할 수 있습니다.

로그를 확인하여 크론 작업이 추가되거나 삭제된 시기를 확인할 수도 있습니다.

자세히 알아보기

크론 작업 정의에 대한 자세한 내용은 cron.yaml 참조에서 확인하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Go용 App Engine 표준 환경