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 для управления услугами 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
.