실습: Media CDN의 서비스 확장 프로그램

1. 소개

최종 업데이트: 2024년 5월 1일

콘텐츠 전송 네트워크 (CDN)는 자주 액세스되는 콘텐츠를 최종 사용자에게 더 가까이 캐시하고, 클라이언트와 더 가까운 곳에서 연결을 종료하고, 원본에 대한 연결을 재사용하고, 최신 네트워킹 프로토콜 및 사용자 설정을 채택함으로써 사용자 성능을 개선합니다.

미디어 스트리밍을 위한 GCP의 글로벌 에지 네트워크인 Media CDN은 다양한 내장 또는 '핵심' 핵심 기능은 가장 일반적인 사용 사례에 대처하기 위한 것이지만, 이 핵심 기능 집합으로 해결되지 않은 요구사항이 있을 수도 있습니다.

Edge Programmability라고도 하는 Media CDN용 서비스 확장 프로그램을 사용하면 에지에서 자체 코드를 실행하여 Media CDN의 동작을 맞춤설정할 수 있습니다. 이를 통해 캐시 키 정규화, 커스텀 토큰 인증 및 토큰 취소, 추가 커스텀 로그 필드, A/B 테스트, 커스텀 오류 페이지 정규화 등 다양한 사용 사례를 활용할 수 있습니다.

빌드할 항목

이 Codelab에서는 Media CDN (CDN) + 서비스 확장 프로그램 (에지 프로그래밍 가능성) + Cloud Storage (CDN 소스)를 사용하여 Edge 컴퓨팅이 지원되는 CDN 전송 환경을 배포하는 단계를 살펴봅니다.

1f19151bdd96acb0.png

학습할 내용

  • Cloud Storage 버킷을 출처로 설정하여 Media CDN을 설정하는 방법
  • 맞춤 HTTP 인증으로 서비스 확장 프로그램 플러그인을 만들고 Media CDN과 연결하는 방법
  • 서비스 확장 프로그램 플러그인이 예상대로 작동하는지 확인하는 방법
  • (선택사항) 특정 플러그인 버전의 업데이트, 참조, 롤백, 삭제와 같은 서비스 확장 프로그램 플러그인을 관리하는 방법

필요한 항목

  • 기본 네트워킹 및 HTTP 지식
  • 기본 Unix/Linux 명령줄 지식

2. 시작하기 전에

Media CDN 허용 목록 요청 및 서비스 확장 프로그램 허용 목록

시작하기 전에 프로젝트가 Media CDN 및 Service Extensions용 Media CDN의 비공개 미리보기 허용 목록에 모두 추가되어 있는지 확인해야 합니다.

  • Media CDN 및 서비스 확장 프로그램 모두에 대한 액세스를 요청하려면 Google 계정팀에 문의하여 나를 대신하여 Media CDN 및 서비스 확장 프로그램에 대한 액세스 요청을 만드세요.

3. 설정 및 요구사항

Cloud Shell 시작

Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.

GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.

1dec6f9683153af0.png

환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.

de496bb88f9a0b10.png

가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습의 모든 작업은 브라우저만으로 수행할 수 있습니다.

시작하기 전에

IAM 역할 및 액세스

Media CDN 및 Artifact Registry 리소스를 만드는 데 필요한 Identity and Access Management (IAM) 권한은 다음과 같습니다.

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

Cloud Shell 내에서 project_id, project_num, location, repository 환경 변수가 설정되어 있는지 확인합니다.

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 사용 설정

Media CDN 사용 설정 및 서비스 확장 프로그램 API를 실행할 수 있습니다.

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 버킷 만들기

Media CDN 콘텐츠는 Cloud Storage 버킷, 서드 파티 스토리지 위치, 공개적으로 액세스할 수 있는 HTTP(HTTPS) 엔드포인트와 같은 위치에서 생성될 수 있습니다.

이 Codelab에서는 Cloud Storage 버킷에 콘텐츠를 저장합니다.

gsutil mb 명령어를 사용하여 버킷을 만듭니다.

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

원하는 경우 다음과 같이 GUI를 사용하여 Cloud Storage 버킷을 만들 수 있습니다.

  1. Google Cloud 콘솔에서 Cloud Storage 페이지로 이동합니다.
  2. 만들기 버튼을 클릭합니다.
  3. 버킷의 이름을 입력합니다. - 즉 'mediacdn-bucket-$PROJECT_ID'입니다.
  4. 나머지 설정은 기본값으로 둡니다.
  5. 만들기 버튼을 클릭합니다.

