cloud-run-static-outbound-ip

Par divinevideo · divine-mobile

Configurez des adresses IP sortantes statiques pour les jobs/services Google Cloud Run. À utiliser lorsque : (1) un service externe doit mettre votre IP en liste blanche (archive.org, APIs, pare-feux), (2) les requêtes Cloud Run proviennent d'IPs aléatoires ou changeantes, (3) vous avez besoin d'une IP source cohérente pour des crawlers, scrapers ou clients API tournant sur Cloud Run. Nécessite un connecteur VPC + Cloud NAT + réservation d'IP statique. Fonctionne pour les services et les jobs Cloud Run.

npx skills add https://github.com/divinevideo/divine-mobile --skill cloud-run-static-outbound-ip

Adresse IP sortante statique Cloud Run

Problème

Cloud Run utilise un pool partagé d'adresses IP sortantes dynamiques qui changent fréquemment et sont partagées entre tous les clients Google Cloud. Quand des services externes doivent mettre en liste blanche votre IP (pour les exemptions de limite de débit, les règles de pare-feu ou l'accès spécial), vous avez besoin d'une IP sortante statique et prévisible.

Contexte / Conditions déclencheurs

  • Un service externe demande une adresse IP à mettre en liste blanche
  • Les requêtes Cloud Run sont bloquées par une limitation de débit basée sur l'IP
  • Besoin d'identifier votre trafic vers des API externes
  • Exécution de crawlers/scrapers qui ont besoin d'une IP source cohérente
  • Messages d'erreur du type « IP non autorisée » ou similaire

Solution

Architecture

Cloud Run → VPC Connector → Réseau VPC → Cloud NAT (IP statique) → Internet

Étape 1 : Réserver une adresse IP statique

gcloud compute addresses create [NAME]-nat-ip \
  --region=[REGION] \
  --description="Static IP for Cloud Run outbound traffic"

# Récupérer l'adresse IP réelle
gcloud compute addresses describe [NAME]-nat-ip \
  --region=[REGION] \
  --format="value(address)"

Étape 2 : Créer un routeur Cloud

gcloud compute routers create [NAME]-router \
  --network=default \
  --region=[REGION]

Étape 3 : Créer Cloud NAT avec IP statique

gcloud compute routers nats create [NAME]-nat \
  --router=[NAME]-router \
  --region=[REGION] \
  --nat-external-ip-pool=[NAME]-nat-ip \
  --nat-all-subnet-ip-ranges

Étape 4 : Activer l'API VPC Access

gcloud services enable vpcaccess.googleapis.com

Étape 5 : Créer un connecteur VPC Access serverless

gcloud compute networks vpc-access connectors create [NAME]-connector \
  --region=[REGION] \
  --network=default \
  --range=10.8.0.0/28 \
  --min-instances=2 \
  --max-instances=3 \
  --machine-type=e2-micro

Remarque : La plage IP ne doit pas entrer en conflit avec les sous-réseaux existants. Utilisez un bloc CIDR /28.

Étape 6 : Mettre à jour Cloud Run pour utiliser le connecteur VPC

Pour les Cloud Run Jobs :

gcloud run jobs deploy [JOB-NAME] \
  --image=[IMAGE] \
  --region=[REGION] \
  --vpc-connector=[NAME]-connector \
  --vpc-egress=all-traffic \
  [... other flags ...]

Pour les Cloud Run Services :

gcloud run deploy [SERVICE-NAME] \
  --image=[IMAGE] \
  --region=[REGION] \
  --vpc-connector=[NAME]-connector \
  --vpc-egress=all-traffic \
  [... other flags ...]

Critique : --vpc-egress=all-traffic est obligatoire pour acheminer TOUT le trafic sortant à travers le VPC/NAT. Sans cela, seul le trafic vers les IP internes utilise le connecteur.

Vérification

Tester que le trafic sortant utilise l'IP statique :

# Exécuter un conteneur qui vérifie son IP externe
gcloud run jobs execute [JOB-NAME] --region=[REGION] \
  --args="curl,-s,https://api.ipify.org"

Ou ajouter un endpoint de test à votre service qui appelle un service d'écho IP.

Exemple : Script de configuration complète

#!/bin/bash
set -e

PROJECT_ID="my-project"
REGION="us-central1"
NAME="my-crawler"

# Réserver une IP statique
gcloud compute addresses create ${NAME}-nat-ip --region=$REGION

# Récupérer et afficher l'IP
STATIC_IP=$(gcloud compute addresses describe ${NAME}-nat-ip \
  --region=$REGION --format="value(address)")
echo "Static IP: $STATIC_IP"

# Créer le routeur
gcloud compute routers create ${NAME}-router \
  --network=default --region=$REGION

# Créer le NAT
gcloud compute routers nats create ${NAME}-nat \
  --router=${NAME}-router \
  --region=$REGION \
  --nat-external-ip-pool=${NAME}-nat-ip \
  --nat-all-subnet-ip-ranges

# Activer l'API et créer le connecteur
gcloud services enable vpcaccess.googleapis.com
gcloud compute networks vpc-access connectors create ${NAME}-connector \
  --region=$REGION \
  --network=default \
  --range=10.8.0.0/28 \
  --min-instances=2 \
  --max-instances=3 \
  --machine-type=e2-micro

echo "Setup complete! Use these flags in Cloud Run deployments:"
echo "  --vpc-connector=${NAME}-connector"
echo "  --vpc-egress=all-traffic"
echo ""
echo "Static IP for whitelisting: $STATIC_IP"

Considérations de coût

  • IP statique : Gratuite en usage, ~7 $/mois si réservée mais inutilisée
  • Connecteur VPC : ~7-20 $/mois (minimum 2-3 instances e2-micro)
  • Cloud NAT : ~1 $/mois + 0,045 $/Go traité

Total : ~10-30 $/mois selon le volume de trafic.

Remarques

  • Toutes les instances/jobs Cloud Run utilisant le même connecteur VPC partagent l'IP statique
  • Vous pouvez mettre à l'échelle Cloud Run horizontalement sans changer les IP
  • Le connecteur VPC a des limites de débit (~200-1000 Mbps selon le nombre d'instances)
  • Pour les besoins de haut débit, augmentez max-instances sur le connecteur
  • Les connexions Cloud SQL n'ont pas besoin de passer par NAT (utilisez le connecteur Cloud SQL à la place)
  • Le connecteur VPC ajoute ~1-5 ms de latence aux requêtes

Nettoyage

Pour supprimer la configuration :

gcloud compute networks vpc-access connectors delete ${NAME}-connector --region=$REGION
gcloud compute routers nats delete ${NAME}-nat --router=${NAME}-router --region=$REGION
gcloud compute routers delete ${NAME}-router --region=$REGION
gcloud compute addresses delete ${NAME}-nat-ip --region=$REGION

Références

Skills similaires