Diffusion en direct sur Google Cloud avec Media CDN et l'API Live Streaming

1. Introduction

Les réseaux de diffusion de contenu (CDN) améliorent les performances des utilisateurs en mettant en cache les contenus fréquemment consultés au plus près des utilisateurs finaux, en terminant les connexions au plus près des clients, en réutilisant les connexions à l'origine et en adoptant des protocoles et des personnalisations réseau modernes. Pour les utilisateurs (et nos clients), cela signifie une latence réduite, une fiabilité accrue et des coûts réduits, ce qui se traduit par une amélioration des ventes, de l'expérience Web et de l'expérience utilisateur. De nos jours, très peu de sites et de plates-formes de streaming vidéo modernes fonctionnent sans CDN.

Points abordés

Cet atelier vous guidera à travers les étapes de déploiement d'un environnement de workflow de streaming en direct avec Media CDN (CDN) + API Cloud Media Live Streaming (transcodage vidéo en direct) + Cloud Storage (stockage des vidéos) + Lecteur vidéo (VLC, Google Shaka Player, etc. – lecteur compatible HLS et MPEG-DASH).

Nous allons configurer les composants de l'API Live Streaming (entrée, canal) et démarrer un flux en direct vers l'entrée/le canal avec FFmpeg (FFmpeg peut générer un signal de test en direct). L'API Live Streaming transcode le flux en direct. Le fichier manifeste et les segments vidéo transcodés seront stockés dans un bucket Cloud Storage. Nous allons ensuite configurer Media CDN avec le bucket Cloud Storage de la vidéo en direct comme origine. Enfin, VLC Player sera utilisé pour lire les contenus en direct mis en cache via Media CDN. Nous allons également configurer un tableau de bord Cloud Monitoring pour visualiser l'activité de Media CDN.

Objectifs de l'atelier

Dans cet atelier, nous allons configurer l'environnement en fonction de l'architecture suivante:

de33cb3e75d52549.png

Dans cet atelier, nous allons configurer les composants suivants et effectuer les tâches suivantes:

  • Créer un bucket Google Cloud Storage (GCS) pour stocker les vidéos transcodées en direct
  • Configurer l'API Live Streaming pour transcoder la vidéo dans plusieurs formats: HLS + MPEG DASH, SD et HD
  • Configurer les composants de streaming en direct: entrée/canal
  • Lancer la chaîne de diffusion en direct
  • Configurer Media CDN avec le bucket GCS comme origine
  • Configurer FFmpeg pour alimenter la chaîne en direct
  • Diffusez le flux en direct transcodé avec un lecteur vidéo
  • Configurer un tableau de bord Cloud Monitoring pour surveiller l'activité du CDN multimédia (latence, enregistrement dans le cache, etc.)

Remarque: Pour cet atelier, nous supposons que les utilisateurs ont accès à la console Google Cloud et qu'un projet est déjà configuré. Nous supposons également que les utilisateurs commencent avec un environnement neuf et qu'ils n'ont rien configuré pour cette démonstration.

Toutes les actions de configuration seront effectuées via la ligne de commande dans Cloud Shell. Nous pouvons toujours vérifier les composants configurés via la ligne de commande dans la console. Tout au long de l'atelier, vous verrez des pointeurs vers la console Google Cloud.

2. Avant de commencer

L'accès au Media CDN est limité. Pour accéder à Media CDN, contactez votre équipe chargée de compte. Ils peuvent créer une demande d'accès en votre nom. Si vous faites partie de Google et que vous souhaitez tester le streaming en direct avec Media CDN, contactez le responsable produit de Media CDN pour demander l'accès à Media CDN.

3. Préparation

Démarrer Cloud Shell

Bien que Google Cloud puisse être utilisé à distance depuis votre ordinateur portable, nous allons nous servir de Google Cloud Shell pour cet atelier de programmation, un environnement de ligne de commande exécuté dans le cloud.

Dans la console Google Cloud, cliquez sur l'icône Cloud Shell dans la barre d'outils supérieure :

55efc1aaa7a4d3ad.png

Le provisionnement et la connexion à l'environnement prennent quelques instants seulement. Une fois l'opération terminée, le résultat devrait ressembler à ceci :

7ffe5cbb04455448.png

Cette machine virtuelle contient tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez effectuer toutes les tâches de cet atelier de programmation dans un navigateur. Vous n'avez rien à installer.

4. Version du SDK Google Cloud

Au moment de la rédaction de cet article, 408.0.0 est la dernière version du SDK Google Cloud. Toutes les commandes de cet atelier ont été testées avec la dernière version du SDK Google Cloud. Avant de continuer, assurez-vous que Cloud Shell utilise la dernière version du SDK.

Vérifier la version du SDK

Nous allons utiliser la commande gcloud version pour vérifier la version du SDK.

Commande

gcloud version | grep "Google Cloud SDK"

Exemple de résultat

Google Cloud SDK 408.0.0

Étapes suivantes

  1. Si la version du SDK est 408.0.0 ou ultérieure, passez à la section suivante.
  2. Si la version du SDK est inférieure à 408.0.0, exécutez la commande indiquée ci-dessous pour mettre à jour le SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Prérequis

Avant de commencer à configurer les ressources GCP, nous devons effectuer les opérations suivantes :

  1. Configurer des variables d'environnement
  2. Activer les API de service requises