50475e01c5a3adbe.png

5. Cloud Storage 버킷에 테스트 객체 업로드

이제 Cloud Storage 버킷에 객체를 업로드합니다.

  1. Cloud Shell에서 파일을 만든 다음 gsutil을 사용하여 버킷에 업로드
echo media-cdn-service-extensions-test > file.txt

gsutil cp file.txt gs://mediacdn-bucket-$PROJECT_ID
  1. 버킷에 Media CDN 액세스 권한 부여
gsutil iam ch \
serviceAccount:service-$PROJECT_NUM@gcp-sa-mediaedgefill.iam.gserviceaccount.com:objectViewer gs://mediacdn-bucket-$PROJECT_ID

6. Media CDN 구성

다음으로 Media CDN 구성을 만듭니다.

각 Media CDN 구성은 다음 두 가지 기본 리소스로 구성됩니다.

  • EdgeCacheService: 클라이언트 연결 구성 (TLS, IP 주소 지정), 라우팅, CDN 구성 (캐시 모드, TTL, 서명), 보안 정책을 담당합니다.
  • EdgeCacheOrigin: 모든 HTTP 기반 출처의 출처별 구성 및 콘텐츠를 사용할 수 없거나 연결할 수 없는 경우의 재시도 조건을 담당합니다.

에지 캐시 출처 구성

이제 방금 만든 Cloud Storage 버킷을 가리키는 출처를 만들어 보겠습니다.

  1. Google Cloud 콘솔에서 Media CDN 페이지로 이동합니다.
  2. 출처 탭을 클릭합니다.
  3. 원본 만들기를 클릭합니다.
  4. 'cloud-storage-origin'을 입력합니다. 를 에지 캐시 출처의 이름으로 설정합니다.
  5. 원본 주소에서 다음 안내를 따릅니다.
  6. 'Google Cloud Storage 버킷 선택'을 선택합니다.
  7. 이름이 ‘mediacdn-bucket-$PROJECT_ID’인 Cloud Storage 버킷으로 이동합니다.
  8. 선택을 클릭합니다.
  9. 나머지 설정은 기본값으로 둡니다.
  10. 원본 만들기를 클릭합니다.

e6eb0faa94838c4.png

새로 생성된 EdgeCacheOrigin 리소스가 출처 페이지의 프로젝트의 출처 목록에 나타납니다.

에지 캐시 서비스 구성

  1. Google Cloud 콘솔에서 Media CDN 페이지로 이동합니다.
  2. 서비스 탭을 클릭합니다.
  3. 서비스 만들기를 클릭합니다.
  4. 고유한 서비스 이름을 입력합니다(예: ‘media-cdn’). 그리고 다음을 클릭합니다.

d2f9ac837bc5d45a.png

  1. 라우팅 섹션에서 호스트 규칙 추가를 클릭합니다.
  2. 와일드 카드('*')를 입력합니다. 를 입력합니다.

25d3e25000934e59.png

  1. 경로 규칙 추가를 클릭합니다.
  2. 우선순위에는 '1'을 지정합니다.
  3. 일치 조건 추가를 클릭하고 경로 일치에 대해 '접두사 일치'를 선택합니다. 검색 유형으로 '/'를 지정하세요. 경로 일치 입력란에 입력한 다음 완료를 클릭합니다.
  4. 기본 작업 아래에서 원본에서 가져오기를 선택한 다음 드롭다운 목록에서 구성한 출처를 선택합니다.

d1975f366233521a.png

  1. 고급 구성을 클릭하여 더 많은 구성 옵션을 확장합니다.
  2. 라우팅 작업에서 항목 추가를 클릭합니다. 그런 후 다음 작업을 수행합니다.
  3. 유형으로 'CDN 정책'을 선택합니다.
  4. 캐시 모드에서 '모두 캐시 강제 적용'을 선택합니다.
  5. 나머지는 기본값으로 둡니다.
  6. 완료를 클릭합니다.
  7. 저장을 클릭합니다.

b7e77d059db84ab6.png

  1. 서비스 만들기를 클릭합니다.

새로 생성된 EdgeCacheService 리소스는 프로젝트의 서비스 목록에 있는 서비스 페이지에 표시됩니다.

MediaCDN IP 주소 가져오기 및 테스트

  1. Google Cloud 콘솔에서 Media CDN 페이지로 이동합니다.
  2. Media CDN으로 이동
  3. 서비스 탭을 클릭합니다.
  4. 서비스의 주소 열을 참조하세요.

4031b6d1eac89041.png

