Как запланировать выполнение задания в облаке в пределах периметра управления услугами VPC

1. Введение

Обзор

Если ваш проект GCP находится внутри периметра VPC SC, вам потребуется предпринять дополнительные шаги для настройки запланированных заданий. Поскольку Cloud Scheduler не может напрямую запускать задания в пределах периметра VPC SC, вам потребуется проксировать запрос через другой компонент. В качестве прокси-сервера мы рекомендуем использовать сервис Cloud Run.

Архитектура выглядит следующим образом:

Схема облачного планировщика, запускающего службу Cloud Run, выполняющую задание Cloud Run

Что вы узнаете

  • Как запустить задание Cloud Run по расписанию внутри периметра VPC SC
  • Как создать службу Cloud Run, запускающую задание Cloud Run, с помощью клиентских библиотек Cloud Run
  • Как настроить Cloud Scheduler для запуска службы Cloud Run по расписанию

2. Прежде чем начать

Сначала убедитесь, что вы выполнили действия по настройке Cloud Run для управления услугами VPC .

Затем установите переменные среды, которые будут использоваться в этой лаборатории кода.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION>
AR_REPO=sample-job-repo
CLOUD_RUN_SERVICE=job-runner-service
CLOUD_RUN_JOB=sample-job
CLOUD_SCHEDULER=job-scheduler
SERVICE_ACCOUNT="cloud-run-invoker-sa"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
NETWORK=default
SUBNET=default

3. Создайте задание Cloud Run.

В этой лаборатории кода используется образец контейнера заданий Cloud Run.

Сначала создайте репозиторий реестра артефактов для контейнера заданий Cloud Run.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

Затем скопируйте образец контейнера заданий Cloud Run в реестр артефактов в проекте, настроенном VPC SC. Для этого вы можете использовать инструмент gcrane , следуя этим инструкциям по установке . Подробнее о gcrane можно узнать в документации по копированию образов между репозиториями .

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

Во-вторых, разверните задание Cloud Run, на которое распространяется жалоба на средства управления услугами VPC .

gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic

Для получения дополнительной информации о создании заданий выполните действия, перечисленные здесь в документации по заданиям Cloud Run .

4. Создайте учетную запись службы.

Эта учетная запись службы будет использоваться Cloud Run для вызова задания Cloud Run.

Сначала создайте учетную запись службы, выполнив следующую команду:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

Во-вторых, предоставьте сервисному аккаунту роль Cloud Run Invoker и Cloud Run Viewer.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.viewer

5. Создайте сервис Cloud Run.

На этом этапе вы развернете службу Cloud Run, которая будет действовать как прокси-сервер.

mkdir job-runner-service && cd $_

Создайте файл main.py со следующим кодом.

import os
from flask import Flask
app = Flask(__name__)

# pip install google-cloud-run
from google.cloud import run_v2

@app.route('/')
def hello():

    client = run_v2.JobsClient()

    # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
    job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' 

    print("Triggering job...")
    request = run_v2.RunJobRequest(name=job_name)
    operation = client.run_job(request=request)
    response = operation.result()

    print(response)
    return "Done!"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Создайте файл с именем requirements.txt со следующим кодом.

google-cloud-run
flask

Наконец, создайте Dockerfile .

FROM python:3.9-slim-buster
# for logging purposes
ENV PYTHONUNBUFFERED=True

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

Затем создайте контейнер, используя следующие команды Docker. Обратите внимание, что развертывание на основе исходного кода может оказаться затруднительным в настройке в среде VPC SC. Если у вас есть существующий конвейер сборки и развертывания, используйте его для сборки исходного кода в контейнер и развертывания контейнера как службы Cloud Run.

docker build -t $CLOUD_RUN_SERVICE .

docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

Теперь разверните службу Cloud Run, на которую распространяется жалоба на средства управления службами VPC .

gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \
 --service-account $SERVICE_ACCOUNT_ADDRESS \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic \
 --no-allow-unauthenticated \
 --ingress internal

Сохраните URL-адрес конечной точки службы, выполнив следующую команду:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. Создайте задание облачного расписания для запуска службы.

# create the Cloud Scheduler job
gcloud scheduler jobs create http $CLOUD_SCHEDULER \
  --location=$REGION \
  --schedule="0 0 1 * *" \
  --uri=$SERVICE_URL \
  --http-method=GET \
  --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS

После создания задания облачного планировщика вы можете запустить следующую команду, чтобы немедленно запустить задание облачного планировщика в целях тестирования:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

ПРИМЕЧАНИЕ:

Возможно, вам придется подождать пару минут, пока выполнение задания завершится. Отследить его статус можно на странице Cloud Run Scheduler .

Убедитесь, что задание Cloud Run выполнено успешно, выполнив следующие команды:

EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)')

gcloud run jobs executions describe $EXECUTION_NAME --region $REGION

и вы должны увидеть что-то похожее на следующее:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. Поздравляем!

Поздравляем с завершением работы над кодом!

Что мы рассмотрели

  • Как запустить задание Cloud Run по расписанию внутри периметра VPC SC
  • Как создать службу Cloud Run, запускающую задание Cloud Run, с помощью клиентских библиотек Cloud Run
  • Как настроить Cloud Scheduler для запуска службы Cloud Run по расписанию

8. Очистка

Чтобы избежать непреднамеренных расходов (например, если службы Cloud Run по неосторожности вызываются больше раз, чем ежемесячно выделено количество вызовов Cloud Run на уровне бесплатного пользования), вы можете либо удалить службы GCP, либо удалить проект, созданный на шаге 2.

Чтобы удалить службу Cloud Run и задание Cloud Run, перейдите в облачную консоль Cloud Run по адресу https://console.cloud.google.com/run и удалите службу.

Если вы решите удалить весь проект, вы можете перейти на https://console.cloud.google.com/cloud-resource-manager , выбрать проект, созданный на шаге 2, и нажать «Удалить». Если вы удалите проект, вам придется изменить проекты в Cloud SDK. Вы можете просмотреть список всех доступных проектов, запустив gcloud projects list .