Accès privé Cloud Run au point de terminaison mondial et au point de terminaison régional Cloud Storage

1. Introduction

Point de terminaison de l'API Google

Les API Google Cloud proposent différents types de points de terminaison pour accéder aux services. Elles diffèrent principalement par la façon dont elles gèrent le routage des requêtes, la résidence des données et l'isolation régionale.

Veuillez consulter la documentation produit sur les types de points de terminaison d'API.

Voici une présentation des points de terminaison mondiaux, régionaux et localisés :

  1. Points de terminaison globaux
  • Format : {service}.googleapis.com (par exemple, storage.googleapis.com)
  • Description : Ces points de terminaison fournissent un point d'accès unique et mondial à un service. Ils ne spécifient pas de région dans l'URL.
  • Routage : les requêtes sont routées par les Google Front Ends (GFE) et l'équilibrage de charge de service global, qui dirigent généralement le trafic vers la région opérationnelle la plus proche pour minimiser la latence.
  • Terminaison TLS : elle a lieu au niveau du GFE le plus proche du client, qui peut se trouver en dehors de la région Google Cloud où résident les données ou les ressources.
  • Résidence des données : aucune garantie n'est fournie pour les données en transit. Les données peuvent franchir les limites régionales après avoir été déchiffrées au niveau de la GFE.
  • Isolation régionale : limitée. Bien que les backends soient souvent régionaux, le point d'entrée et l'équilibrage de charge sont globaux. Cela signifie que les problèmes rencontrés dans une partie de l'infrastructure mondiale peuvent potentiellement avoir un impact sur les services d'autres régions.
  • Cas d'utilisation : accès à usage général où la faible latence pour les utilisateurs dispersés géographiquement est essentielle, et où la résidence stricte des données en transit n'est pas une préoccupation majeure.
  1. Points de terminaison régionaux (REP)
  • Format : {service}.{location}.rep.googleapis.com (par exemple, storage.us-east1.rep.googleapis.com)
  • Description : elles sont conçues pour offrir une forte isolation régionale et des garanties de résidence des données. L'emplacement (une région Google Cloud spécifique) est spécifié en tant que sous-domaine. Il s'agit de la norme moderne qui remplace les points de terminaison de localisation.
  • Routage : utilise une pile de frontend entièrement régionalisée, y compris les équilibreurs de charge externes régionaux et l'équilibrage de charge de service régional . L'intégralité du chemin d'accès de la requête, du DNS au backend du service, reste dans la région spécifiée.
  • Terminaison TLS : se produit dans la région spécifiée sur les équilibreurs de charge externes régionaux.
  • Résidence des données : garantit que les données restent dans la région désignée, à la fois en transit et en cours d'utilisation, ce qui répond aux exigences strictes de conformité et de souveraineté.
  • Isolation régionale : forte. Les défaillances de l'infrastructure de l'interface utilisateur d'une région n'ont pas d'incidence sur les autres régions.
  • Cas d'utilisation : applications nécessitant une résidence stricte des données, une isolation régionale élevée et la conformité.

Veuillez noter que toutes les API Google ne disposent pas d'un point de terminaison régional. Pour connaître tous les points de terminaison régionaux compatibles, cliquez ici.

Les points de terminaison régionaux multirégionaux (mREP) sont également des points de terminaison régionaux, comme us (États-Unis), eu (Union européenne), etc. (par exemple, storage.us.rep.googleapis.com).

  1. Points de terminaison de localisation (LEP)
  • Format : {location}-{service}.googleapis.com (par exemple, us-east1-storage.googleapis.com)
  • Description : ces points de terminaison étaient une approche antérieure pour fournir un accès spécifique à un lieu. L'emplacement fait partie du nom d'hôte principal. Remarque : Les points de terminaison localisés sont remplacés par les points de terminaison régionaux.
  • Routage : il repose toujours sur les frontaux Google mondiaux.
  • Terminaison TLS : elle se produit généralement au niveau du GFE, qui peut ne pas se trouver dans la région spécifiée dans le nom d'hôte.
  • Résidence des données : impossible de garantir que les données restent dans la région spécifiée pendant le transit pour le trafic provenant de l'Internet public.
  • Isolation régionale : moins efficace que les points de terminaison régionaux, car elle utilise une infrastructure d'interface mondiale.
  • Cas d'utilisation : historiquement utilisé pour certains scénarios d'accès régionaux, mais généralement déconseillé au profit des points de terminaison régionaux pour des garanties plus solides.