1. Configurer des variables d'environnement

Tout au long de cet atelier, nous allons exécuter des commandes gcloud et curl avec quelques variables. Nous devons configurer les variables d'environnement suivantes.

  • ID du projet
  • Numéro du projet
  • Nom d'utilisateur
  • Région
  • ID d'entrée
  • ID de la chaîne

ID du projet et nom de l'utilisateur

Ces variables d'environnement sont généralement préconfigurées dans Cloudshell. Nous allons utiliser la commande env pour le vérifier.

Commande

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Exemple de résultat

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Créer le fichier env_variables

Utilisez la commande cat pour créer le fichier env_variables.txt. La commande ci-dessous crée le fichier env_variables.txt dans le répertoire d'accueil de l'utilisateur.

Commandes

cat > ~/env_variables.txt << EOF
export PROJECT_NUMBER=$(gcloud projects describe $GOOGLE_CLOUD_PROJECT --format="value(projectNumber)")
export LOCATION=us-west2
export INPUT_ID=lab-live-input
export CHANNEL_ID=lab-live-channel
EOF

Configurer les variables d'environnement

Nous allons utiliser la commande source pour définir les variables d'environnement.

Commande

source ~/env_variables.txt

Vérifier que les variables sont définies

Vérifions que toutes les variables d'environnement requises sont définies. Un total de six variables d'environnement devrait s'afficher dans la sortie.

Commande

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

Exemple de résultat

LOCATION=us-west2
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>
PROJECT_NUMBER=<YOUR_PROJECT_NUMBER>
INPUT_ID=lab-live-input
CHANNEL_ID=lab-live-channel

2. Activer les API de service requises

Nous devons nous assurer que les API suivantes sont activées dans notre projet.

  • API de services réseau
  • API Certificate Manager
  • API Livestream
  • API Media CDN Edge Cache

Activer l'API Network Services

Pour activer l'API Network Services, exécutez la commande suivante:

Commande

gcloud services enable networkservices.googleapis.com

Activer l'API Certificate Manager

Pour activer l'API Certificate Manager, exécutez la commande suivante :

Commande

gcloud services enable certificatemanager.googleapis.com

Activer l'API Live Stream

Pour activer l'API Live Stream, exécutez la commande suivante:

Commande

gcloud services enable livestream.googleapis.com

Activer l'API Media CDN Edge Cache

Pour activer l'API Media CDN Edge Cache, exécutez la commande suivante:

Commande

gcloud services enable edgecache.googleapis.com

Vérifier que les API sont activées

Exécutez la commande gcloud services list pour obtenir la liste de toutes les API activées. Vous devriez voir quatre API dans le résultat.

Commande

gcloud services list | grep -E 'networkservices|certificatemanager|livestream|edgecache'

Exemple de résultat

NAME: certificatemanager.googleapis.com
NAME: livestream.googleapis.com
NAME: networkservices.googleapis.com
NAME: edgecache.googleapis.com

6. Créer le bucket Cloud Storage

Dans cette section, vous allez effectuer les opérations suivantes:

  1. Créer un bucket Cloud Storage
  2. Rendre le bucket public

Plus tard dans cet atelier, nous utiliserons ce bucket pour stocker les fichiers vidéo transcodés. Ce bucket servira également de stockage d'origine pour le service Media CDN.

1. Créer le bucket

Nous allons utiliser la commande gsutil mb pour créer le bucket:

Commande

gsutil mb gs://live-streaming-storage-$LOGNAME

2. Rendre le bucket accessible au public

Nous allons utiliser la commande iam gsutil pour rendre les fichiers accessibles au public:

Commande

gsutil iam ch allUsers:objectViewer gs://live-streaming-storage-$LOGNAME

7. Configurer l'environnement de l'API Live Streaming

Les composants de la chaîne de l'API Live Streaming sont structurés comme suit:

96b5d26aedeb89a6.png

Nous avons créé le bucket Cloud Storage live-streaming-storage-$LOGNAME dans la section précédente. Dans les deux sections suivantes, nous allons créer les ressources suivantes:

  • Entrée de streaming en direct:point de terminaison auquel votre encodeur envoie votre flux d'entrée. Vous pouvez utiliser le point de terminaison d'entrée pour spécifier des configurations pour votre flux, telles que la résolution d'entrée, le type d'entrée et le recadrage vidéo.
  • Chaîne de streaming en direct:une chaîne est une ressource qui ingère le flux d'entrée via un point de terminaison d'entrée, le convertit en plusieurs versions et publie des flux de sortie en direct dans certains formats à l'emplacement spécifié. Vous pouvez inclure un flux d'entrée principal et un flux de sauvegarde dans la même chaîne.

Nous créerons les ressources suivantes plus tard dans l'atelier:

  • Encodeur:programme utilisé pour envoyer des flux d'entrée. Dans cet atelier, nous allons utiliser FFmpeg.

8. Créer et configurer le point de terminaison d'entrée

Créer le fichier input.json

Nous allons créer un fichier input.json pour spécifier le type de signal de diffusion en direct. Dans cet atelier, nous utilisons le signal en direct RTMP.

Commande

cat > input.json << EOF
{
  "type": "RTMP_PUSH"
}
EOF

Créer le point de terminaison d'entrée

