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

Что вы узнаете
- Как запустить задание Cloud Run по расписанию внутри периметра VPC SC
- Как создать службу Cloud Run, которая запускает задание Cloud Run с помощью клиентских библиотек Cloud Run.
- Как настроить Cloud Scheduler для запуска службы Cloud Run по расписанию
2. Прежде чем начать
Для начала убедитесь, что вы выполнили все шаги по настройке Cloud Run for VPC Service Controls .
Далее установите переменные окружения, которые будут использоваться на протяжении всего этого практического занятия.
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.
Сначала создайте репозиторий Artifact Registry для контейнера задания 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 Service Controls .
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 Service Controls .
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. Создайте задание Cloud Schedule для запуска сервиса.
# 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 .