Live Streaming di Google Cloud dengan Media CDN dan Live Streaming API

1. Pengantar

Jaringan Penayangan Konten (CDN) meningkatkan performa pengguna dengan menyimpan konten yang sering diakses ke cache secara lebih dekat dengan pengguna akhir, menghentikan koneksi lebih dekat dengan klien, menggunakan kembali koneksi ke origin, dan melalui penerapan protokol dan penyesuaian jaringan modern. Bagi pengguna (dan pelanggan kami), hal ini berarti latensi yang lebih rendah, keandalan yang lebih tinggi, dan biaya yang lebih rendah, sehingga meningkatkan penjualan, pengalaman web, dan peningkatan bersih pada pengalaman pengguna. Saat ini, sangat sedikit situs modern dan platform streaming video yang beroperasi tanpa CDN.

Yang akan Anda pelajari

Lab ini akan memandu kita melalui langkah-langkah untuk men-deploy lingkungan alur kerja live streaming dengan Media CDN (CDN) + Cloud Media Live Streaming API (transcoding video live) + Cloud Storage (penyimpanan untuk video) + Pemutar Video (VLC, Google Shaka Player, dll. - pemutar siap HLS + MPEG-DASH).

Kita akan menyiapkan komponen Live Streaming API - Input, Channel - dan memulai feed live ke Input/Channel dengan FFmpeg (FFmpeg dapat menghasilkan sinyal pengujian live). Live Streaming API akan melakukan transcoding feed live. Manifes dan segmen video yang ditranskode akan disimpan di bucket Cloud Storage. Kemudian, kita akan menyiapkan Media CDN dengan bucket Cloud Storage video live sebagai origin. Terakhir, VLC Player akan digunakan untuk memutar konten live yang di-cache melalui Media CDN. Kita juga akan menyiapkan dasbor Cloud Monitoring untuk memvisualisasikan aktivitas Media CDN.

Yang akan Anda bangun

Dalam lab ini, kita akan menyiapkan lingkungan berdasarkan arsitektur berikut:

de33cb3e75d52549.png

Kita akan menyiapkan komponen berikut dan melakukan tugas berikut sebagai bagian dari lab:

  • Membuat bucket Google Cloud Storage (GCS) untuk menyimpan video live yang ditranskode
  • Mengonfigurasi Live Streaming API untuk melakukan transcoding video ke beberapa format: HLS + MPEG DASH, SD, dan HD
  • Menyiapkan komponen Live Streaming: Input/Channel
  • Memulai Channel Live Stream
  • Menyiapkan Media CDN dengan bucket GCS sebagai origin
  • Menyiapkan FFmpeg untuk memberi feed ke channel live
  • Men-streaming feed live yang ditranskode dengan pemutar video
  • Menyiapkan dasbor Cloud Monitoring untuk memantau aktivitas Media CDN (latensi, cache hit, cache miss, dll.)

Catatan: Untuk lab ini, kami mengasumsikan bahwa pengguna memiliki akses ke Konsol Google Cloud dan sudah memiliki penyiapan project. Kita juga mengasumsikan bahwa pengguna memulai dengan lingkungan baru dan tidak menyiapkan apa pun untuk demo ini.

Semua tindakan konfigurasi akan dilakukan melalui command line di Cloud Shell. Kita dapat memeriksa komponen yang dikonfigurasi melalui command line di konsol kapan saja. Kita akan melihat pointer di seluruh lab yang akan mengarah ke Konsol Google Cloud.

2. Sebelum memulai

Akses CDN media dibatasi. Untuk mendapatkan akses ke Media CDN, hubungi tim akun Anda. Mereka dapat membuat permintaan akses atas nama Anda. Jika Anda adalah bagian dari Google dan ingin menguji Live Streaming dengan Media CDN, hubungi PM untuk Media CDN guna meminta akses ke Media CDN.

3. Penyiapan dan Persyaratan

Mulai Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini, Anda akan menggunakan Google Cloud Shell, lingkungan command line yang berjalan di Cloud.

Dari Google Cloud Console, klik ikon Cloud Shell di toolbar kanan atas:

55efc1aaa7a4d3ad.png

Hanya perlu waktu beberapa saat untuk penyediaan dan terhubung ke lingkungan. Jika sudah selesai, Anda akan melihat tampilan seperti ini:

7ffe5cbb04455448.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Semua pekerjaan Anda dalam codelab ini dapat dilakukan di browser. Anda tidak perlu menginstal apa pun.

4. Versi Google Cloud SDK

Pada saat penulisan, 408.0.0 adalah versi Google Cloud SDK terbaru. Semua perintah dalam lab ini telah diuji menggunakan Google Cloud SDK versi terbaru. Sebelum melanjutkan, pastikan Cloud Shell menggunakan SDK versi terbaru.

Memeriksa versi SDK

Kita akan menggunakan perintah gcloud version untuk memeriksa versi SDK.

Perintah

gcloud version | grep "Google Cloud SDK"

Contoh Output

Google Cloud SDK 408.0.0

Langkah Berikutnya

  1. Jika versi SDK adalah 408.0.0 atau yang lebih tinggi, lanjutkan ke bagian berikutnya.
  2. Jika versi SDK lebih rendah dari 408.0.0, jalankan perintah yang tercantum di bawah untuk mengupdate SDK.
sudo apt-get update && sudo apt-get install google-cloud-sdk

5. Prasyarat

Sebelum mulai mengonfigurasi resource GCP, kita perlu melakukan hal berikut:

  1. Menyiapkan variabel lingkungan
  2. Mengaktifkan Service API yang diperlukan

1. Menyiapkan Variabel Lingkungan

Selama lab ini, kita akan menjalankan perintah gcloud dan curl dengan beberapa variabel. Kita perlu mengonfigurasi variabel lingkungan berikut.

  • ID Project
  • Nomor Project
  • Nama Pengguna
  • Wilayah
  • ID input
  • ID Channel

Project ID dan Nama Pengguna

Variabel lingkungan ini biasanya telah dikonfigurasi sebelumnya di Cloudshell. Kita akan menggunakan perintah env untuk memverifikasi.

Perintah

env | grep -E 'DEVSHELL_PROJECT_ID=|LOGNAME'

Contoh Output

DEVSHELL_PROJECT_ID=<YOUR_PROJECT_ID>
LOGNAME=<YOUR_USERNAME>

Membuat File env_variables

Gunakan perintah cat untuk membuat file env_variables.txt. Perintah di bawah akan membuat file env_variables.txt di direktori beranda pengguna.

Perintah

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

Menyiapkan Variabel Lingkungan

Kita akan menggunakan perintah source untuk menetapkan variabel lingkungan

Perintah

source ~/env_variables.txt

Memverifikasi bahwa variabel telah ditetapkan

Mari kita pastikan bahwa semua variabel lingkungan yang diperlukan telah ditetapkan. Kita akan melihat total 6 variabel lingkungan dalam output.

Perintah

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

Contoh Output

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. Mengaktifkan API Layanan yang Diperlukan

Kita harus memastikan bahwa API berikut diaktifkan di project kita.

  • API Layanan Jaringan
  • Certificate Manager API
  • Livestream API
  • Media CDN Edge Cache API

Mengaktifkan Network Services API

Untuk mengaktifkan Network Services API, jalankan perintah berikut:

Perintah

gcloud services enable networkservices.googleapis.com

Mengaktifkan Certificate Manager API

Untuk mengaktifkan Certificate Manager API, jalankan perintah berikut:

Perintah

gcloud services enable certificatemanager.googleapis.com

Mengaktifkan Live Stream API

Untuk mengaktifkan Live Stream API, jalankan perintah berikut:

Perintah

gcloud services enable livestream.googleapis.com

Mengaktifkan Media CDN Edge Cache API

Untuk mengaktifkan Media CDN Edge Cache API, jalankan perintah berikut:

Perintah

gcloud services enable edgecache.googleapis.com

Memverifikasi bahwa API Diaktifkan

Jalankan perintah gcloud services list untuk mencantumkan semua API yang diaktifkan. Kita akan melihat 4 API dalam output.

Perintah

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

Contoh Output

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

6. Membuat Bucket Cloud Storage

Di bagian ini, kita akan melakukan hal berikut:

  1. Membuat bucket Cloud Storage
  2. Membuat bucket dapat diakses secara publik

Nanti di lab, kita akan menggunakan bucket ini untuk menyimpan file video yang ditranscoding. Bucket ini juga akan berfungsi sebagai penyimpanan asal untuk layanan Media CDN.

1. Buat bucket

Kita akan menggunakan perintah gsutil mb untuk membuat bucket:

Perintah

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