Au moment de la rédaction de cet atelier, l'API Live Stream n'est pas compatible avec gcloud. Nous utiliserons la commande curl pour effectuer les appels d'API.

Commande

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @input.json \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs?inputId=$INPUT_ID"

Exemple de résultat

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

La sortie contient de nombreuses informations utiles, mais pour le moment, nous devons nous concentrer sur deux champs:

  • ID de l'opération:dans la sortie, copiez et notez l'ID de l'opération. Vous trouverez ci-dessous l'ID d'opération de l'exemple de sortie. Vous le trouverez sur la ligne de sortie commençant par "name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • État:nous devons attendre que l'état passe de "done": false à "done": true

Vérifier l'état

Avant de continuer, nous devons vérifier que le point de terminaison d'entrée a bien été créé et qu'il est prêt.

Dans la commande ci-dessous, remplacez <OPERATION> par l'ID de l'opération que nous venons d'obtenir ci-dessus. Dans cet exemple, il s'agit de "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4".

Commande

export OPERATION_ID_1=<OPERATION>

Commande

curl -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_1"

Exemple de résultat

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661408816982-5e70ae25cea49-617844f0-8fdcb4a1",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T06:26:57.001530499Z",
    "endTime": "2022-08-25T06:26:57.043623522Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Input",
    "name": "projects/PROJECT_ID/locations/us-west2/inputs/lab-live-input",
    "createTime": "2022-08-25T06:26:56.997623672Z",
    "updateTime": "2022-08-25T06:26:56.997623672Z",
    "type": "RTMP_PUSH",
    "uri": "rtmp://34.94.97.220/live/4b7846a1-4a67-44ed-bfd0-d98281b6464a",
    "tier": "HD"
  }
}

Réexécutez la commande jusqu'à ce que "done:true" s'affiche, ce qui indique que le point de terminaison d'entrée a été créé et est prêt.

Enregistrer l'URI

Nous utiliserons l'URI de la sortie précédente plus tard dans l'atelier. Pour le moment, définissons une variable d'environnement pour URI.

Commande

export URI=<uri>

Remplacez <uri> par l'URI que vous venez de noter ci-dessus. Vous pouvez également utiliser la méthode GET pour récupérer l'URI.

Commande

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID" | jq .uri

9. Créer et configurer la chaîne de streaming en direct

Créons le canal de streaming en direct, associé au point de terminaison d'entrée que nous venons de créer dans la section précédente. L'exemple suivant crée un canal générant un flux en direct HLS composé d'une seule version haute définition (1 280 x 720). Le canal sera associé au point de terminaison d'entrée et au bucket de stockage que nous avons créés précédemment.

Créer le fichier channel.json

Dans le terminal Cloud Shell, saisissez la commande suivante pour créer un fichier "channel.json":

Commande

cat > channel.json << EOF
{
  "inputAttachments": [
    {
      "key": "my-input",
      "input": "projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"
    }
  ],
  "output": {
    "uri": "gs://live-streaming-storage-$LOGNAME"
  },
  "elementaryStreams": [
    {
      "key": "es_video",
      "videoStream": {
        "h264": {
          "profile": "high",
          "widthPixels": 1280,
          "heightPixels": 720,
          "bitrateBps": 3000000,
          "frameRate": 30
        }
      }
    },
    {
      "key": "es_audio",
      "audioStream": {
        "codec": "aac",
        "channelCount": 2,
        "bitrateBps": 160000
      }
    }
  ],
  "muxStreams": [
    {
      "key": "mux_video_ts",
      "container": "ts",
      "elementaryStreams": ["es_video", "es_audio"],
      "segmentSettings": { "segmentDuration": "2s" }
    }
  ],
  "manifests": [
    {
      "fileName": "main.m3u8",
      "type": "HLS",
      "muxStreams": [
        "mux_video_ts"
      ],
      "maxSegmentCount": 5
    }
  ]
}
EOF

Créer la chaîne

Exécutez la commande curl suivante pour créer le canal:

Commande

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @channel.json \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels?channelId=$CHANNEL_ID"

Exemple de résultat