Private Service Connect pour les API Google

Private Service Connect est une fonctionnalité de mise en réseau de Google Cloud qui permet aux clients d'accéder aux services des producteurs. Cela inclut la possibilité de se connecter aux API Google via un point de terminaison privé hébergé dans le VPC de l'utilisateur.

Voici comment utiliser un point de terminaison PSC pour accéder à l'API Google :

Utiliser un backend PSC pour accéder à l'API Google :

Cloud Run envoie du trafic au réseau VPC

La sortie directe du VPC apporte une infrastructure améliorée et une configuration de sortie VPC plus simple à Cloud Run, y compris les avantages suivants :

  • Configuration : les services et les jobs Cloud Run peuvent envoyer du trafic vers un réseau VPC sans avoir à gérer de connecteur d'accès au VPC sans serveur.
  • Coût : vous ne payez que pour les frais de trafic réseau, qui évoluent à zéro instance comme le service lui-même.
  • Sécurité : vous pouvez utiliser des tags réseau directement sur les révisions de service pour une sécurité réseau plus précise.
  • Performances: une latence plus faible, un débit plus élevé.

Vous pouvez activer votre service, votre fonction, votre job ou votre pool de nœuds de calcul Cloud Run pour envoyer tout le trafic vers un réseau VPC à l'aide de la sortie VPC directe.

2. Points abordés

  • Comment créer un point de terminaison PSC pour l'API Google mondiale.
  • Comment créer un point de terminaison PSC pour une API Google régionale
  • Découvrez comment modifier le point de terminaison de l'API dans le code Cloud Run et configurer la mise en réseau pour le trafic sortant.

3. Architecture globale de l'atelier

8f5328678688f210.png

4. Étapes de préparation

Rôles IAM requis pour effectuer l'atelier

Commencez par attribuer les rôles IAM requis au compte GCP au niveau du projet.

  • Administrateur de réseaux Compute (roles/compute.networkAdmin) : ce rôle vous permet de contrôler entièrement les ressources réseau Compute Engine.
  • Administrateur Logging (roles/logging.admin) : ce rôle vous donne accès à toutes les autorisations de Logging et aux autorisations associées.
  • Administrateur d'utilisation du service (roles/serviceusage.serviceUsageAdmin) : ce rôle vous permet d'activer, de désactiver et d'inspecter les états de service, d'inspecter les opérations, et de consommer les quotas et la facturation pour un projet destiné à un consommateur.
  • Administrateur DNS (roles/dns.admin) : ce rôle vous permet d'accéder en lecture/écriture à toutes les ressources Cloud DNS.
  • Administrateur Cloud Run (roles/run.admin) : ce rôle vous permet de contrôler entièrement toutes les ressources Cloud Run.
  • Administrateur de l'espace de stockage (roles/storage.admin) : ce rôle vous permet de contrôler entièrement les objets et les buckets.

Activer les API

Dans Cloud Shell, assurez-vous que votre projet est correctement configuré et définissez vos variables d'environnement.

Dans Cloud Shell, procédez comme suit :

gcloud auth login
gcloud config set project <your project id>
export project_id=<your project id>
export region=<your region>
export zone=$region-a
echo $project_id
echo $region

Activez toutes les API Google nécessaires dans le projet. Dans Cloud Shell, procédez comme suit :

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com \
  compute.googleapis.com \
  dns.googleapis.com \
  servicedirectory.googleapis.com \
  networkconnectivity.googleapis.com

Créer un VPC