2. Membuat Bucket Dapat Diakses Secara Publik

Kita akan menggunakan perintah gsutil iam untuk membuat file tersedia secara publik:

Perintah

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

7. Menyiapkan lingkungan Live Streaming API

Komponen rantai Live Streaming API dirancang arsitekturnya sebagai berikut:

96b5d26aedeb89a6.png

Kita telah membuat bucket Cloud Storage live-streaming-storage-$LOGNAME di bagian sebelumnya. Di dua bagian berikutnya, kita akan membuat resource berikut:

  • Input Live Streaming: Endpoint input adalah endpoint tempat encoder Anda mengirim streaming input. Anda dapat menggunakan endpoint input untuk menentukan konfigurasi streaming, seperti resolusi input, jenis input, dan pemangkasan video.
  • Channel Live Streaming: Channel adalah resource yang menyerap streaming input melalui endpoint input, mentranskode streaming input menjadi beberapa render, dan memublikasikan live stream output dalam format tertentu di lokasi yang ditentukan. Anda dapat menyertakan streaming input utama dan cadangan di saluran yang sama.

Kita akan membuat resource berikut nanti di lab:

  • Encoder: Encoder adalah program yang digunakan untuk mengirim streaming input. Dalam lab ini, kita akan menggunakan FFmpeg.

8. Membuat dan Mengonfigurasi Endpoint Input

Membuat File input.json

Kita akan membuat file input.json untuk menentukan jenis sinyal live stream. Dalam lab ini, kita menggunakan sinyal live RTMP.

Perintah

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

Membuat Endpoint Input

Saat penulisan lab ini, tidak ada dukungan gcloud untuk Live Stream API. Kita akan menggunakan perintah curl untuk melakukan panggilan API.

Perintah

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"

Contoh Output

{
  "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
}

Output ini memiliki banyak informasi yang berguna, tetapi saat ini, kita perlu berfokus pada dua kolom:

  • ID Operasi: Dari output, salin dan catat ID operasi. Berikut adalah ID operasi dari contoh output. Ini dapat ditemukan di baris output yang dimulai dengan "name". "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4"
  • Status: Kita harus menunggu status berubah dari "done": false menjadi "done": true

Periksa Status

Sebelum melanjutkan lebih lanjut, kita perlu memeriksa apakah endpoint input berhasil dibuat dan siap.

Pada perintah di bawah, ganti <OPERATION> dengan ID Operasi yang baru saja kita dapatkan di atas. Dalam contoh ini, nilainya adalah "operation-1661405972853-5e70a38d6f27f-79100d00-310671b4".

Perintah

export OPERATION_ID_1=<OPERATION>

Perintah

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"

Contoh Output

{
  "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"
  }
}

Jalankan kembali perintah hingga Anda melihat "done:true" yang menunjukkan bahwa Endpoint Input telah dibuat dan siap.

Menyimpan URI

Kita akan menggunakan URI dari output sebelumnya nanti di lab. Pada saat ini, mari kita tetapkan variabel lingkungan untuk URI.

Perintah

export URI=<uri>

Ganti <uri> dengan URI yang baru saja Anda catat di atas. Secara opsional, Anda juga dapat menggunakan metode GET untuk mengambil URI

Perintah

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. Membuat & Mengonfigurasi Channel Live Streaming

Mari kita buat Channel Live Streaming, yang dikaitkan dengan endpoint input yang baru saja kita buat di bagian sebelumnya. Contoh berikut membuat saluran yang menghasilkan live stream HLS yang terdiri dari satu render beresolusi tinggi (1280x720). Channel akan dikaitkan dengan endpoint input, dan bucket penyimpanan yang kita buat sebelumnya.

Membuat file channel.json

Di terminal Cloud Shell, ketik perintah berikut untuk membuat file "channel.json":

Perintah

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

Membuat Channel

Jalankan perintah curl berikut untuk membuat Channel:

Perintah

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"

Contoh Output

{
  "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
}

Catat dan salin ID operasi. Kami akan memerlukannya di salah satu langkah mendatang. Ini dapat ditemukan di baris output yang dimulai dengan "name".

Periksa Status

Sebelum melanjutkan lebih lanjut, kita perlu memeriksa apakah channel berhasil dibuat dan sudah siap.

Pada perintah di bawah, ganti <OPERATION> dengan ID Operasi yang baru saja kita dapatkan di atas. Dalam contoh ini, atributnya adalah operation-1661405972853-5e70a38d6f27f-79100d00-310671b4