{
  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

Notez et copiez l'ID de l'opération. Nous en aurons besoin lors d'une des prochaines étapes. Vous le trouverez sur la ligne de sortie commençant par "name".

Vérifier l'état

Avant de continuer, nous devons vérifier que la chaîne a bien été créée et qu'elle est prête.

Dans la commande ci-dessous, remplacez <OPERATION> par l'ID de l'opération que nous venons d'obtenir ci-dessus. Dans cet exemple, il s'agit de operation-1661405972853-5e70a38d6f27f-79100d00-310671b4.

Commande

export OPERATION_ID_2=<OPERATION>

Commande

curl -s -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/operations/$OPERATION_ID_2"

Exemple de résultat

  "name": "projects/PROJECT_NUMBER/locations/us-west2/operations/operation-1668666801461-5eda4c3f31852-a4d2229f-0efeef9e",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-11-17T06:33:21.500841488Z",
    "endTime": "2022-11-17T06:33:21.529311112Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "create",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.Channel",
    "name": "projects/PROJECT_NAME/locations/us-west2/channels/lab-live-channel",
    "createTime": "2022-11-17T06:33:21.497818033Z",
    "updateTime": "2022-11-17T06:33:21.497818033Z",
    "activeInput": "my-input",
    "output": {
      "uri": "gs://live-streaming-storage-LOGNAME"
    },
    "elementaryStreams": [
      {
        "videoStream": {
          "h264": {
            "widthPixels": 1280,
            "heightPixels": 720,
            "frameRate": 30,
            "bitrateBps": 3000000,
            "gopDuration": "2s",
            "vbvSizeBits": 3000000,
            "vbvFullnessBits": 2700000,
            "entropyCoder": "cabac",
            "profile": "high"
          }
        },
        "key": "es_video"
      },
      {
        "audioStream": {
          "codec": "aac",
          "bitrateBps": 160000,
          "channelCount": 2,
          "sampleRateHertz": 48000
        },
        "key": "es_audio"
      }
    ],
    "muxStreams": [
      {
        "key": "mux_video_ts",
        "container": "ts",
        "elementaryStreams": [
          "es_video",
          "es_audio"
        ],
        "segmentSettings": {
          "segmentDuration": "2s"
        }
      }
    ],
    "manifests": [
      {
        "fileName": "main.m3u8",
        "type": "HLS",
        "muxStreams": [
          "mux_video_ts"
        ],
        "maxSegmentCount": 5,
        "segmentKeepDuration": "60s"
      }
    ],
    "streamingState": "STOPPED",
    "inputAttachments": [
      {
        "key": "my-input",
        "input": "projects/PROJECT_NUMBER/locations/us-west2/inputs/lab-live-input"
      }
    ],
    "logConfig": {
      "logSeverity": "OFF"
    }
  }
}

Réexécutez la commande jusqu'à ce que "done:true" s'affiche, ce qui indique que le point de terminaison d'entrée a été créé et est prêt.

Notez que la valeur "streamingState" est actuellement "STOPPED". Nous allons démarrer le canal dans la section suivante.

10. Lancer la chaîne de streaming en direct

Maintenant que nous avons créé notre chaîne de diffusion en direct, commençons-la. Dans cette section, nous allons effectuer les opérations suivantes:

  1. Lancer la chaîne de streaming en direct
  2. Vérifiez l'état de la chaîne. Nous devons nous assurer que streamingState est "AWAITING INPUT".

1. Lancer la chaîne

Dans Cloud Shell, exécutez la commande curl suivante pour démarrer le canal:

Commande

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:start"

Exemple de résultat

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/operations/operation-1661405972853-5e70a38d6f27f-79100d00-310671b4",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.video.livestream.v1.OperationMetadata",
    "createTime": "2022-08-25T05:39:32.884030164Z",
    "target": "projects/PROJECT_NUMBER/locations/us-west2/channels/lab-live-channel",
    "verb": "start",
    "requestedCancellation": false,
    "apiVersion": "v1"
  },
  "done": false
}

2. Vérifier l'état de la chaîne

Exécutez la commande curl suivante pour obtenir l'état du canal:

Commande

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"

Exemple de résultat

"streamingState": "AWAITING_INPUT",

Réexécutez la commande jusqu'à ce que "AWAITING_INPUT" s'affiche, ce qui indique que le canal est en cours d'exécution et prêt à recevoir un signal.

11. Configurer Media CDN

Dans cette section, nous allons déployer Media CDN, l'infrastructure CDN. Nous allons créer les ressources suivantes:

  1. Origine de mise en cache périphérique
  2. Service de mise en cache périphérique

1. Créer une origine de mise en cache périphérique