Dans le projet, créez un réseau VPC avec un mode de sous-réseau personnalisé. Dans Cloud Shell, procédez comme suit :

gcloud compute networks create mynet \
    --subnet-mode=custom

Créer des sous-réseaux

Dans Cloud Shell, procédez comme suit pour créer un sous-réseau IPv4 :

gcloud compute networks subnets create mysubnet \
    --network=mynet \
    --range=10.0.0.0/24 \
    --region=$region

Créer Cloud NAT et Cloud Router

Cloud NAT permet aux jobs Cloud Run de se connecter à des sites Web externes.

gcloud compute routers create $region-cr \
   --network=mynet \
   --region=$region 
gcloud compute routers nats create $region-nat \
    --router=$region-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

5. Créer un point de terminaison PSC pour Cloud Storage

Vous allez créer deux points de terminaison PSC pour Cloud Storage : l'un pour le champ d'application mondial et l'autre pour le champ d'application régional.

Créer un point de terminaison PSC de portée globale

Avec Private Service Connect, vous pouvez créer des points de terminaison privés à portée mondiale à l'aide d'adresses IP internes globales dans votre réseau VPC.

Vous devrez allouer une adresse IP unique qui n'est pas définie dans votre VPC. Veuillez consulter le document sur les exigences relatives aux adresses IP.

Dans Cloud Shell, procédez comme suit pour créer une adresse IP. Veuillez remplacer "–addresses=<pscendpointip>" par l'adresse IP que vous avez attribuée.

gcloud compute addresses create pscglobalip \
    --global \
    --purpose=PRIVATE_SERVICE_CONNECT \
    --addresses=<pscendpointip> \
    --network=mynet
pscendpointip=$(gcloud compute addresses list --filter=name:pscglobalip --format="value(address)")
echo $pscendpointip

Créez une règle de transfert pour connecter le point de terminaison aux API et services Google.

gcloud compute forwarding-rules create pscendpoint \
    --global \
    --network=mynet \
    --address=pscglobalip \
    --target-google-apis-bundle=all-apis

Vérifier p.googleapis.com dans Cloud DNS

Lorsque vous créez un point de terminaison, les configurations DNS suivantes sont automatiquement créées :

Les points de terminaison globaux sont enregistrés dans l'Annuaire des services. Vous utiliserez storage-[nom du point de terminaison PSC].p.googleapis.com pour accéder à Cloud Storage. Pour en savoir plus, consultez la documentation sur les produits.

Vérifiez si la zone p.googleaps.com est déjà créée en exécutant la commande.

gcloud dns managed-zones list

Si vous souhaitez utiliser le nom DNS par défaut, storage.googleapis.com, vous devez créer une zone privée storage.googleapis.com dans Cloud DNS et ajouter un enregistrement apex qui pointe vers le point de terminaison PSC de l'adresse IP à portée globale.

Créer un point de terminaison PSC de portée régionale pour Cloud Storage

Vous aurez besoin d'une adresse IP du sous-réseau VPC. Exécutez la commande ci-dessous. Une adresse IP du sous-réseau sera attribuée au point de terminaison PSC.

gcloud network-connectivity regional-endpoints create psc-regional-endpoint \
    --region=$region \
    --network=projects/$project_id/global/networks/mynet \
    --subnetwork=projects/$project_id/regions/$region/subnetworks/mysubnet \
    --target-google-api=storage.us-central1.rep.googleapis.com

Obtenez l'adresse IP du point de terminaison créé à l'étape ci-dessus.

regionalip=$(gcloud network-connectivity regional-endpoints describe psc-regional-endpoint --region=$region --format="value(address)")
echo $regionalip

Vous utiliserez storage.us-central1.rep.googleapis.com pour accéder à Cloud Storage. Vous devez créer une zone privée pour storage.us-central1.rep.googleapis.com et l'enregistrement apex de l'adresse IP que vous venez de créer pour le point de terminaison régional dans Cloud DNS.

Créer une zone privée pour le point de terminaison régional Cloud Storage

