Créer un service de backend externe
Sommaire
- 1 Présentation
- 2 Contexte
- 3 Mise en œuvre
- 3.1 Définition des variables
- 3.2 Création du dossier dans l'organisation GCP
- 3.3 Création du projet GCP
- 3.4 Activation de la facturation sur le projet
- 3.5 Activation de l'API compute
- 3.6 Création d'une adresse IP publique
- 3.7 Création d'un certificat géré par Google
- 3.8 Optionnel : Création d'un certificat auto-géré temporaire
- 3.9 Création d'un groupe de points de terminaison externe
- 3.10 Ajout d'un point de terminaison externe
- 3.11 Création d'un service de backend
- 3.12 Ajout d'un backend
- 3.13 Création d'un url-map/équilibreur de charge pour le trafic http (avec redirection https)
- 3.14 Création d'un url-map/équilibreur de charge pour le trafic https
- 3.15 Création du proxy cible pour le trafic http
- 3.16 Création du proxy cible pour le trafic https
- 3.17 Création d'une règle de transfert/pare-feu pour le trafic http
- 3.18 Création d'une règle de transfert/pare-feu pour le trafic https
- 3.19 Optionnel : Action après la validation SSL
Présentation
Cette procédure a pour objet de créer un service de backend externe dans GCP.
Contexte
Cette procédure crée l’exhaustivité des éléments nécessaires à la mise en œuvre d’un backend externe. Il faudra donc, en fonction des besoins, ne pas utiliser les étapes qui sont déjà implémentées (par exemple, un projet déjà créé, un équilibreur de charge existant, etc …).
Mise en œuvre
Définition des variables
export PARENT_FOLDER_ID=123456789 export PROJECT_FOLDER_NAME=my-great-project export PROJECT_STEP=prod export PROJECT_NAME=${PROJECT_FOLDER_NAME}-${PROJECT_STEP} export BILLING_ACCOUNT_ID=123ABC-456DEF-789GHI export REGION=europe-west9
Création du dossier dans l'organisation GCP
gcloud resource-manager folders create \ --display-name=$PROJECT_FOLDER_NAME \ --folder=$PARENT_FOLDER_ID
Variabilisation de l'ID du dossier créé :
export PROJECT_FOLDER_ID=$(gcloud resource-manager folders list \ --folder=$PARENT_FOLDER_ID \ --filter 'displayName='$PROJECT_FOLDER_NAME \ --format="value(ID)")
Création du projet GCP
gcloud projects create $PROJECT_NAME \ --folder=$PROJECT_FOLDER_ID
Il faut patienter quelques instants avant de lancer la commande suivante permettant de variabiliser l'ID du projet créé. En effet, bien que la commande précédente ai rendu la main, le projet n'est pas totalement terminé d'être créé en arrière-plan.
export PROJECT_ID=$(gcloud projects list \ --filter 'name='$PROJECT_NAME \ --format="value(projectId)")
Vérifier que la variable PROJECT_ID
n'est pas vide avec la commande :
echo $PROJECT_ID
Relancer la commande d'export
de la variable et ne pas passer à l'étape suivante tant que la variable est vide.
Activation de la facturation sur le projet
gcloud beta billing projects link ${PROJECT_ID} \ --billing-account=${BILLING_ACCOUNT_ID}
Activation de l'API compute
gcloud services enable compute.googleapis.com \ --project=${PROJECT_ID}
Création d'une adresse IP publique
gcloud compute addresses create ${PROJECT_NAME}-ip \ --network-tier=PREMIUM \ --ip-version=IPV4 \ --global \ --project=${PROJECT_ID}
Optionnel : variabilisation de l'adresse IP créée. Cela peut être utile pour automatiser certaines actions (créer/modifier un enregistrement DNS par exemple).
export IP_ADDRESS=$(gcloud compute addresses describe ${PROJECT_NAME}-ip \ --format="get(address)" \ --global \ --project=${PROJECT_ID})
Création d'un certificat géré par Google
Ce certification se renouvellera automatiquement grâce à Google une fois qu'il sera affecté à un équilibreur de charge et que l'enregistrement DNS de ce certificat pointera vers l'adresse IP de cet équilibreur de charge.
gcloud compute ssl-certificates create ${PROJECT_NAME}-mydomain-cert \ --description="SSL cert for mydomain front" \ --domains=www.mydomain.com,mydomain.com \ --global \ --project=${PROJECT_ID}
Optionnel : Création d'un certificat auto-géré temporaire
En cas de migration d'une URL vers ce nouvel équilibreur de charge, il est sans doute préférable d'assurer la continuité de service du SSL lors de la modification de l'enregistrement DNS. Pour se faire, se procurer le certificat SSL actuel et l'importer dans GCP en tant que certificat "temporaire" (il sera supprimé une fois que la validation SSL du nouveau certificat sera effective).
gcloud compute ssl-certificates create ${PROJECT_NAME}-mydomain-cert-temp \ --certificate=mydomain.com.fullchain.pem \ --private-key=mydomain.com.privkey.pem \ --global \ --project=${PROJECT_ID}
Création d'un groupe de points de terminaison externe
gcloud compute network-endpoint-groups create ${PROJECT_NAME}-my-external-server-neg \ --global \ --network-endpoint-type=INTERNET_IP_PORT \ --default-port=80 \ --project=${PROJECT_ID}
NB : Ce NEG est vide.
Ajout d'un point de terminaison externe
gcloud compute network-endpoint-groups update ${PROJECT_NAME}-my-external-server-neg \ --global \ --add-endpoint=ip=111.222.333.444,port=80 \ --project=${PROJECT_ID}
NB : Ceci est une adresse IP factice.
Création d'un service de backend
gcloud compute backend-services create ${PROJECT_NAME}-my-external-server-be \ --load-balancing-scheme=EXTERNAL \ --enable-logging \ --logging-sample-rate=1 \ --global \ --project=${PROJECT_ID}
NB : Ce service de backend ne contient aucun backend.
Ajout d'un backend
gcloud compute backend-services add-backend ${PROJECT_NAME}-my-external-server-be \ --global \ --network-endpoint-group=${PROJECT_NAME}-my-external-server-neg \ --global-network-endpoint-group \ --project=${PROJECT_ID}
Création d'un url-map/équilibreur de charge pour le trafic http (avec redirection https)
NB : Un url-map est un équilibreur de charge.
Création du fichier
cat <<EOF>/tmp/url.yaml defaultUrlRedirect: httpsRedirect: true redirectResponseCode: MOVED_PERMANENTLY_DEFAULT stripQuery: false kind: compute#urlMap name: ${PROJECT_NAME}-http-to-https-lb EOF
Validation du fichier
gcloud compute url-maps validate \ --source=/tmp/url.yaml \ --project=${PROJECT_ID}
Création par import du fichier
gcloud compute url-maps import ${PROJECT_NAME}-http-to-https-lb \ --source /tmp/url.yaml \ --global \ --project=${PROJECT_ID}
NB : Un url-map n'apparaîtra jamais dans la console GCP tant qu'il n'est pas affecté à un proxy cible.
Création d'un url-map/équilibreur de charge pour le trafic https
gcloud compute url-maps create ${PROJECT_NAME}-my-external-server-lb \ --default-service ${PROJECT_NAME}-my-external-server-be \ --project=${PROJECT_ID}
Création du proxy cible pour le trafic http
gcloud compute target-http-proxies create ${PROJECT_NAME}-http-proxy \ --url-map=${PROJECT_NAME}-http-to-https-lb \ --global \ --project=${PROJECT_ID}
Création du proxy cible pour le trafic https
gcloud compute target-https-proxies create ${PROJECT_NAME}-https-proxy \ --ssl-certificates=${PROJECT_NAME}-mydomain-cert-temp,${PROJECT_NAME}-mydomain-cert \ --url-map=${PROJECT_NAME}-my-external-server-lb \ --project=${PROJECT_ID}
Création d'une règle de transfert/pare-feu pour le trafic http
NB : Ces règles de transfert n'apparaissent pas dans la sous-section pare-feu de la section réseau dans GCP.
gcloud compute forwarding-rules create ${PROJECT_NAME}-http-rule \ --load-balancing-scheme=EXTERNAL \ --network-tier=PREMIUM \ --address=${PROJECT_NAME}-ip \ --global \ --target-http-proxy=${PROJECT_NAME}-http-proxy \ --ports=80 \ --project=${PROJECT_ID}
Création d'une règle de transfert/pare-feu pour le trafic https
gcloud compute forwarding-rules create ${PROJECT_NAME}-https-rule \ --load-balancing-scheme=EXTERNAL \ --network-tier=PREMIUM \ --address=${PROJECT_NAME}-ip \ --target-https-proxy=${PROJECT_NAME}-https-proxy \ --global \ --ports=443 \ --project=${PROJECT_ID}
Optionnel : Action après la validation SSL
Une fois que le certificat SSL ${PROJECT_NAME}-mydomain-cert
est validé, le certificat temporaire ${PROJECT_NAME}-mydomain-cert-temp
n'a plus aucune utilité. Il faut donc le supprimer de l'équilibreur de charge.
gcloud compute target-https-proxies update ${PROJECT_NAME}-https-proxy \ --ssl-certificates=${PROJECT_NAME}-mydomain-cert \ --project=${PROJECT_ID}