Une origine de cache Edge représente un emplacement de contenu, tel qu'un bucket Cloud Storage, un emplacement de stockage tiers ou un équilibreur de charge. En termes de CDN, l'origine (ou serveur d'origine) est l'emplacement de la source du contenu que nous souhaitons distribuer (par exemple, tous les CSS, JavaScript, HTML, images, etc.). Pour cet atelier, nous allons créer une origine qui correspond au bucket Cloud Storage que nous avons créé au début de l'atelier. Nous appellerons l'origine de mise en cache périphérique cme-origin. L'origine d'un CDN est l'endroit où tout le contenu source est stocké avant d'être distribué aux serveurs de cache de bordure.

Nous allons utiliser la commande gcloud edge-cache origins create pour créer l'origine. L'exécution de cette commande prend quelques minutes.

Commande

gcloud edge-cache origins create cme-origin \
--origin-address="gs://live-streaming-storage-$LOGNAME"

Exemple de résultat

Create request issued for: cme-origin
Waiting for operation [projects/my-project/locations/global/operations/operation-1612121774168-5ba3759af1919-
3fdcd7b1-99f59223] to complete...done
Created origin cme-origin

2. Créer un service de mise en cache périphérique

Maintenant que nous avons configuré une origine de mise en cache périphérique, nous pouvons créer le service de mise en cache périphérique lui-même.

Créer le fichier cme-demo.yaml

La configuration du service de mise en cache périphérique s'effectue via un fichier YAML. Dans Cloud Shell, créez un fichier local appelé cme-demo.yaml. Utilisez vi, nano ou tout autre éditeur, puis collez les lignes suivantes dans le fichier YAML:

name: cme-demo
routing:
  hostRules:
    - hosts:
        - demo.cme.com
      pathMatcher: routes
  pathMatchers:
    - name: routes
      routeRules:
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - prefixMatch: /
          origin: cme-origin
          priority: 100
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 3600s
              signedRequestMode: DISABLED
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - pathTemplateMatch: /**.m3u8
          origin: cme-origin
          priority: 25
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 1s
              signedRequestMode: DISABLED
        - headerAction: {}
          matchRules:
            - pathTemplateMatch: /**.ts
          origin: cme-origin
          priority: 50
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 2s
              signedRequestMode: DISABLED

Nous conservons toutes les valeurs par défaut de la configuration du service de mise en cache Edge. Dans le fichier ci-dessus, trois valeurs de champ peuvent être modifiées par les utilisateurs:

  • name : nom de l'instance Media CDN (ici, cme-demo)
  • hosts: la liste des noms de domaine qui seront résolus par ce service Media CDN (ici: demo.cme.com). Nous l'utiliserons lors de cette démonstration. Nous utiliserons l'adresse IP de l'instance Media CDN.
  • Origin: : il s'agit de l'origine de cache Edge que nous venons de créer à l'étape précédente. Définissez-le sur cme-origin, nom de l'origine Media CDN.

Pour en savoir plus sur les différentes variables que vous pouvez utiliser dans le fichier YAML, consultez le guide de configuration du service de cache Edge.

Créer le service de mise en cache périphérique

Nous allons créer un service de cache périphérique nommé cme-demo, sur l'origine de cache périphérique cme-origin, avec l'hôte demo.cme.com. Pour créer le service, exécutez la commande suivante dans Cloud Shell:

Commande

gcloud edge-cache services import cme-demo \
    --source=cme-demo.yaml

La création du service de cache Edge peut prendre quelques minutes.

Exemple de résultat

Request issued for: [cme-demo]
Waiting for operation [projects/PROJECT_ID/locations/global/operations/operation-1670476252264-5ef4a0f9f36ce-dd380af5-321be9a0] to complete...done.     
createTime: '2022-12-07T18:08:54.403446942Z'
ipv4Addresses:
- 34.104.35.152
ipv6Addresses:
- '2600:1900:4110:d18::'
name: projects/PROJECT_ID/locations/global/edgeCacheServices/cme-demo
routing:
  hostRules:
  - hosts:
    - demo.cme.com
    - 34.104.35.152
    pathMatcher: routes
  pathMatchers:
  - name: routes
    routeRules:
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - prefixMatch: /
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '100'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
    - headerAction:
        responseHeadersToAdd:
        - headerName: x-cache-status
          headerValue: '{cdn_cache_status}'
      matchRules:
      - pathTemplateMatch: /**.m3u8
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '25'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 1s
          signedRequestMode: DISABLED
    - headerAction: {}
      matchRules:
      - pathTemplateMatch: /**.ts
      origin: projects/123456789/locations/global/edgeCacheOrigins/cme-origin
      priority: '50'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 2s
          signedRequestMode: DISABLED
updateTime: '2022-12-08T05:11:31.598744308Z'

Notez et copiez le ipv4Addresses de l'instance du service de mise en cache périphérique (ici 34.104.36.157). Nous l'utiliserons pour mettre à jour le fichier cme-demo.yaml et, plus tard, pour diffuser la vidéo transcodée en streaming.

Mettre à jour le service de mise en cache périphérique

À ce stade, il est conseillé de mettre à jour la configuration du service de cache Edge afin de pouvoir utiliser l'adresse IP du service pour diffuser la vidéo plus tard. Le fichier YAML du service de mise en cache périphérique nous permet de lister tous les noms/adresses IP d'hôtes à partir desquels le service de mise en cache périphérique acceptera les requêtes. À ce stade, nous n'avons spécifié que demo.cme.com comme hôte. Pour fournir une résolution de nom pour ce domaine, vous pouvez configurer une zone DNS. Toutefois, une solution plus simple consiste à ajouter l'adresse IP à la liste des hôtes dans le fichier yaml. Modifiez à nouveau le fichier YAML pour qu'il se présente comme suit:

name: cme-demo
routing:
  hostRules:
    - hosts:
        - demo.cme.com
        - IPADDRESS
      pathMatcher: routes
  pathMatchers:
    - name: routes
      routeRules:
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - prefixMatch: /
          origin: cme-origin
          priority: 100
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 3600s
              signedRequestMode: DISABLED
        - headerAction:
            responseHeadersToAdd:
              - headerName: x-cache-status
                headerValue: "{cdn_cache_status}"
          matchRules:
            - pathTemplateMatch: /**.m3u8
          origin: cme-origin
          priority: 25
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 1s
              signedRequestMode: DISABLED
        - headerAction: {}
          matchRules:
            - pathTemplateMatch: /**.ts
          origin: cme-origin
          priority: 50
          routeAction:
            cdnPolicy:
              cacheKeyPolicy: {}
              cacheMode: FORCE_CACHE_ALL
              defaultTtl: 2s
              signedRequestMode: DISABLED

Pour refléter les modifications, il suffit de réimporter le fichier YAML. Dans le terminal Cloud Shell, exécutez la commande suivante:

Commande

gcloud edge-cache services import cme-demo \
    --source=cme-demo.yaml

Vérifiez le résultat de la commande et assurez-vous que l'adresse IP figure dans la liste des hôtes.

À ce stade, l'instance du service de cache périphérique accepte les requêtes avec "demo.cme.com" ou l'adresse IP comme hôte.

12. Générer le signal d'entrée

Maintenant que nous avons configuré tous les services requis, générons le signal d'entrée du flux en direct. Dans cette section, nous allons effectuer les opérations suivantes:

  1. Installer FFmpeg, un logiciel Open Source sans frais
  2. Envoyer un signal de test en direct à l'entrée/au canal

1. Installer FFmpeg

FFmpeg est un projet logiciel Open Source et sans frais composé d'une suite de bibliothèques et de programmes permettant de gérer des fichiers et des flux vidéo, audio et multimédias. Dans le terminal Cloud Shell, utilisez la commande suivante pour installer FFmpeg:

Commande

sudo apt install ffmpeg -y

Une fois l'installation terminée, vérifions que FFmpeg a été correctement installé en vérifiant sa version:

Commande

ffmpeg -version

Exemple de résultat

ffmpeg version 4.3.4-0+deb11u1 Copyright (c) 2000-2021 the FFmpeg developers
built with gcc 10 (Debian 10.2.1-6)
...

FFmpeg a été correctement installé.

2. Démarrer le signal de diffusion en direct vers l'entrée/le canal

Maintenant que FFmpeg est installé, nous allons envoyer un flux d'entrée de test au point de terminaison d'entrée pour générer le flux en direct.

Dans le terminal Cloud Shell, exécutez la commande suivante, en utilisant la variable d'environnement URI que nous avons créée dans la section "Créer et configurer le point de terminaison d'entrée".

Commande

ffmpeg -re -f lavfi -i "testsrc=size=1280x720 [out0]; sine=frequency=500 [out1]" \
  -acodec aac -vcodec h264 -f flv $URI

FFmpeg devrait envoyer le signal de diffusion en direct de test. La commande ne renvoie pas l'invite. Le signal est généré jusqu'à ce que vous l'arrêtiez. Vous devrez ouvrir une nouvelle fenêtre Cloud Shell pour le reste de l'atelier.

13. Ouvrir une nouvelle session Cloud Shell

À ce stade, vous devez ouvrir une nouvelle fenêtre Cloud Shell pour continuer l'atelier, car FFmpeg s'exécutera en permanence jusqu'à ce que vous appuyiez sur <CTRL+C> pour arrêter la commande et donc arrêter la génération du signal en direct.

Cliquez sur le signe "+" à côté du nom du terminal Cloud Shell actuel. Une fenêtre Cloud Shell supplémentaire s'ouvre.

b3c7b0be6276c194.png

Exécutez le reste de l'atelier dans la nouvelle fenêtre Cloud Shell qui s'ouvre.

Configurer les variables d'environnement

Comme il s'agit d'une nouvelle session Cloud Shell, nous devons définir à nouveau les variables d'environnement. Nous allons utiliser la commande source pour définir les variables d'environnement.

Commande

source ~/env_variables.txt

Vérifier que les variables sont définies

Vérifions que toutes les variables d'environnement requises sont définies. Un total de six variables d'environnement devrait s'afficher dans la sortie.

Commande

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME|PROJECT_NUMBER|LOCATION|INPUT_ID|CHANNEL_ID'

Exemple de résultat

LOCATION=us-west2
DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>
PROJECT_NUMBER=<YOUR_PROJECT_NUMBER>
INPUT_ID=lab-live-input
CHANNEL_ID=lab-live-channel

14. Vérifier que le signal en direct est transcodé

Nous allons exécuter un curl pour décrire la chaîne. Le résultat devrait indiquer que l'état streamingState est passé de "AWAITING_INPUT" à "STREAMING".

Commande

curl -s -X GET -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID" | grep "streamingState"

Dans la réponse du fichier JSON de sortie, vous devriez voir "streamingState": "STREAMING", ce qui indique que la chaîne est en streaming et que le signal en direct est transcodé.

Vérifions également le contenu du bucket, où nous devrions voir un fichier manifeste et plusieurs segments vidéo TS. Exécutez la commande suivante dans Cloud Shell pour lister le contenu du bucket que nous avons créé au début de l'atelier et utilisé par l'API Live Streaming pour générer le fichier manifeste de signal en direct transcodé et les segments vidéo TS:

Commande

gcloud storage ls --recursive gs://live-streaming-storage-$LOGNAME/**

Exemple de résultat

gs://live-streaming-storage-$LOGNAME/
gs://live-streaming-storage-$LOGNAME/main.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/index-1.m3u8
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000016.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000017.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000018.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000019.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000020.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000021.ts
gs://live-streaming-storage-$LOGNAME/mux_video_ts/segment-0000000022.ts
...

Vous devriez obtenir le résultat suivant :

  • le fichier manifeste HLS: main.m3u8
  • Les segments vidéo TS correspondants: une série de fichiers numérotés segment-000000000X.ts

À ce stade, nous avons terminé les opérations suivantes:

  • API Live Streaming: le signal en direct est généré et transcodé dans un bucket via l'API Live Streaming.
  • Media CDN: Media CDN a été configuré avec le bucket de stockage de streaming en direct comme origine.

Dans les sections suivantes, nous allons valider le service de cache Edge, puis diffuser la vidéo transcodée à l'aide de l'adresse IP anycast du Media CDN.

15. Vérifier que l'instance du service de mise en cache périphérique fonctionne

Dans cette section, nous allons vérifier que l'instance du service de cache Edge fonctionne comme prévu. Pour ce faire, nous allons essayer d'accéder à un fichier à partir de l'instance du service de cache périphérique à l'aide de l'adresse IP du service de cache périphérique. Lors du premier accès à un objet, il n'est pas encore mis en cache. Nous devrions observer un cache MISS. Pour la première requête, l'objet est lu à partir de l'origine et mis en cache en périphérie. Toutes les tentatives suivantes d'accès au même fichier renverront un HIT de cache, car l'objet est désormais mis en cache en périphérie. Vérifions ce comportement:

Exécutez la commande curl suivante dans Cloud Shell pour accéder au fichier manifeste vidéo transcodé stocké dans l'origine du cache Edge:

Commande

curl -svo /dev/null --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> \
"http://demo.cme.com/main.m3u8"

Notez la résolution où nous utilisons l'adresse IP de l'instance du service de cache périphérique pour résoudre son nom. Assurez-vous d'utiliser demo.cme.com:<IP>, où l'adresse IP correspond à celle de l'instance du service de cache périphérique que nous venons de créer.

Recherchez l'en-tête x-cache-status dans la sortie.

Exemple de résultat

Added demo.cme.com:80:34.104.35.152 to DNS cache
* Hostname demo.cme.com was found in DNS cache
*   Trying 34.104.35.152:80...
* Connected to demo.cme.com (34.104.35.152) port 80 (#0)
> GET /main.m3u8 HTTP/1.1
> Host: demo.cme.com
> User-Agent: curl/7.74.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< x-guploader-uploadid: ADPycdtKtflWt4Kha5YxXNNRwO-Eu6fGSPs-T-XY4HJmNMo46VJyWlD4EAk-8a6SegxjWq3o1gTPqZbpkU_sjW__HPAdDw
< date: Wed, 07 Dec 2022 18:23:46 GMT
< last-modified: Wed, 07 Dec 2022 18:23:45 GMT
< etag: "6bff620ccca4a9849ba4e17fa7c521fb"
< x-goog-generation: 1670437425805400
< x-goog-metageneration: 1
< x-goog-stored-content-encoding: identity
< x-goog-stored-content-length: 193
< content-type: application/x-mpegURL
< x-goog-hash: crc32c=sPO3zw==
< x-goog-hash: md5=a/9iDMykqYSbpOF/p8Uh+w==
< x-goog-storage-class: STANDARD
< accept-ranges: bytes
< content-length: 193
< server: Google-Edge-Cache
< x-request-id: fd25285b-fc1a-4fd4-981a-c50ead2c85ed
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-cache-status: den;miss
< cache-control: public,max-age=3600
<
{ [193 bytes data]
* Connection #0 to host demo.cme.com left intact

Notez que le cache manque, car l'objet n'a pas encore été mis en cache et est lu à partir de l'origine.

Nous allons maintenant effectuer plusieurs requêtes pour le fichier m3u8. Si tout est configuré correctement, Media CDN devrait commencer à diffuser le contenu à partir de son cache. La commande ci-dessous effectue 10 requêtes curl et n'imprime que l'en-tête x-cache-status.

Commande

for i in {1..10};do curl -Is --resolve demo.cme.com:80:<Replace_With_Edge_Cache_IP> "http://demo.cme.com/main.m3u8" | grep x-cache-status;done

Le résultat doit être un mélange de cache hit et miss. Si des requêtes du cache s'affichent dans la sortie, cela signifie que Media CDN fonctionne comme prévu.

Exemple de résultat

x-cache-status: den;miss
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit
x-cache-status: den;hit

Notez l'accès au cache, car l'objet est maintenant mis en cache en périphérie. Le service Cloud Media Edge fonctionne comme prévu.

16. Diffusez des vidéos de signaux en direct transcodées avec VLC

C'est ici que nous faisons le lien entre toutes les étapes que nous avons suivies jusqu'à présent:

  • Nous avons créé un bucket appelé live-streaming-storage-$LOGNAME qui reçoit le résultat du signal en direct transcodé en contenu HLS par l'API Live Streaming.
  • Nous avons configuré l'API Live Streaming.
  • Nous avons lancé un signal en direct RTMP avec FFmpeg qui alimente l'entrée/le canal de l'API Live Streaming.
  • Nous avons vérifié que le signal en direct a été transmis à la chaîne et que celle-ci était en mode streaming.
  • Nous avons vérifié que les fichiers transcodés (fichier manifeste et segments TS) générés et stockés dans le bucket live-streaming-storage-$LOGNAME.
  • Une origine de cache périphérique appelée cme-origin a été configurée avec le bucket GCS live-streaming-storage-$LOGNAME comme origine.
  • Une instance de cache Edge appelée cme-demo a été configurée avec cme-origin comme origine.
  • Nous avons vérifié le comportement (manque de cache, réussite de la mise en cache) de l'instance du service de mise en cache Edge.

Nous pouvons désormais utiliser un lecteur vidéo pour diffuser le signal en direct transcodé via le cache Media CDN. Pour ce faire, nous allons utiliser VLC Player. VLC Player est un lecteur et un framework multimédias multiplates-formes sans frais et Open Source qui lit la plupart des fichiers multimédias. Il lit les formats multimédias adaptatifs (tels que DASH et HLS). Il utilise le principe du streaming adaptatif : en fonction de la qualité de votre connexion réseau et de la bande passante disponible, le lecteur adapte la qualité de la vidéo lue. Pour la tâche de transcodage que nous venons d'effectuer, nous avons utilisé les préréglages par défaut et généré "seulement" deux qualités : SD et HD. Lorsque nous commençons à lire la vidéo dans le lecteur, elle devrait commencer en SD et passer rapidement au format HD si votre connexion réseau est suffisamment bonne.

Nous diffuserons le signal en direct transcodé au format HLS (format vidéo Apple largement accepté). Le fichier correspondant est appelé main.m3u8, qui est le fichier manifeste HLS. Le fichier manifeste pointe vers les segments vidéo TS.

Pour utiliser VLC Player, accédez à https://www.videolan.org/vlc/ et téléchargez une version du lecteur pour le système d'exploitation de votre ordinateur portable. VLC est disponible pour Windows, MacOSX, Linux, Android et iOS.

2a2d19abe728d222.png

Installez le lecteur sur votre ordinateur portable et lancez-le. Nous utiliserons la version MacOSX du lecteur pour les prochaines étapes.

Pour lire une vidéo, accédez à "Fichier" / "Ouvrir un réseau":

f85565301f7c68dc.png

Configurez-le avec:

  • URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8. Il s'agit de l'URL de la vidéo que nous souhaitons diffuser en streaming. Remarques :
  • Adresse IP de l'instance Media CDN: 34.105.35.246. Remplacez-le par l'adresse IP du service Cloud Media que vous avez déployé.
  • Chemin d'accès au fichier vidéo manifeste: "/". Il s'agit du chemin que nous avons utilisé dans le bucket live-streaming-storage-$LOGNAME pour stocker les fichiers de signal en direct transcodés. Le chemin d'accès est le chemin racine: "/".
  • Nom du fichier vidéo manifeste: fichier manifeste HLS, main.m3u8.

et cliquez sur "Ouvrir". La vidéo en direct transcodée devrait commencer à être lue. La vidéo ressemblera à la capture d'écran ci-dessous. Le compteur à l'écran s'affiche par incréments de 1, et vous devriez entendre un bip continu.

Il s'agit d'un signal de diffusion en direct de test RTMP généré par FFmpeg, transcodé en HLS par l'API Live Streaming et diffusé via le cache Media CDN:

28fc359b49d44ec2.png

Vous pouvez utiliser n'importe quel autre lecteur HLS et MPEG-DASH si vous le souhaitez. Voici quelques options à envisager:

  • QuickTime Player (installé par défaut sur les Mac) Même chose ici: ouvrez une connexion réseau vers http://34.104.36.157/main.m3u8. Remplacez l'adresse IP par celle de votre instance de service de cache périphérique.

17. Surveiller Media CDN

L'équipe d'experts a créé un modèle de tableau de bord Media CDN : https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

Pour l'installer, exécutez les commandes suivantes dans la fenêtre Cloud Shell:

Téléchargez le fichier YAML:

curl https://gist.githubusercontent.com/elithrar/1c511d00f5cd3736fb2a3897867209c1/raw/3cb70855304f29e5c06b8d63063196354db0dec3/media-edge-20210208-dashboard --output media-edge-20210208-dashboard.yaml

Créez le tableau de bord pour Cloud Monitoring:

gcloud monitoring dashboards create --config-from-file media-edge-20210208-dashboard.yaml

La configuration peut prendre quelques minutes. Accédez à la console Google Cloud, puis cliquez sur les trois barres > "Opérations" > "Surveillance" > "Tableaux de bord". Un tableau de bord intitulé "Métriques Media Edge" devrait s'afficher. Cliquez dessus pour afficher les métriques:

d0821d84a88a928d.png

18. Nettoyer l'environnement de l'atelier

Félicitations, vous avez terminé l'atelier. Dans cette section, nous allons supprimer toutes les ressources que nous avons créées au cours de l'atelier.

Arrêtez le signal FFmpeg:

Appuyez sur <CTRL+C> dans le terminal Cloud Shell dans lequel FFmpeg s'exécute.

Arrêtez la chaîne de diffusion en direct:

Commande

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d "" \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID:stop"

Supprimez le canal de streaming en direct:

Commande

curl -X DELETE -H "Authorization: Bearer "$(gcloud auth application-default print-access-token) "https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/channels/$CHANNEL_ID"

Supprimez le point de terminaison d'entrée de diffusion en direct:

Commande

curl -X DELETE \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
"https://livestream.googleapis.com/v1/projects/$PROJECT_NUMBER/locations/$LOCATION/inputs/$INPUT_ID"

Supprimez le bucket GCS:

Commande

gsutil rm -r gs://live-streaming-storage-$LOGNAME

Supprimez l'instance du service de mise en cache périphérique:

Commande

gcloud edge-cache services delete cme-demo

Confirmez la suppression en saisissant "Y" lorsque vous y êtes invité.

Supprimez l'origine de mise en cache Edge:

Commande

gcloud edge-cache origins delete cme-origin

Confirmez la suppression en saisissant "Y" lorsque vous y êtes invité.

Supprimer le tableau de bord personnalisé

Commande

gcloud monitoring dashboards delete $(gcloud monitoring dashboards list --filter="displayName:Media Edge Metrics" --format="value(name)")