Vous utiliserez storage.[nom de la région].rep.googleapis.com pour accéder au point de terminaison régional Cloud Storage.

Vous devrez créer une zone privée dans Cloud DNS et ajouter un enregistrement de domaine racine qui pointe vers l'adresse IP du point de terminaison régional Cloud Storage.

Dans la commande ci-dessous, "us-central1" est la région d'exemple. Vous devez créer la zone avec le nom de votre région.

gcloud dns managed-zones create psc-regional-endpoint-zone \
  --description="" \
  --dns-name="storage.us-central1.rep.googleapis.com" \
  --visibility="private" \
  --networks="mynet"

gcloud dns record-sets create storage.us-central1.rep.googleapis.com. \
  --rrdatas=$regionalip \
  --ttl=300 \
  --type=A \
  --zone=psc-regional-endpoint-zone

6. Configurer un job Cloud Run avec un point de terminaison PSC de portée globale

Obtenir le code

Vous allez d'abord explorer une application Node.js pour faire des captures d'écran de pages Web et les stocker dans Cloud Storage. Vous allez ensuite créer une image de conteneur pour l'application et l'exécuter en tant que tâche sur Cloud Run.

Dans Cloud Shell, exécutez la commande suivante pour cloner le code de l'application à partir de ce dépôt :

git clone https://github.com/GoogleCloudPlatform/jobs-demos.git

Accédez au répertoire contenant l'application :

cd jobs-demos/screenshot

Les fichiers devraient se présenter comme ceci :

|

├── Dockerfile

├── README.md

├── screenshot.js

├── package.json

Voici une brève description de chacun d'eux :

  • screenshot.js contient le code Node.js de l'application. L'application prend des captures d'écran de pages Web et les stocke dans Cloud Storage.
  • package.json définit les dépendances de la bibliothèque.
  • Le fichier Dockerfile définit l'image du conteneur.

Ouvrez le code screenshot.js et remplacez apiEndpoint par le point de terminaison mondial PSC. Recherchez le code et remplacez const storage = new Storage(); par ce qui suit :