서비스가 콘텐츠를 캐시하도록 올바르게 구성되었는지 테스트하려면 curl 명령줄 도구를 사용하여 요청을 실행하고 응답을 확인합니다.

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

이 명령어는 다음과 비슷한 출력을 생성합니다.

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

이제 Cloud Storage를 원본으로 사용하여 MediaCDN 배포를 성공적으로 만들었습니다.

7. 서비스 확장 프로그램용 Artifact Registry 구성

서비스 확장 프로그램을 만들기 전에 Artifact Registry를 구성해야 합니다. Artifact Registry는 빌드 아티팩트 관리를 위한 Google Cloud의 범용 패키지 관리자입니다. 서비스 확장 프로그램 (프록시-Wasm) 플러그인은 Artifact Registry에 게시됩니다. Artifact Registry에 게시하면 Proxy-Wasm 플러그인을 Media CDN 배포에 배포할 수 있습니다.

gcloud artifacts repositories create 명령어를 사용하여 저장소를 만듭니다.

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

필요에 따라 다음과 같이 GUI를 사용하여 저장소를 만들 수 있습니다.

  1. Google Cloud 콘솔에서 Artifact Registry 페이지로 이동합니다.
  2. + 저장소 만들기 버튼을 클릭합니다.
  3. 저장소 이름을 입력합니다. 즉, ‘service-extension-$PROJECT_ID’입니다.
  4. 형식 - ‘Docker’ 모드 - '표준', 위치 유형 - '지역', 'us-central1 (아이오와)'을 선택합니다.
  5. 만들기 버튼을 클릭합니다.

b525b3bc0867dc42.png

새로 만든 Artifact Registry 저장소 리소스가 저장소 페이지에 표시됩니다.

저장소 리소스가 생성되면 Cloud Shell에서 다음 명령어를 실행하여 이 저장소를 사용해 패키지를 푸시하고 가져오도록 Cloud Shell Docker 클라이언트를 구성합니다.

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

출력:

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

8. Media CDN에서 서비스 확장 프로그램 구성

이제 Rust 프로그래밍 언어를 사용하여 Media CDN에 배포할 수 있는 서비스 확장 프로그램 (프록시-Wasm) 플러그인을 작성하고 빌드하는 방법을 보여드리겠습니다.

이 예시에서는 각 HTTP 요청에 'secret' 값이 있는 승인 헤더가 포함되어 있는지 확인하는 Proxy-Wasm 플러그인을 만듭니다. 요청에 이 헤더가 없으면 플러그인은 HTTP 403 Forbidden 응답을 생성합니다.

서비스 확장 프로그램에 관해 간단히 다시 살펴보겠습니다. WasmAction, WasmPlugin, WasmPluginVersion이라는 세 가지 주요 리소스가 있습니다.

  • WasmAction 리소스는 Media CDN EdgeCacheService에 연결되는 리소스입니다. WasmAction은 WasmPlugin 리소스를 참조합니다.
  • WasmPlugin 리소스에는 현재 활성 WasmPluginVersion에 해당하는 main 버전이 있습니다.
  • WasmPluginVersions는 Artifact Registry의 컨테이너 이미지를 참조합니다. 프록시 Wasm 플러그인을 변경할 때 여러 WasmPluginVersion이 생성됩니다.

이러한 리소스 간의 관계를 더 잘 이해하려면 아래 다이어그램을 참조하세요.

22b3548b3a61c379.png

서비스 확장 프로그램 플러그인 작성 및 빌드

  1. https://www.rust-lang.org/tools/install의 안내에 따라 Rust 도구 모음을 설치합니다.
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  1. 다음으로, 다음 명령어를 실행하여 Rust 도구 모음에 Wasm 지원을 추가합니다.
rustup target add wasm32-wasi
  1. my-wasm-plugin이라는 Rust 패키지를 만듭니다.
cargo new --lib my-wasm-plugin

출력:

Created library `my-wasm-plugin` package
  1. my-wasm-plugin 디렉터리를 입력하면 Cargo.toml 파일과 src 디렉터리가 표시됩니다.
cd my-wasm-plugin
ls

출력:

Cargo.toml  src
  1. 다음으로, Cargo.toml 파일을 수정하여 Rust 패키지를 구성합니다. Cargo.toml 파일의 [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. 수정한 후 Cargo.toml 파일은 다음과 같이 표시됩니다.
[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 파일의 전체 콘텐츠를 Cloud Shell의 src 디렉터리에 있는 lib.rs 파일에 복사합니다.
  1. 수정한 후 lib.rs 파일은 다음과 같이 표시됩니다.
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 매니페스트 파일을 구성하고 lib.rs 파일에 프록시-Wasm 코드를 작성했으므로 Proxy-Wasm 플러그인을 빌드할 수 있습니다.
cargo build --release --target wasm32-wasi

빌드가 성공적으로 완료되면 아래와 같은 메시지가 표시됩니다.

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

target 디렉터리도 확인하고 파일이 생성되었는지 확인합니다.

ls ./target

다음과 같이 출력이 표시됩니다.

CACHEDIR.TAG release wasm32-wasi

Artifact Registry에 Proxy-Wasm 플러그인 게시

이제 Proxy-Wasm 플러그인을 Media CDN에 배포할 수 있도록 이전에 만든 Artifact Registry 저장소에 게시하겠습니다.

먼저 Proxy-Wasm 플러그인을 컨테이너 이미지에 패키징합니다.

  1. my-wasm-plugin이라는 동일한 디렉터리에 다음 콘텐츠가 포함된 Dockerfile라는 파일을 만듭니다.
FROM scratch 
COPY target/wasm32-wasi/release/my_wasm_plugin.wasm plugin.wasm
  1. 다음으로 컨테이너 이미지를 빌드합니다.
docker build --no-cache --platform wasm -t my-wasm-plugin .

(x86 이외의 프로세서만 해당) 다음으로 컨테이너 이미지를 빌드합니다.

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

출력

[+] Building 0.2s (5/5) FINISHED                                     docker:default
...
  1. 다음으로 게시하거나 '푸시'합니다. Proxy-Wasm 플러그인을 Artifact Registry로 바꿉니다. 컨테이너 이미지에 'prod' 태그 사이에 있어야 합니다.
docker tag my-wasm-plugin $LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/my-wasm-plugin:prod

이제 태그가 지정된 'prod'를 컨테이너 이미지를 저장소에 추가합니다

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

출력:

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

이제 Proxy-Wasm 플러그인의 컨테이너 이미지가 Artifact Registry에 성공적으로 푸시되었는지 확인해 보겠습니다. 다음과 비슷한 출력이 표시됩니다.

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

출력:

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 플러그인을 Media CDN 배포와 연결

이제 Proxy-Wasm 플러그인을 Media CDN 배포에 연결할 수 있습니다.

Proxy-Wasm 플러그인은 EdgeCacheService 리소스의 Media CDN 경로와 연결됩니다.

  1. 먼저 Proxy-Wasm 플러그인을 위한 Wasm-plugin 리소스를 만듭니다.
gcloud alpha service-extensions wasm-plugins create my-wasm-plugin-resource
  1. 다음으로 WasmPluginVersion을 만듭니다.
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. 다음으로 Proxy-Wasm 플러그인의 기본 버전을 지정합니다.
gcloud alpha service-extensions wasm-plugins update my-wasm-plugin-resource \
    --main-version=my-version-1

이제 Proxy-Wasm 플러그인이 Artifact Registry 저장소에 있는 컨테이너 이미지에 성공적으로 연결되었는지 확인합니다. 다음과 비슷한 출력이 표시됩니다.

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

출력:

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. 다음으로 Wasm 플러그인 리소스를 참조하는 WasmAction 리소스를 만듭니다.
gcloud alpha service-extensions wasm-actions create my-wasm-action-resource \
    --wasm-plugin=my-wasm-plugin-resource

WasmAction 리소스가 Proxy-Wasm 플러그인에 성공적으로 연결되었는지 확인해 보겠습니다. 비슷한 출력이 표시되어야 합니다.

gcloud alpha service-extensions wasm-actions list

출력:

NAME                                     WASMPLUGIN                                            
my-wasm-action-resource                  projects/805782461588/locations/global/wasmPlugins/myenvoyfilter-resource
...
  1. 이제 Media CDN EdgeCacheService의 구성을 내보내야 합니다.
gcloud edge-cache services export media-cdn --destination=my-service.yaml
  1. 그런 다음 my-service.yaml 파일을 열고 이전에 만든 WasmPlugin 리소스를 참조하는 지정된 경로의 routeActionwasmAction을 추가합니다.
wasmAction: "my-wasm-action-resource"
  1. 편집 후 my-service.yaml 파일은 다음과 같이 표시됩니다.
...

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. 그런 다음 Proxy-Wasm 구성으로 업데이트된 구성을 my-service-with-wasm.yaml 파일에 저장합니다.
  1. 마지막으로 프로덕션 Media CDN 환경을 위해 업데이트된 구성을 가져옵니다.
$ gcloud alpha edge-cache services import media-cdn --source=my-service-with-wasm.yaml

9. Media CDN에서 서비스 확장 프로그램 Proxy-Wasm 플러그인 유효성 검사

서비스가 콘텐츠를 캐시하도록 올바르게 구성되었는지 테스트하려면 curl 명령줄 도구를 사용하여 요청을 실행하고 응답을 확인합니다.

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

이 명령어는 다음과 비슷한 출력을 생성합니다.

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

이제 승인 헤더와 보안 비밀 값을 사용하여 요청을 다시 발행합니다.

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

이 명령어는 다음과 비슷한 출력을 생성합니다.

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

10. 선택사항: Proxy-Wasm 플러그인 관리

Proxy-Wasm 플러그인 업데이트

Proxy-Wasm 플러그인을 개선하거나 새 기능을 추가하면 업데이트된 플러그인을 Media CDN에 배포해야 합니다. 아래에서는 업데이트된 버전의 플러그인을 배포하는 단계를 진행하겠습니다.

예를 들어, 다음과 같이 코드를 수정하여 승인 헤더를 인증용 다른 값과 비교하여 평가하도록 샘플 플러그인 코드를 업데이트할 수 있습니다.

먼저 아래에 표시된 코드로 src/lib.rs 소스 파일을 업데이트합니다.

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

그런 다음 업데이트된 플러그인을 빌드, 패키징, 게시합니다.

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에서 컨테이너 이미지가 업데이트되면 새 WasmPluginVersion을 만든 다음 WasmPlugin의 기본 버전을 업데이트하여 새 버전을 참조해야 합니다.

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

이제 Artifact Registry에서 가져와 Media CDN 배포에 실시간으로 푸시할 컨테이너 이미지 버전을 성공적으로 업데이트했습니다.

이전 버전으로 롤백

이전 버전의 플러그인으로 롤백하려면 이전 버전을 참조하도록 Wasm 플러그인 리소스를 업데이트하면 됩니다.

먼저 사용 가능한 버전을 나열합니다.

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

다음과 같이 출력됩니다.

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

다음으로, 이전 버전 'a2a8ce'를 참조하도록 Wasm 플러그인 리소스를 업데이트합니다.

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

작업이 성공하면 다음과 같은 출력이 표시됩니다.

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

Media CDN은 새 Wasm-plugin 리소스가 생성될 때마다 Docker 이미지의 이미지 다이제스트를 저장하므로 롤백에는 마지막 출시 전에 실행되었던 코드 버전이 사용됩니다.

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

버전 'a2a8ce'의 경우 다이제스트 sha256:08c12가 있는 버전입니다.

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 삭제 및 WasmPlugin

WasmAction, WasmPlugin, 관련 WasmPluginVersion을 삭제하려면 다음 단계를 따르세요.

먼저 Media CDN EdgeCacheService 구성에서 WasmAction에 대한 참조를 삭제합니다.

삭제할 참조선:

wasmAction: "my-wasm-action-resource"

그런 다음 수정된 EdgeCacheService 구성을 업데이트합니다.

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

그런 다음 WasmPlugin의 기본 버전을 빈 문자열 ""로 업데이트합니다.

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

마지막으로 아래 삭제 단계를 순서대로 수행합니다.

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. 실습 환경 정리

Codelab을 완료한 후에는 실습 리소스를 반드시 삭제하세요. 그렇지 않으면 리소스가 계속 실행되고 비용이 발생합니다.

다음 명령어는 Media CDN EdgeCache 서비스, EdgeCache 구성, 서비스 확장 프로그램 플러그인을 삭제합니다. 아래 삭제 단계를 순서대로 수행합니다.

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

위의 각 명령어에서는 리소스 삭제를 확인하라는 메시지가 표시됩니다.

12. 축하합니다.

축하합니다. Media CDN의 서비스 확장 프로그램 Codelab을 완료했습니다.

학습한 내용

  • Cloud Storage 버킷을 출처로 설정하여 Media CDN을 설정하는 방법
  • 맞춤 HTTP 인증으로 서비스 확장 프로그램 플러그인을 만들고 Media CDN과 연결하는 방법
  • 서비스 확장 프로그램 플러그인이 예상대로 작동하는지 확인하는 방법
  • (선택사항) 특정 플러그인 버전의 업데이트, 참조, 롤백, 삭제와 같은 서비스 확장 프로그램 플러그인을 관리하는 방법

다음 단계

다음 Codelab을 확인하세요.

추가 자료

참조 문서