Perintah

export OPERATION_ID_2=<OPERATION>

Perintah

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"

Contoh Output

  "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"
    }
  }
}

Jalankan kembali perintah hingga Anda melihat "done:true" yang menunjukkan bahwa Endpoint Input telah dibuat dan siap.

Perhatikan bahwa "streamingState" saat ini adalah "STOPPED" ; kita akan memulai saluran di bagian berikutnya.

10. Memulai Channel Live Streaming

Setelah membuat channel Live Stream, mari kita mulai channel tersebut. Di bagian ini, kita akan melakukan hal berikut:

  1. Memulai channel Live Streaming
  2. Periksa Status saluran, kita harus memastikan bahwa streamingState adalah "AWAITING INPUT"

1. Memulai Channel

Di Cloud Shell, jalankan perintah curl berikut untuk memulai saluran:

Perintah

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"

Contoh Output

{
  "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. Memeriksa Status Channel

Jalankan perintah curl berikut untuk mendapatkan status Channel:

Perintah

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"

Contoh Output

"streamingState": "AWAITING_INPUT",

Jalankan kembali perintah hingga Anda melihat "AWAITING_INPUT" yang menunjukkan bahwa Channel sedang berjalan dan siap menerima sinyal.

11. Mengonfigurasi Media CDN

Di bagian ini, kita akan men-deploy Media CDN - infrastruktur CDN. Kita akan membuat resource berikut:

  1. Edge Cache Origin
  2. Layanan Cache Edge

1. Membuat Edge Cache Origin

Origin Cache Edge mewakili lokasi konten, seperti bucket Cloud Storage, lokasi penyimpanan pihak ketiga, atau load balancer. Dalam istilah CDN, origin (atau server origin) adalah lokasi sumber konten yang ingin didistribusikan - misalnya, semua CSS, JavaScript, HTML, gambar, dll. Untuk lab ini, kita akan membuat origin yang dipetakan ke bucket Cloud Storage yang kita buat di awal lab. Kita akan menyebut Edge Cache Origin cme-origin. Asal CDN adalah tempat semua konten sumber disimpan sebelum didistribusikan ke server cache edge.

Kita akan menggunakan perintah gcloud edge-cache origins create untuk membuat origin. Pemrosesan perintah ini memerlukan waktu beberapa menit.

Perintah

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

Contoh Output

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. Membuat Layanan Cache Edge

Setelah menyiapkan Edge Cache Origin, kita dapat membuat Edge Cache Service itu sendiri.

Membuat file cme-demo.yaml

Konfigurasi Layanan Cache Edge dilakukan melalui file YAML. Di Cloud Shell, buat file lokal bernama cme-demo.yaml. Gunakan vi, nano, atau editor lainnya dan tempel baris berikut di file 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

Kami akan membiarkan semua konfigurasi default Layanan Cache Edge. Dalam file di atas, ada 3 nilai kolom yang mungkin ingin diperbarui oleh pengguna:

  • name: nama instance Media CDN - di sini: cme-demo
  • hosts: daftar nama domain yang akan di-resolve oleh Layanan Media CDN ini - di sini: demo.cme.com. Kita akan menggunakannya selama demo ini. Kita akan menggunakan alamat IP instance Media CDN.
  • Origin: ini adalah Edge Cache Origin yang baru saja kita buat di langkah sebelumnya. Tetapkan ke cme-origin - nama Origin Media CDN.

Untuk informasi selengkapnya tentang berbagai variabel yang dapat Anda gunakan dalam file YAML, lihat panduan konfigurasi Edge Cache Service.

Membuat Layanan Cache Edge

Kita akan membuat Layanan Cache Edge bernama cme-demo, di Edge Cache Origin cme-origin, dengan host demo.cme.com. Untuk membuat layanan, jalankan perintah berikut di Cloud Shell:

Perintah

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

Mungkin perlu waktu beberapa menit untuk membuat Layanan Cache Edge.

Contoh Output

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'

Catat dan salin ipv4Addresses instance Edge Cache Service - di sini 34.104.36.157. Kita akan menggunakannya untuk mengupdate file cme-demo.yaml dan nanti untuk melakukan streaming video yang ditranscoding.

Mengupdate Layanan Cache Edge

Pada tahap ini, sebaiknya perbarui konfigurasi Layanan Cache Edge agar dapat menggunakan IP layanan untuk melakukan streaming video nanti. File YAML Edge Cache Service memungkinkan kita mencantumkan semua nama/IP host yang akan menerima permintaan dari Edge Cache Service. Pada tahap ini, kita hanya menentukan demo.cme.com sebagai host. Untuk memberikan resolusi nama untuk domain ini, Anda dapat mengonfigurasi zona DNS. Namun, solusi yang lebih mudah adalah dengan menambahkan alamat IP ke daftar host dalam file yaml. Edit file YAML lagi dan edit agar terlihat seperti di bawah ini:

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

Untuk mencerminkan perubahan, kita hanya perlu mengimpor ulang file YAML. Di terminal Cloud Shell, jalankan perintah berikut:

Perintah

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

Periksa output perintah dan pastikan IP muncul dalam daftar host.

Pada tahap ini, instance Layanan Cache Edge akan menerima permintaan dengan "demo.cme.com" atau alamat IP sebagai host.

12. Membuat Sinyal Input

Setelah mengonfigurasi semua layanan yang diperlukan, mari kita buat sinyal input live stream. Di bagian ini, kita akan melakukan hal berikut:

  1. Menginstal FFmpeg, software open source gratis
  2. Mengirim sinyal live pengujian ke Input/Channel

1. Menginstal FFmpeg

FFmpeg adalah project software gratis dan open source yang terdiri dari serangkaian library dan program untuk menangani file dan streaming video, audio, serta multimedia lainnya. Di terminal Cloud Shell, gunakan perintah berikut untuk menginstal FFmpeg:

Perintah

sudo apt install ffmpeg -y

Setelah penginstalan selesai, mari kita pastikan FFmpeg telah diinstal dengan benar dengan memeriksa versinya:

Perintah

ffmpeg -version

Contoh Output

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

FFmpeg diinstal dengan benar.

2. Mulai Sinyal Live Stream ke Input/Channel

Setelah FFmpeg diinstal, kita akan mengirim aliran input pengujian ke endpoint input untuk membuat live stream.

Di terminal Cloud Shell, jalankan perintah berikut, menggunakan variabel lingkungan URI yang kita buat di bagian "Membuat dan Mengonfigurasi Endpoint Input".

Perintah

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

Anda akan melihat FFmpeg mengirim sinyal live pengujian. Perintah ini tidak akan menampilkan perintah. Sinyal akan dihasilkan hingga Anda menghentikannya. Anda harus membuka jendela Cloud Shell baru untuk sisa lab.

13. Membuka Cloud Shell Baru

Pada tahap ini, Anda harus membuka jendela Cloud Shell baru untuk melanjutkan lab karena FFmpeg akan berjalan secara permanen hingga Anda menekan <CTRL+C> pada perintah untuk menghentikannya, sehingga menghentikan pembuatan sinyal live.

Klik tanda "+" di samping nama terminal Cloud Shell saat ini. Tindakan ini akan membuka jendela Cloud Shell tambahan.

b3c7b0be6276c194.png

Jalankan lab lainnya di jendela Cloud Shell yang baru dibuka.

Menyiapkan Variabel Lingkungan

Karena ini adalah CloudShell baru, kita perlu menetapkan variabel lingkungan lagi. Kita akan menggunakan perintah source untuk menetapkan variabel lingkungan.

Perintah

source ~/env_variables.txt

Memverifikasi bahwa variabel telah ditetapkan

Mari kita pastikan bahwa semua variabel lingkungan yang diperlukan telah ditetapkan. Kita akan melihat total 6 variabel lingkungan dalam output.

Perintah

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

Contoh Output

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. Memverifikasi bahwa sinyal live sedang ditranskode

Kita akan menjalankan curl untuk mendeskripsikan saluran. Kita akan melihat di output bahwa streamingState berubah dari "AWAITING_INPUT" menjadi "STREAMING"

Perintah

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"

Dalam respons file JSON output, Anda akan melihat "streamingState": "STREAMING" - yang menunjukkan bahwa Channel sedang melakukan streaming dan sinyal live sedang ditranskode.

Mari kita verifikasi juga konten bucket tempat kita akan melihat file manifes dan beberapa segmen video TS. Jalankan perintah berikut di Cloud Shell untuk mencantumkan konten bucket yang kita buat di awal lab dan digunakan oleh Live Streaming API untuk menghasilkan manifes sinyal live yang ditranskode dan segmen video TS:

Perintah

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

Contoh Output

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
...

Anda akan melihat:

  • file manifes HLS: main.m3u8
  • Segmen video TS yang sesuai: serangkaian file bernomor segment-000000000X.ts

Pada tahap ini, kita telah menyelesaikan hal berikut:

  • Live Streaming API: sinyal live dihasilkan dan ditranskode ke dalam bucket melalui Live Streaming API
  • Media CDN: mengonfigurasi Media CDN dengan bucket penyimpanan Live Streaming sebagai origin Media CDN.

Di bagian berikutnya, kita akan memvalidasi Layanan Cache Edge, lalu kita akan melakukan streaming video yang ditranskode menggunakan alamat IP anycast Media CDN.

15. Memverifikasi bahwa instance Layanan Cache Edge berfungsi

Di bagian ini, kita akan memverifikasi bahwa instance Edge Cache Service berfungsi seperti yang diharapkan. Untuk melakukannya, kita akan mencoba mengakses file dari instance Layanan Cache Edge menggunakan alamat IP Layanan Cache Edge. Saat pertama kali diakses, objek belum di-cache. Kita harus mengamati cache MISS. Untuk permintaan pertama, objek dibaca dari origin dan di-cache di edge. Semua upaya berikut untuk mengakses file yang sama akan menampilkan cache HIT karena objek kini di-cache di edge. Mari kita verifikasi perilaku ini:

Jalankan perintah curl berikut di Cloud Shell untuk mengakses file manifes video yang ditranskode yang disimpan di Edge Cache Origin:

Perintah

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

Perhatikan resolusi tempat kita menggunakan alamat IP instance Layanan Cache Edge untuk me-resolve namanya. Pastikan Anda menggunakan demo.cme.com:<IP> dengan IP adalah IP instance Edge Cache Service yang baru saja kita buat.

Cari header x-cache-status di output.

Contoh Output

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

Perhatikan ketidakcocokan cache karena objek belum di-cache dan dibaca dari asal.

Sekarang kita akan membuat beberapa permintaan untuk file m3u8, dan jika semuanya dikonfigurasi dengan benar, Media CDN akan mulai menayangkan konten dari cache-nya. Perintah di bawah akan membuat 10 permintaan curl dan hanya mencetak header x-cache-status.

Perintah

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

Output harus berupa campuran cache hit dan miss. Jika Anda melihat hit cache dalam output, berarti Media CDN berfungsi seperti yang diharapkan.

Contoh Output

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

Perhatikan hit cache karena objek kini di-cache di edge. Layanan Cloud Medie Edge berfungsi seperti yang diharapkan.

16. Menstreaming video sinyal live yang ditranscoding dengan VLC

Ini adalah bagian untuk menghubungkan semua titik dan menautkan semua langkah yang telah kita kerjakan sejauh ini:

  • Kita membuat bucket bernama live-streaming-storage-$LOGNAME yang menerima hasil sinyal live yang ditranscoding ke konten HLS oleh Live Streaming API.
  • Kita menyiapkan Live Streaming API.
  • Kita memulai sinyal live RTMP dengan FFmpeg yang memberi input/Channel Live Streaming API.
  • Kami memverifikasi bahwa sinyal live disalurkan ke Channel dan memverifikasi bahwa Channel berada dalam mode streaming.
  • Kami memverifikasi bahwa file yang ditranskode (segmen TS + manifes) yang dihasilkan dibuat dan disimpan di bucket live-streaming-storage-$LOGNAME.
  • Origin Cache Edge bernama cme-origin disiapkan dengan bucket GCS live-streaming-storage-$LOGNAME sebagai origin.
  • Instance Edge Cache bernama cme-demo disiapkan dengan cme-origin sebagai origin-nya.
  • Kami memverifikasi perilaku (cache miss, cache hit) instance Edge Cache Service.

Sekarang kita berada di titik yang dapat menggunakan pemutar video untuk melakukan streaming sinyal live yang ditranscoding melalui cache Media CDN. Untuk melakukannya, kita akan menggunakan VLC Player. VLC Player adalah pemutar dan framework multimedia lintas platform gratis dan open source yang memutar sebagian besar file multimedia. Pemutar ini memutar format media adaptif (seperti DASH dan HLS). Fitur ini menggunakan prinsip Streaming Adaptif - sesuai dengan kualitas koneksi jaringan dan bandwidth yang tersedia, pemutar akan menyesuaikan kualitas video yang diputar. Dengan tugas transcoding yang baru saja kita lakukan, kita menggunakan preset default dan menghasilkan "hanya" dua kualitas: SD dan HD. Saat kami mulai memutar video di pemutar, Anda akan melihat video mulai diputar dalam format SD dan dengan cepat beralih ke format HD jika koneksi jaringan Anda cukup baik.

Kami akan melakukan streaming sinyal live yang ditranskode HLS (format video Apple yang didukung secara luas). File yang sesuai disebut main.m3u8 - yang merupakan manifes HLS. Manifes mengarah ke segmen video TS.

Untuk menggunakan VLC Player, buka https://www.videolan.org/vlc/ dan download versi pemutar untuk sistem operasi Laptop Anda - VLC tersedia untuk Windows, MacOSX, Linux, Android, dan iOS.

2a2d19abe728d222.png

Instal Pemutar di laptop Anda dan luncurkan. Kita akan menggunakan pemutar versi MacOSX untuk beberapa langkah berikutnya.

Untuk memutar video, buka "File" / "Open Network":

f85565301f7c68dc.png

Siapkan dengan:

  • URL: http://<Replace_With_Edge_Cache_IP>/main.m3u8. Ini adalah URL video yang ingin kita streaming. Pemberitahuan:
  • IP instance Media CDN: 34.105.35.246. Ganti dengan IP Cloud Media Service yang Anda deploy.
  • Jalur ke file video manifes: "/". Ini adalah jalur yang kami gunakan di bucket live-streaming-storage-$LOGNAME untuk menyimpan file sinyal live yang ditranskode. Jalurnya adalah jalur root di sini: "/".
  • Nama file video manifes: file manifes HLS, main.m3u8.

Lalu klik "Buka". Anda akan melihat video live yang ditranskode mulai diputar. Video akan terlihat seperti screenshot di bawah. Penghitung di layar akan berjalan dengan penambahan 1 dan Anda akan dapat mendengar bunyi bip yang terus-menerus.

Ini adalah sinyal live pengujian RTMP dasar yang dihasilkan oleh FFmpeg, ditranscoding ke HLS oleh Live Streaming API, dan ditayangkan melalui cache Media CDN:

28fc359b49d44ec2.png

Anda dapat menggunakan pemutar HLS dan MPEG DASH lainnya jika ingin melakukannya. Berikut beberapa pemutar yang dapat Anda pertimbangkan:

  • Pemutar Quicktime - diinstal secara default di Mac. Sama di sini: buka koneksi jaringan ke http://34.104.36.157/main.m3u8 - ganti alamat IP dengan salah satu instance Edge Cache Service Anda.

17. Memantau Media CDN

Template dasbor Media CDN dibuat oleh tim SME - https://gist.github.com/elithrar/1c511d00f5cd3736fb2a3897867209c1.

Untuk menginstalnya, jalankan perintah berikut di jendela Cloud Shell:

Download file YAML:

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

Buat dasbor untuk Cloud Monitoring:

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

Mungkin perlu waktu beberapa menit untuk menyiapkannya. Buka Konsol Google Cloud, lalu klik 3 garis > Operations > Monitoring > Dashboards. Anda akan melihat dasbor bernama "Media Edge Metrics". Klik metrik tersebut dan Anda akan melihat metrik:

d0821d84a88a928d.png

18. Membersihkan Lingkungan Lab

Selamat, Anda telah menyelesaikan lab. Di bagian ini, kita akan menghapus semua resource yang telah dibuat di seluruh lab.

Hentikan sinyal FFmpeg:

Tekan <CTRL+C> di terminal Cloud Shell tempat FFmpeg berjalan.

Menghentikan Channel Live Streaming:

Perintah

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"

Menghapus Channel Live Streaming:

Perintah

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"

Hapus Endpoint Input Live Streaming:

Perintah

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"

Hapus bucket GCS:

Perintah

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

Hapus Instance Layanan Cache Edge:

Perintah

gcloud edge-cache services delete cme-demo

Konfirmasi penghapusan dengan memasukkan "Y" saat diminta

Hapus Origin Cache Edge:

Perintah

gcloud edge-cache origins delete cme-origin

Konfirmasi penghapusan dengan memasukkan "Y" saat diminta

Menghapus Dasbor Kustom

Perintah

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