Créer un service de backend externe

De Wiki de Jordan LE NUFF
< Cloud computing‎ | Google Cloud Platform‎ | Procédures diverses
Révision datée du 3 novembre 2022 à 22:43 par Jordan (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

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}