const storage = new Storage(
    {
      apiEndpoint:'https://storage-pscendpoint.p.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Déployer un job

Avant de créer une tâche, vous devez créer le compte de service que vous utiliserez pour l'exécuter.

gcloud iam service-accounts create screenshot-sa --display-name="Screenshot app service account"

Attribuez le rôle storage.admin au compte de service afin de pouvoir l'utiliser pour créer des buckets et des objets.

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.admin \
  --member serviceAccount:screenshot-sa@$project_id.iam.gserviceaccount.com

Attribuez les rôles Utilisateur d'objets Storage , Rédacteur de journaux et Administrateur du dépôt Artifact Registry au compte de service Compute par défaut.

project_number=$(gcloud projects describe $project_id --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $project_id \
  --role roles/storage.objectUser \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/logging.logWriter \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

gcloud projects add-iam-policy-binding $project_id \
  --role roles/artifactregistry.repoAdmin \
  --member serviceAccount:$project_number-compute@developer.gserviceaccount.com

Vous allez activer la sortie VPC directe pour les jobs Cloud Run afin d'envoyer tout le trafic vers un réseau VPC.

Dans Cloud Shell, procédez comme suit :

gcloud run jobs deploy screenshot-1 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$project_id-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Exécuter le job

Dans Cloud Shell, procédez comme suit :

gcloud run jobs execute screenshot-1 --region=$region

Vérifiez l'état du job et les journaux. Accédez à la console Cloud Run et recherchez le job. Cliquez sur le job et vérifiez l'historique du journal. Vous verrez un résultat d'exécution de job semblable à celui ci-dessous.

bae25d504ea20384.png

Pour obtenir des journaux d'exécution détaillés, cliquez sur "Afficher le journal" au niveau de la tâche. Des journaux de job semblables à ceux ci-dessous s'affichent.

aa0468dc463f4320.png

Un bucket a été créé. Vous pouvez accéder à la console Cloud Storage et vérifier le nouveau bucket créé. Veuillez noter que lorsque vous utilisez le point de terminaison mondial Cloud Storage, le bucket est un bucket multirégional. Vous pouvez vérifier les images importées dans le bucket.

Le résultat du test affiche le point de terminaison global Cloud Storage auquel Cloud Run accède de manière privée, que vous avez modifié dans le job Cloud Run :

apiEndpoint:‘https://storage-pscendpoint.p.googleapis.com.'

7. Configurer un job Cloud Run avec un point de terminaison PSC de portée régionale

Dans le code, vous allez remplacer apiEndpoint par un point de terminaison PSC avec un champ d'application régional.

Recherchez le code et remplacez const storage = new Storage(); par ce qui suit ( nous utilisons us-central1 comme exemple). Veuillez passer à votre région :

const storage = new Storage(
    {
      apiEndpoint:'https://storage.us-central1.rep.googleapis.com.',
      useAuthWithCustomEndpoint: true
    }
  );

Déployer un job

Assurez-vous de vous trouver dans le répertoire contenant l'application (jobs-demos/screenshot).

pwd

Vous activez la sortie VPC directe pour que les jobs envoient tout le trafic vers un réseau VPC.

Dans Cloud Shell, procédez comme suit :

gcloud run jobs deploy screenshot-2 \
  --source=. \
  --args="https://example.com" \
  --args="https://cloud.google.com" \
  --tasks=2 \
  --task-timeout=5m \
  --region=$region \
  --set-env-vars=BUCKET_NAME=screenshot-$PROJECT_ID-$RANDOM \
  --service-account=screenshot-sa@$project_id.iam.gserviceaccount.com \
  --vpc-egress=all-traffic \
  --network=mynet \
  --subnet=mysubnet

Exécuter le job

Dans Cloud Shell, procédez comme suit :

gcloud run jobs execute screenshot-2 --region=$region

Vérifiez l'état du job et les journaux. Accédez à la console Cloud Run et recherchez le job. Cliquez sur le job et consultez son historique. Vous verrez un résultat d'exécution de job semblable à celui ci-dessous.

1065ce25136d355e.png

Pour afficher les journaux d'exécution détaillés, cliquez sur "Afficher le journal". Des journaux de job semblables à ceux ci-dessous s'affichent.

837afb2f95a7049b.png

Un bucket a été créé. Vous pouvez accéder à la console Cloud Storage et vérifier le nouveau bucket créé. Veuillez noter que lorsque vous utilisez le point de terminaison régional Cloud Storage, le bucket est un bucket à région unique. Vous pouvez vérifier les images importées dans le bucket.

Le résultat du test montre que Cloud Run a accédé de manière privée au point de terminaison régional Cloud Storage que vous avez modifié dans le job Cloud Run :

apiEndpoint:‘https://storage.us-central1.rep.googleapis.com.'

8. Effectuer un nettoyage

Nettoyer le job Cloud Run

gcloud run jobs delete screenshot-1 \
  --region=$region --quiet
gcloud run jobs delete screenshot-2 \
  --region=$region --quiet

gcloud iam service-accounts delete screenshot-sa@$project_id.iam.gserviceaccount.com --quiet

Nettoyer le point de terminaison PSC

gcloud compute forwarding-rules delete pscendpoint \
    --global --quiet
gcloud network-connectivity regional-endpoints delete psc-regional-endpoint \
    --region=$region --quiet
gcloud compute addresses delete pscglobalip \
    --global --quiet

Nettoyer Cloud NAT, Cloud Router et les VPC

gcloud compute routers nats delete $region-nat \
    --router=$region-cr \
    --region=$region --quiet
gcloud compute routers delete $region-cr \
    --region=$region --quiet
gcloud compute networks subnets delete mysubnet \
    --region=$region --quiet
gcloud compute networks delete mynet --quiet

9. Félicitations

Vous avez testé avec succès l'accès privé Cloud Run à Cloud Storage via un point de terminaison mondial et un point de terminaison régional.