Laboratuvar: Medya CDN'de Hizmet Uzantıları

1. Giriş

Last Updated: 2024-05-01

İçerik yayınlama ağları (CDN'ler), sık erişilen içerikleri son kullanıcılara daha yakın bir konumda önbelleğe alarak, bağlantıları istemcilere daha yakın bir konumda sonlandırarak, bağlantıları kaynağa yeniden kullanarak ve modern ağ protokollerini ve özelleştirmelerini benimseyerek kullanıcı performansını artırır.

Medya akışı için GCP'nin küresel uç ağı olan Media CDN, birçok yerleşik veya "temel" özellik sunar.Temel özellikler, en yaygın kullanım alanlarını ele almayı amaçlar ancak bu temel özellik seti tarafından ele alınmayan gereksinimleriniz de olabilir.

Bazen Edge Programmability olarak da adlandırılan Media CDN için Hizmet Uzantıları, Media CDN'nin davranışını özelleştirmek amacıyla kendi kodunuzu uçta çalıştırmanıza olanak tanır. Bu sayede, önbellek anahtarını normalleştirme, özel jeton kimlik doğrulaması ve jeton iptali, ek özel günlük alanları, A/B testi ve özel hata sayfası gibi ek kullanım alanlarından yararlanabilirsiniz.

Ne oluşturacaksınız?

Bu kod laboratuvarında, Media CDN (CDN) + Service Extensions (Edge Programmability) + Cloud Storage (CDN kaynağı) ile Edge Compute özellikli bir CDN yayın ortamı dağıtma adımlarını inceleyeceğiz.

1f19151bdd96acb0.png

Neler öğreneceksiniz?

  • Media CDN'yi, kaynak olarak ayarlanmış bir Cloud Storage paketiyle kullanma
  • Özel HTTP kimlik doğrulaması içeren bir hizmet uzantısı eklentisi oluşturma ve bunu Media CDN ile ilişkilendirme
  • Hizmet Uzantısı eklentisinin beklendiği gibi çalıştığını doğrulama
  • (İsteğe bağlı) Belirli bir eklenti sürümünü güncelleme, referans verme, geri alma ve silme gibi hizmet uzantısı eklentilerini yönetme

Gerekenler

  • Temel ağ iletişimi ve HTTP bilgisi
  • Temel düzeyde Unix/Linux komut satırı bilgisi

2. Başlamadan önce

Media CDN izin verilenler listesi ve hizmet uzantıları izin verilenler listesi isteği

Başlamadan önce projenizin hem Media CDN hem de Media CDN için Hizmet Uzantıları'nın özel önizleme izin verilenler listesine eklendiğinden emin olmanız gerekir.

  • Hem Media CDN'ye hem de Media CDN için Hizmet Uzantıları'na erişim isteğinde bulunmak üzere lütfen Google Hesap Ekibinizle iletişime geçerek Media CDN ve Hizmet Uzantıları için adınıza erişim isteği oluşturmasını isteyin.

3. Kurulum ve Gereksinimler

Cloud Shell'i başlatma

Google Cloud, dizüstü bilgisayarınızdan uzaktan çalıştırılabilir ancak bu codelab'de Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.

GCP Console'da sağ üstteki araç çubuğunda Cloud Shell simgesini tıklayın:

1dec6f9683153af0.png

Ortamın temel hazırlığı ve bağlanması yalnızca birkaç dakikanızı alır. İşlem tamamlandığında aşağıdakine benzer bir ekranla karşılaşırsınız:

de496bb88f9a0b10.png

Bu sanal makine, ihtiyaç duyacağınız tüm geliştirme araçlarını içerir. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışır. Bu sayede ağ performansı ve kimlik doğrulama önemli ölçüde güçlenir. Bu laboratuvardaki çalışmalarınızın tamamını yalnızca bir tarayıcı kullanarak yapabilirsiniz.

Başlamadan önce

IAM Rolleri ve Erişim

Media CDN ve Artifact Registry kaynakları oluşturmak için gereken Identity and Access Management (IAM) izinleri şunlardır:

  • roles/networkservices.edgeCacheAdmin
  • roles/networkservices.edgeCacheUser
  • roles/networkservices.edgeCacheViewer
  • roles/artifactregistry.repoAdmin

Cloud Shell'de project_id, project_num, location ve repository ortam değişkenlerinizin ayarlandığından emin olun.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
PROJECT_ID=[YOUR-PROJECT-NAME]
PROJECT_NUM=[YOUR-PROJECT-NUMBER]
LOCATION=us-central1
REPOSITORY=service-extension-$PROJECT_ID

API'leri etkinleştirme

Aşağıdaki komutları kullanarak Media CDN ve Hizmet Uzantıları API'lerini etkinleştirin.

gcloud services enable networkservices.googleapis.com
gcloud services enable networkactions.googleapis.com
gcloud services enable edgecache.googleapis.com
gcloud services enable artifactregistry.googleapis.com

4. Cloud Storage paketi oluşturma

Media CDN içeriği; Cloud Storage paketi, üçüncü taraf depolama konumu veya herkese açık erişilebilen herhangi bir HTTP(HTTPS) uç noktası gibi konumlardan gelebilir.

Bu codelab'de, içeriği Cloud Storage paketinde depolayacağız.

Paketi oluşturmak için gsutil mb komutunu kullanacağız.

gsutil mb gs://mediacdn-bucket-$PROJECT_ID

İsteğe bağlı olarak, aşağıdaki gibi GUI'yi kullanarak bir Cloud Storage paketi oluşturabilirsiniz:

  1. Google Cloud Console'da Cloud Storage sayfasına gidin.
  2. OLUŞTUR düğmesini tıklayın.
  3. Bucket için bir ad girin. - Örneğin, "mediacdn-bucket-$PROJECT_ID".
  4. Diğer ayarları varsayılan değerlerinde bırakın.
  5. OLUŞTUR düğmesini tıklayın.

50475e01c5a3adbe.png

5. Cloud Storage paketine bir test nesnesi yükleme

Şimdi Cloud Storage paketine bir nesne yükleyeceğiz.

  1. Cloud Shell'de bir dosya oluşturun ve gsutil kullanarak pakete yükleyin.
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. Pakete Media CDN erişimi verme
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

6. Media CDN'yi yapılandırma

Ardından, bir Media CDN yapılandırması oluşturacağız.

Her Media CDN yapılandırması iki ana kaynaktan oluşur:

  • EdgeCacheService: İstemciye yönelik yapılandırmadan (TLS, IP adresleme), yönlendirmeden, CDN yapılandırmasından (önbellek modları, TTL'ler, imzalama) ve güvenlik politikalarından sorumludur.
  • EdgeCacheOrigin: İçeriğin kullanılamadığı veya erişilemediği durumlarda yeniden deneme koşullarının yanı sıra HTTP tabanlı herhangi bir kaynak için kaynak başına yapılandırmadan sorumludur.

Bir Edge Cache Origin yapılandırma

Şimdi, yeni oluşturduğunuz Cloud Storage paketini işaret eden bir kaynak oluşturalım.

  1. Google Cloud Console'da Media CDN sayfasına gidin.
  2. KAYNAKLAR sekmesini tıklayın.
  3. CREATE ORIGIN'i (Kaynak Oluştur) tıklayın.
  4. Edge önbellek kaynağının adı olarak "cloud-storage-origin" girin.
  5. Kaynak adresi bölümünde:
  6. "Google Cloud Storage paketi seçin"i seçin.
  7. "mediacdn-bucket-$PROJECT_ID" adlı Cloud Storage paketine GÖZ ATIN.
  8. SEÇ'i tıklayın.
  9. Diğer ayarları varsayılan değerlerinde bırakın.
  10. CREATE ORIGIN'i (Kaynak Oluştur) tıklayın.

e6eb0faa94838c4.png

Yeni oluşturulan EdgeCacheOrigin kaynağı, Kaynaklar sayfasında projenizdeki kaynaklar listesinde görünür.

Edge Cache Service yapılandırma

  1. Google Cloud Console'da Media CDN sayfasına gidin.
  2. HİZMETLER sekmesini tıklayın.
  3. CREATE SERVICE'i (HİZMET OLUŞTUR) tıklayın.
  4. Hizmetiniz için benzersiz bir ad girin (ör. "media-cdn") ve ardından İleri'yi tıklayın.

d2f9ac837bc5d45a.png

  1. Yönlendirme bölümünde ADD HOST RULE'u (Ana makine kuralı ekle) tıklayın.
  2. Barındırıcılar alanına joker karakter olan "*" işaretini girin.

25d3e25000934e59.png

  1. YÖNLENDİRME KURALI EKLE'yi tıklayın.
  2. Öncelik için "1" değerini belirtin.
  3. EŞLEŞME KOŞULU EKLE'yi tıklayın. Yol eşleşmesi için Eşleme türü olarak "Önek eşleşmesi"ni seçin, Yol eşleşmesi alanında "/" karakterini belirtin ve Bitti'yi tıklayın.
  4. Birincil işlem bölümünde Bir Kaynaktan Getir'i seçin ve açılır listeden yapılandırdığınız kaynağı seçin.

d1975f366233521a.png

  1. Daha fazla yapılandırma seçeneğini genişletmek için GELİŞMİŞ YAPILANDIRMALAR'ı tıklayın.
  2. Rota işleminde ÖĞE EKLE'yi tıklayın. Ardından şunları yapın:
  3. Tür için "CDN politikası"nı seçin.
  4. Önbellek modu için "Tümünü önbelleğe almayı zorunlu kıl"ı seçin.
  5. Diğer ayarları varsayılan olarak bırakın.
  6. Bitti'yi tıklayın.
  7. Kaydet'i tıklayın.

b7e77d059db84ab6.png

  1. CREATE SERVICE'i (HİZMET OLUŞTUR) tıklayın.

Yeni oluşturulan EdgeCacheService kaynağı, projenizdeki hizmetlerin listelendiği Hizmetler sayfasında görünür.

MediaCDN IP adresini alma ve test etme

  1. Google Cloud Console'da Media CDN sayfasına gidin.
  2. Media CDN'ye gitme
  3. Hizmetler sekmesini tıklayın.
  4. Hizmetiniz için Adresler sütununa bakın.

4031b6d1eac89041.png

Hizmetinizin içeriği önbelleğe alacak şekilde doğru yapılandırıldığını test etmek için curl komut satırı aracını kullanarak istek gönderin ve yanıtları kontrol edin.

curl -svo /dev/null "http://MEDIA_CDN_IP_ADDRESS/file.txt"

Komut, aşağıdakine benzer bir çıkış üretmelidir:

< HTTP/2 200 OK
...
media-cdn-service-extensions-test
...

Artık Cloud Storage'ı kaynak olarak kullanarak MediaCDN dağıtımını başarıyla oluşturdunuz.

7. Hizmet uzantıları için Artifact Registry'yi yapılandırma

Hizmet uzantıları oluşturmadan önce Artifact Registry'yi yapılandırmamız gerekir. Artifact Registry, derleme yapılarını yönetmek için Google Cloud'un evrensel paket yöneticisidir. Hizmet uzantısı (Proxy-Wasm) eklentileri Artifact Registry'de yayınlanır. Proxy-Wasm eklentileri, Artifact Registry'ye yayınlandıktan sonra Media CDN dağıtımınıza dağıtılabilir.

Depoyu oluşturmak için gcloud artifacts repositories create komutunu kullanacağız.

gcloud artifacts repositories create service-extension-$PROJECT_ID \
    --repository-format=docker \
    --location=$LOCATION \
    --description="Repo for Service Extension" \
    --async

İsteğe bağlı olarak, aşağıdaki gibi GUI'yi kullanarak bir depo oluşturabilirsiniz:

  1. Google Cloud Console'da Artifact Registry sayfasına gidin.
  2. + DEPO OLUŞTUR düğmesini tıklayın.
  3. Depo için bir ad girin. Örneğin, "service-extension-$PROJECT_ID".
  4. Biçim: "Docker", Mod: "Standart", Konum Türü: "Bölge" ve "us-central1 (Iowa)"yı seçin.
  5. OLUŞTUR düğmesini tıklayın.

b525b3bc0867dc42.png

Yeni oluşturulan Artifact Registry Repository kaynağı, Depolar sayfasında görünmelidir.

Depo kaynağı oluşturulduktan sonra Cloud Shell docker istemcinizi bu depoyu kullanarak paketleri aktarıp çekecek şekilde yapılandırmak için Cloud Shell'de aşağıdaki komutu çalıştırın.

gcloud auth configure-docker $LOCATION-docker.pkg.dev

Çıkış:

...
Adding credentials for: us-central1-docker.pkg.dev
Docker configuration file updated.

8. Media CDN'de Hizmet Uzantılarını Yapılandırma

Şimdi, Rust programlama dilini kullanarak Media CDN'ye dağıtılabilen bir hizmet uzantısı (Proxy-Wasm) eklentisinin nasıl yazılacağını ve oluşturulacağını göstereceğiz.

Bu örnekte, her HTTP isteğinin "secret" değerine sahip bir Authorization başlığı içerdiğini doğrulayan bir Proxy-Wasm eklentisi oluşturacağız. İstek bu başlığı içermiyorsa eklenti, HTTP 403 Forbidden yanıtı oluşturur.

Hizmet uzantılarıyla ilgili kısa bir hatırlatma: Üç temel kaynak vardır: WasmAction, WasmPlugin ve WasmPluginVersion.

  • WasmAction kaynağı, Media CDN EdgeCacheService'inize eklenen kaynaktır. WasmAction, bir WasmPlugin kaynağına referans veriyor.
  • WasmPlugin kaynağının, etkin WasmPluginVersion'a karşılık gelen bir ana sürümü vardır.
  • WasmPluginVersions, Artifact Registry'deki bir container görüntüsüne referans verir. Proxy-wasm eklentilerinizde değişiklik yaptıkça farklı WasmPluginVersion'lar oluşturursunuz.

Bu kaynaklar arasındaki ilişkiyi daha iyi anlamak için lütfen aşağıdaki şemaya bakın.

22b3548b3a61c379.png

Hizmet Uzantısı eklentisi yazma ve oluşturma

  1. https://www.rust-lang.org/tools/install adresindeki talimatları uygulayarak Rust araç zincirini yükleyin.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. Ardından, aşağıdaki komutu çalıştırarak Rust araç zincirinize Wasm desteği ekleyin:
rustup target add wasm32-wasi
  1. my-wasm-plugin adlı bir Rust paketi oluşturun:
cargo new --lib my-wasm-plugin

Çıkış:

Created library `my-wasm-plugin` package
  1. my-wasm-plugin dizinini girin. Cargo.toml dosyası ve src dizini görünür.
cd my-wasm-plugin
ls

Çıkış:

Cargo.toml  src
  1. Ardından, Cargo.toml dosyasını düzenleyerek Rust paketinizi yapılandırın. Cargo.toml dosyasındaki [dependencies] satırından sonra aşağıdakileri ekleyin:
proxy-wasm = "0.2"
log = "0.4"

[lib]
crate-type = ["cdylib"]

[profile.release]
lto = true
opt-level = 3
codegen-units = 1
panic = "abort"
strip = "debuginfo"
  1. Düzenlemelerinizden sonra Cargo.toml dosyası yaklaşık olarak şu şekilde görünmelidir:
[package]
name = "my-wasm-plugin"
version = "0.1.0"
edition = "2021"

[dependencies]
proxy-wasm = "0.2"
log = "0.4"

[lib]
crate-type = ["cdylib"]

[profile.release]
lto = true
opt-level = 3
codegen-units = 1
panic = "abort"
strip = "debuginfo"
  1. . sample_code dosyasının tüm içeriğini Cloud Shell'deki src dizinindeki lib.rs dosyasına kopyalayın.
  1. Düzenlemelerinizden sonra lib.rs dosyası yaklaşık olarak şu şekilde görünmelidir:
use log::info;
use proxy_wasm::traits::*;
use proxy_wasm::types::*;

...

struct DemoPlugin;

impl HttpContext for DemoPlugin {
    fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
        if self.get_http_request_header("Authorization") == Some(String::from("secret")) {
            info!("Access granted.");
            Action::Continue
        } else {
            self.send_http_response(403, vec![], Some(b"Access forbidden.\n"));
            Action::Pause
        }
    }
}

impl Context for DemoPlugin {}
  1. Cargo.toml manifest dosyasını yapılandırdığımıza ve lib.rs dosyasında Proxy-Wasm kodumuzu yazdığımıza göre artık Proxy-Wasm eklentimizi oluşturabiliriz.
cargo build --release --target wasm32-wasi

Derleme başarıyla tamamlandığında aşağıdaki gibi bir mesaj görürsünüz:

Finished release [optimized] target(s) in 1.01s

Ayrıca, target dizinini doğrulayalım ve oluşturulan dosyaları kontrol edelim:

ls ./target

Aşağıda gösterildiği gibi bir çıkış görürsünüz:

CACHEDIR.TAG release wasm32-wasi

Artifact Registry'de Proxy-Wasm eklentisi yayınlama

Şimdi, Proxy-Wasm eklentimizi daha önce oluşturduğunuz Artifact Registry deposunda yayınlayacağız. Böylece eklenti, Media CDN'ye dağıtılabilecek.

Öncelikle Proxy-Wasm eklentilerini bir container görüntüsünde paketleriz.

  1. Aynı dizinde (my-wasm-plugin) aşağıdaki içeriklere sahip Dockerfile adlı bir dosya oluşturun:
FROM scratch 
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
  1. Ardından, kapsayıcı görüntüsünü oluşturun:
docker build --no-cache --platform wasm -t my-wasm-plugin .

(Yalnızca x86 olmayan işlemciler) Ardından, container görüntüsünü oluşturun:

docker build --no-cache --platform wasm --provenance=false -t my-wasm-plugin . 

Çıkış

[+] Building 0.2s (5/5) FINISHED                                     docker:default
...
  1. Ardından, Proxy-Wasm eklentinizi Artifact Registry'ye yayınlayın veya "push" edin. Kapsayıcı görüntümüzü "prod" etiketiyle etiketleyeceğiz.
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

Şimdi etiketlenmiş "prod" container görüntüsünü depoya aktaralım.

docker push $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

Çıkış:

The push refers to repository 
...
8564ddd9910a: Pushed 
prod: digest: sha256:f3ae4e392eb45393bfd9c200cf8c0c261762f7f39dde5c7cd4b9a8951c6f2812 size: 525

Şimdi Proxy-Wasm eklentisinin kapsayıcı görüntüsünün Artifact Registry'ye başarıyla aktarıldığını doğrulayalım. Aşağıdakine benzer bir çıkış görmeniz gerekir:

gcloud artifacts docker images list $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin --include-tags

Çıkış:

Listing items under project 
...
IMAGE                                         DIGEST           TAGS  CREATE_TIME          UPDATE_TIME
<LOCATION>-docker.pkg.dev/.../my-wasm-plugin  sha256:08c12...  prod  2021-11-10T23:31:27  2021-11-10T23:31:27

Proxy-Wasm eklentisini Media CDN dağıtımınızla ilişkilendirme

Artık Proxy-Wasm eklentisini Media CDN dağıtımınızla ilişkilendirmeye hazırız.

Proxy-Wasm eklentileri, EdgeCacheService kaynağındaki Media CDN rotalarıyla ilişkilendirilir.

  1. İlk olarak, Proxy-Wasm eklentimiz için bir Wasm-plugin kaynağı oluştururuz.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
  1. Ardından bir WasmPluginVersion oluştururuz.
gcloud alpha service-extensions wasm-plugin-versions create my-version-1 \
    --wasm-plugin=my-wasm-plugin-resource \
    --image="$LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod"
  1. Ardından, Proxy-Wasm eklentimizin ana sürümünü belirtiriz.
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-1

Şimdi Proxy-Wasm eklentisinin, Artifact Registry deposunda bulunan Container Image ile başarıyla ilişkilendirildiğini doğrulayalım. Aşağıdakine benzer bir çıkış görmelisiniz:

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

Çıkış:

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
...
  1. Ardından, Wasm eklenti kaynağımıza referans veren bir WasmAction kaynağı oluştururuz.
gcloud alpha service-extensions wasm-actions create my-wasm-action-resource \
    --wasm-plugin=my-wasm-plugin-resource

WasmAction kaynağının Proxy-Wasm eklentisiyle başarıyla ilişkilendirildiğini de doğrulayalım. Aşağıdakine benzer bir çıkış görmeniz gerekir:

gcloud alpha service-extensions wasm-actions list

Çıkış:

NAME                                     WASMPLUGIN                                            
my-wasm-action-resource                  projects/805782461588/locations/global/wasmPlugins/myenvoyfilter-resource
...
  1. Şimdi Media CDN EdgeCacheService'imizin yapılandırmasını dışa aktarmamız gerekiyor:
gcloud edge-cache services export media-cdn --destination=my-service.yaml
  1. Ardından, my-service.yaml dosyasını açın ve verilen rota için routeAction'a daha önce oluşturulan WasmPlugin kaynağına referans veren bir wasmAction ekleyin.
wasmAction: "my-wasm-action-resource"
  1. Düzenlemelerinizden sonra my-service.yaml dosyası yaklaşık olarak aşağıdaki gibi görünmelidir:
...

pathMatchers:
  - name: routes
    routeRules:
    - headerAction: {}
      matchRules:
      - prefixMatch: /
      origin: projects/<PROJECT_NUM>/locations/global/edgeCacheOrigins/cloud-storage-origin
      priority: '1'
      routeAction:
        cdnPolicy:
          cacheKeyPolicy: {}
          cacheMode: FORCE_CACHE_ALL
          defaultTtl: 3600s
          signedRequestMode: DISABLED
        wasmAction: "my-wasm-action-resource"
...
  1. Ardından, güncellenen yapılandırmayı Proxy-Wasm yapılandırmasıyla birlikte my-service-with-wasm.yaml dosyasına kaydederiz.
  1. Son olarak, üretim Media CDN ortamı için güncellenen yapılandırmayı içe aktarıyoruz:
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. Media CDN'de Hizmet Uzantıları Proxy-Wasm eklentisini doğrulama

Hizmetinizin içeriği önbelleğe alacak şekilde doğru yapılandırıldığını test etmek için curl komut satırı aracını kullanarak istek gönderin ve yanıtları kontrol edin.

curl -svo /dev/null "http://IP_ADDRESS/file.txt"

Komut, aşağıdakine benzer bir çıkış üretmelidir:

< HTTP/2 403 Forbidden
...
Access forbidden.
...

Şimdi isteği, yetkilendirme başlığı ve gizli değeriyle tekrar gönderin.

curl -svo /dev/null "http://IP_ADDRESS/file.txt" -H "Authorization: secret"

Komut, aşağıdakine benzer bir çıkış üretmelidir:

< HTTP/2 200 OK
...
media-cdn-service-extensions-test
...

10. İsteğe bağlı: Proxy-Wasm eklentilerini yönetme

Proxy-Wasm eklentisini güncelleme

Proxy-Wasm eklentilerinizde iyileştirmeler yaptıkça veya yeni işlevler ekledikçe güncellenen eklentilerinizi Media CDN'ye dağıtmanız gerekir. Aşağıda, bir eklentinin güncellenmiş sürümünü dağıtma adımları açıklanmaktadır.

Örneğin, kodu aşağıdaki gibi değiştirerek kimlik doğrulama için yetkilendirme başlığını başka bir değere göre değerlendirmek üzere örnek eklenti kodunu güncelleyebilirsiniz.

Öncelikle src/lib.rs kaynak dosyasını aşağıdaki kodla güncelleyin:

use log::{info, warn};
use proxy_wasm::traits::*;
use proxy_wasm::types::*;

...

struct DemoPlugin;

impl HttpContext for DemoPlugin {
    fn on_http_request_headers(&mut self, _: usize, _: bool) -> Action {
        if self.get_http_request_header("Authorization") == Some(String::from("another_secret")) {
            info!("Access granted.");
            Action::Continue
        } else {
            warn!("Access forbidden.");
            self.send_http_response(403, vec![], Some(b"Access forbidden.\n"));
            Action::Pause
        }
    }
}

impl Context for DemoPlugin {}

Ardından, güncellenen eklentiyi oluşturun, paketleyin ve yayınlayın:

cargo build --release --target wasm32-wasi
docker build --no-cache --platform wasm -t my-wasm-plugin .
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY/my-wasm-plugin:prod
docker push $LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY>/my-wasm-plugin:prod

Artifact Registry'de kapsayıcı resmi güncellendikten sonra yeni bir WasmPluginVersion oluşturmamız ve ardından WasmPlugin'in –main-version'ını yeni sürüme referans verecek şekilde güncellememiz gerekir.

gcloud alpha service-extensions wasm-plugin-versions create my-version-2 \
    --wasm-plugin=my-wasm-plugin-resource \
   --image="$LOCATION-docker.pkg.dev/$PROJECT_NUM/$REPOSITORY>/my-wasm-plugin:prod"
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-2

Artık Artifact Registry'den içe aktarılacak kapsayıcı görüntüsünün sürümünü başarıyla güncellediniz ve Media CDN dağıtımınızda yayınladınız.

Önceki bir sürüme geri dönme

Bir eklentinin önceki sürümüne geri dönmek için Wasm eklenti kaynağını önceki bir sürümü referans alacak şekilde güncelleyebilirsiniz.

Öncelikle, mevcut sürümleri listeleriz:

gcloud alpha service-extensions wasm-plugin-versions list --wasm-plugin=my-wasm-plugin-resource

Aşağıdaki çıkışı görürsünüz:

NAME   WASM_IMAGE WASM_IMAGE_DIGEST CONFIG_SIZE  CONFIG_IMAGE CONFIG_IMAGE_DIGEST UPDATE_TIME                                            
c7cfa2 <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:6d663... ... ... 
a2a8ce <LOCATION>-docker.pkg.dev/.../my-wasm-plugin@sha256:08c12... ... ... 

Ardından, Wasm eklenti kaynağını önceki sürüm olan "a2a8ce"ye referans verecek şekilde güncelleriz:

$ gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version="a2a8ce"

İşlem başarılı olduğunda şu çıkışı görürsünüz:

✓ WASM Plugin [my-wasm-plugin-resource] is now serving version "a2a8ce"

Media CDN, yeni bir Wasm-plugin kaynağı her oluşturulduğunda Docker görüntünüzün görüntü özetini kaydettiğinden geri alma işlemi, son dağıtımdan önce çalışan kodunuzun sürümünü kullanır.

gcloud alpha service-extensions wasm-plugins describe my-wasm-plugin-resource \
  --expand-config

"a2a8ce" sürümü için (özet sha256:08c12... olan sürüm):

name: "my-wasm-plugin-resource"
mainVersion: "a2a8ce"
mainVersionDetails:
  image: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin"
  imageDigest: "<LOCATION>-docker.pkg.dev/<PROJECT>/<REPOSITORY>/my-wasm-plugin@sha256:08c121dd7fd1e4d3a116a28300e9fc1fa41b2e9775620ebf3d96cb7119bd9976"

WasmAction ve WasmPlugin silme

WasmAction, WasmPlugin ve ilişkili WasmPluginVersions'ı silmek için lütfen aşağıdaki adımları uygulayın.

Öncelikle, Media CDN EdgeCacheService yapılandırmanızdaki WasmAction referansını kaldırın.

Kaldırılacak referans çizgisi:

wasmAction: "my-wasm-action-resource"

Ardından, düzenlenen EdgeCacheService yapılandırmasını güncelleriz.

gcloud alpha edge-cache services import prod-media-service --source=my-service.yaml

Ardından, WasmPlugin'inizin ana sürümünü boş bir dize "" olarak güncelleyin.

gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource --main-version=
""

Son olarak, aşağıdaki silme adımlarını sırayla uygulayın.

gcloud alpha service-extensions wasm-actions delete my-wasm-action-resource

gcloud alpha service-extensions wasm-plugin-versions delete my-version \ --wasm-plugin=my-wasm-plugin-resource

gcloud alpha service-extensions wasm-plugins delete my-wasm-plugin-resource

11. Laboratuvar ortamını temizleme

CodeLab'i tamamladıktan sonra laboratuvar kaynaklarını temizlemeyi unutmayın. Aksi takdirde, kaynaklar çalışmaya ve maliyet tahakkuk etmeye devam eder.

Aşağıdaki komutlar Media CDN EdgeCache Hizmeti'ni, EdgeCache Yapılandırması'nı ve Hizmet Uzantıları Eklentisi'ni siler. Aşağıdaki silme adımlarını sırayla uygulayın.

gcloud edge-cache services delete media-cdn

gcloud edge-cache origins delete cloud-storage-origin

gcloud alpha service-extensions wasm-actions delete my-wasm-action-resource

gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource --main-version=""

gcloud alpha service-extensions wasm-plugin-versions delete my-version-1 --wasm-plugin=my-wasm-plugin-resource

gcloud alpha service-extensions wasm-plugins delete my-wasm-plugin-resource

gcloud artifacts repositories delete service-extension-$PROJECT_ID --location=$LOCATION

Yukarıdaki komutların her biri, kaynağın silinmesini onaylamanızı ister.

12. Tebrikler!

Tebrikler! Media CDN'de Hizmet Uzantıları codelab'ini tamamladınız.

İşlediğimiz konular

  • Media CDN'yi, kaynak olarak ayarlanmış bir Cloud Storage paketiyle kullanma
  • Özel HTTP kimlik doğrulaması içeren bir hizmet uzantısı eklentisi oluşturma ve bunu Media CDN ile ilişkilendirme
  • Hizmet Uzantısı eklentisinin beklendiği gibi çalıştığını doğrulama
  • (İsteğe bağlı) Belirli bir eklenti sürümünü güncelleme, referans verme, geri alma ve silme gibi hizmet uzantısı eklentilerini yönetme

Yapabilecekleriniz

Şu codelab'lere göz atın:

Daha fazla bilgi

Referans belgeler