Come pianificare un job Cloud Run all'interno di un perimetro dei Controlli di servizio VPC

1. Introduzione

Panoramica

Se il tuo progetto GCP si trova all'interno di un perimetro VPC SC, dovrai eseguire passaggi aggiuntivi per configurare i job pianificati. Poiché Cloud Scheduler non può attivare direttamente i job all'interno dei perimetri di VPC SC, devi eseguire il proxy della richiesta tramite un altro componente. Ti consigliamo di utilizzare un servizio Cloud Run come proxy.

L'architettura ha questo aspetto:

Diagramma di Cloud Scheduler che attiva un servizio Cloud Run che esegue un job Cloud Run

Cosa imparerai a fare

  • Come eseguire un job Cloud Run in base a una pianificazione all'interno di un perimetro SC VPC
  • Come creare un servizio Cloud Run che attiva un job Cloud Run utilizzando le librerie client Cloud Run
  • Come configurare Cloud Scheduler per richiamare un servizio Cloud Run in base a una pianificazione

2. Prima di iniziare

Innanzitutto, assicurati di aver seguito i passaggi per configurare Cloud Run per i Controlli di servizio VPC.

A questo punto, imposta le variabili di ambiente che verranno utilizzate durante questo codelab.

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. Crea il job Cloud Run

Questo codelab utilizza il container di esempio dei job Cloud Run.

Innanzitutto, crea un repository Artifact Registry per il container del job Cloud Run.

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

Successivamente, copia il contenitore di esempio dei job Cloud Run in un Artifact Registry all'interno del progetto configurato con VPC SC. Per farlo, puoi utilizzare lo strumento gcrane seguendo queste istruzioni di installazione. Puoi scoprire di più su gcrane nella documentazione sulla copia delle immagini tra repository.

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

Secondo, esegui il deployment del job Cloud Run conforme ai Controlli di servizio 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

Per ulteriori informazioni sulla creazione di job, segui i passaggi elencati qui nella documentazione di Cloud Run Jobs.

4. Creare un service account

Questo service account verrà utilizzato da Cloud Run per chiamare il job Cloud Run.

Innanzitutto, crea il service account eseguendo questo comando:

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

In secondo luogo, concedi i ruoli Invoker di Cloud Run e Visualizzatore di Cloud Run al service account.

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. Crea il servizio Cloud Run

In questo passaggio, eseguirai il deployment di un servizio Cloud Run che funge da proxy.

mkdir job-runner-service && cd $_

Crea un file denominato main.py con il seguente codice.

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

Crea un file denominato requirements.txt con il seguente codice.

google-cloud-run
flask

Infine, crea un 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"]

Successivamente, crea il container utilizzando i seguenti comandi Docker. Tieni presente che le implementazioni basate sull'origine possono essere difficili da configurare in un ambiente VPC SC. Se hai una pipeline di build e deployment esistente, utilizzala per creare il codice sorgente in un container ed eseguire il deployment del container come servizio 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

Ora esegui il deployment del servizio Cloud Run conforme ai Controlli di servizio 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

Salva l'URL dell'endpoint di servizio eseguendo questo comando:

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

6. Crea un job Cloud Scheduler per attivare il servizio

# 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

Una volta creato il job Cloud Scheduler, puoi eseguire il comando seguente per eseguirlo immediatamente a scopo di test:

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

NOTA:

Potrebbe essere necessario attendere un paio di minuti per il completamento dell'esecuzione del job. Puoi monitorare il suo stato nella pagina Cloud Run Scheduler.

Verifica che il job Cloud Run sia stato eseguito correttamente eseguendo questi comandi:

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

e dovresti visualizzare un risultato simile al seguente:

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

7. Complimenti!

Congratulazioni per aver completato il codelab.

Argomenti trattati

  • Come eseguire un job Cloud Run in base a una pianificazione all'interno di un perimetro SC VPC
  • Come creare un servizio Cloud Run che attiva un job Cloud Run utilizzando le librerie client Cloud Run
  • Come configurare Cloud Scheduler per richiamare un servizio Cloud Run in base a una pianificazione

8. Esegui la pulizia

Per evitare addebiti involontari (ad esempio, se i servizi Cloud Run vengono richiamati inavvertitamente più volte rispetto all'allocazione mensile di chiamate di Cloud Run nel livello senza costi), puoi eliminare i servizi GCP o il progetto che hai creato nel passaggio 2.

Per eliminare il servizio Cloud Run e il job Cloud Run, vai alla console Cloud Run all'indirizzo https://console.cloud.google.com/run ed elimina il servizio.

Se scegli di eliminare l'intero progetto, puoi andare alla pagina https://console.cloud.google.com/cloud-resource-manager, selezionare il progetto che hai creato nel passaggio 2 e scegliere Elimina. Se elimini il progetto, dovrai cambiare progetto in Cloud SDK. Puoi visualizzare l'elenco di tutti i progetti disponibili eseguendo gcloud projects list.