Jak zaplanować zadanie Cloud Run w obrębie granicy Ustawień usługi VPC

1. Wprowadzenie

Omówienie

Jeśli Twój projekt GCP znajduje się w perymetrze ustawień usługi VPC, musisz wykonać dodatkowe czynności, aby skonfigurować zaplanowane zadania. Ponieważ Cloud Scheduler nie może bezpośrednio uruchamiać zadań w perymetrze usługi szyfrowanej w VPC, musisz przekazać żądanie przez inny komponent. Zalecamy użycie usługi Cloud Run jako tego serwera proxy.

Architektura wygląda tak:

Diagram przedstawiający uruchamianie przez Cloud Scheduler usługi Cloud Run, która wykonuje zadanie Cloud Run

Czego się nauczysz

  • Jak uruchomić zadanie Cloud Run zgodnie z harmonogramem w obrębie obszaru VPC SC
  • Jak utworzyć usługę Cloud Run, która uruchamia zadanie Cloud Run za pomocą bibliotek klienta Cloud Run
  • Jak skonfigurować Cloud Scheduler, aby wywoływał usługę Cloud Run zgodnie z harmonogramem

2. Zanim zaczniesz

Najpierw upewnij się, że wykonałeś(-aś) czynności konfigurowania Cloud Run do obsługi Ustawień usługi VPC.

Następnie ustaw zmienne środowiskowe, których będziesz używać w tym ćwiczeniu.

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. Tworzenie zadania Cloud Run

Ten warsztat programistyczny korzysta z przykładowego kontenera zadań Cloud Run.

Najpierw utwórz repozytorium Artifact Registry dla kontenera zadania Cloud Run.

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

Następnie skopiuj przykładowy kontener zadań Cloud Run do repozytorium Artifact Registry w projekcie z konfiguracją SC w VPC. Aby to zrobić, możesz użyć narzędzia gcrane, postępując zgodnie z instrukcjami instalacji. Więcej informacji o gcrane znajdziesz w dokumentacji dotyczącej kopiowania obrazów między repozytoriami.

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

Po drugie, wdróż zadanie Cloud Run, które jest zgodne z ustawieniami usługi 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

Aby dowiedzieć się więcej o tworzeniu zadań, wykonaj czynności opisane w dokumentacji zadań Cloud Run.

4. Tworzenie konta usługi

To konto usługi będzie używane przez Cloud Run do wywołania zadania Cloud Run.

Najpierw utwórz konto usługi, uruchamiając to polecenie:

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

Po drugie, przypisz do konta usługi rolę wywołującego Cloud Run i rolę przeglądającego Cloud Run.

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. Tworzenie usługi Cloud Run

W tym kroku wdrożysz usługę Cloud Run, która działa jako serwer pośredniczący.

mkdir job-runner-service && cd $_

Utwórz plik o nazwie main.py z tym kodem.

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)))

Utwórz plik o nazwie requirements.txt z podanym niżej kodem.

google-cloud-run
flask

Na koniec utwórz 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"]

Następnie utwórz kontener za pomocą tych poleceń dockera. Pamiętaj, że wdrożenia oparte na źródle mogą być trudne do skonfigurowania w środowisku VPC SC. Jeśli masz już potok kompilacji i wdrażania, użyj go do skompilowania kodu źródłowego w kontenerze i wdrożenia tego kontenera jako usługi 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

Teraz wdróż usługę Cloud Run, która jest zgodna z ustawieniami usługi 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

Zapisz adres URL punktu końcowego usługi, uruchamiając to polecenie:

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

6. Utwórz zadanie Cloud Scheduler, aby uruchomić usługę

# 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

Po utworzeniu zadania Cloud Scheduler możesz uruchomić je natychmiast w celu przetestowania, wykonując to polecenie:

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

UWAGA:

Możesz musieć poczekać kilka minut na zakończenie wykonania zadania. Stan możesz śledzić na stronie harmonogramu Cloud Run.

Aby sprawdzić, czy zadanie Cloud Run zostało uruchomione, uruchom te polecenia:

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

Powinieneś zobaczyć coś podobnego do tego:

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

7. Gratulacje!

Gratulujemy ukończenia ćwiczenia.

Omówione zagadnienia

  • Jak uruchomić zadanie Cloud Run zgodnie z harmonogramem w obrębie obszaru VPC SC
  • Jak utworzyć usługę Cloud Run, która uruchamia zadanie Cloud Run za pomocą bibliotek klienta Cloud Run
  • Jak skonfigurować Cloud Scheduler, aby wywoływał usługę Cloud Run zgodnie z harmonogramem

8. Czyszczenie danych

Aby uniknąć przypadkowych opłat (np. jeśli usługi Cloud Run są przypadkowo wywoływane więcej razy niż w ramach miesięcznego limitu wywołań usługi Cloud Run w ramach poziomu bezpłatnego), możesz usunąć usługi GCP lub projekt utworzony w kroku 2.

Aby usunąć usługę i zadanie Cloud Run, otwórz Cloud Run w konsoli Cloud na stronie https://console.cloud.google.com/run i usuń usługę.

Jeśli chcesz usunąć cały projekt, otwórz stronę https://console.cloud.google.com/cloud-resource-manager, wybierz projekt utworzony w kroku 2 i kliknij Usuń. Jeśli usuniesz projekt, musisz zmienić projekty w Cloud SDK. Aby wyświetlić listę wszystkich dostępnych projektów, uruchom gcloud projects list.