Google App Engine의 Images API란 무엇입니까(+Go 샘플 구현)

Images API란?





Cloud Storage에 저장된 이미지에 대해 매개 변수를 사용하여 동적 크기를 조정하고 잘라내는 공개 URL을 게시합니다.

자전으로 화상의 리사이즈 처리를 쓰지 않아도, 간단하게 썸네일용의 화상등을 전달할 수 있어 매우 편리합니다.

서비스 URL 이미지 처리 매개 변수



URL의 끝에 =s32 와 같은 문자열을 붙여 동적으로 처리된 이미지를 얻을 수 있습니다.


처리
파라미터 예



너비 32px에 맞게 크기 조정http://lh*.googleusercontent.com/xxxxxxx=s32
32x32px 사각형으로 크기 조정 + 자르기http://lh*.googleusercontent.com/xxxxxxx=s32-c

Go로 구현해보기



Cloud Storage에 저장된 파일의 Serving URL을 생성하는 최소한의 Google App Engine 구현을 Go로 작성해 보았습니다.
package main

import (
    "context"
    "fmt"
    "google.golang.org/appengine"
    "google.golang.org/appengine/blobstore"
    "google.golang.org/appengine/image"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    // Cloud Storage のファイルの情報を次の2変数に入れる
    cloudStorageBucketID := "<BucketID>"
    cloudStorageObjectID := "<ObjectID>"

    servingURL, err := generateServingUrl(ctx, cloudStorageBucketID, cloudStorageObjectID)
    if err != nil {
        fmt.Fprintf(w, "[error!] %s", err)
        return
    }
    fmt.Fprintf(w, "Serving URL: %s", servingURL)
}

// Serving URL を生成する
func generateServingUrl(ctx context.Context, bucketID, objectID string) (string, error) {
    // Cloud Storage にあるファイルの指定方法は /gs/<bucketID>/<objectID> で決まっています
    // https://cloud.google.com/appengine/docs/standard/go/blobstore/reference#BlobKeyForFile
    gsURL := fmt.Sprintf("/gs/%s/%s", bucketID, objectID)

    // Cloud Storage の指定から Serving URL 生成に渡すためには blobstore key 形式で渡す必要があります
    // https://cloud.google.com/appengine/docs/standard/go/images/#serving_images_from_cloud_storage_using_the_blobstore_api
    blobKey, err := blobstore.BlobKeyForFile(ctx, gsURL)
    if err != nil {
        return "", err
    }

    // Serving URL を生成
    servingURLOpts := &image.ServingURLOptions{Secure: true}
    url, err := image.ServingURL(ctx, blobKey, servingURLOpts)
    if err != nil {
        return "", err
    }
    return url.String(), nil
}

이 코드를 App Engine에 배포한 후 액세스하면 Serving URL이 브라우저에 출력됩니다.



말미에 =s200 와 같이 파라미터를 붙여, 리사이즈 되는지 시험해 봅시다!



주의점



Images API는 App Engine에서만 사용할 수 있습니다.



Cloud Storage API에서 직접 할 수 있다고 생각했지만 Images API는 AppEngine의 API이므로 Cloud Storage API가 아니기 때문에 무리였습니다.

Cloud Storage 측에도 Images API 상당한 기능을 제공하고 싶다는 의견은 있는 것 같습니다. 앞으로 기대!
  • Provide image serving+resizing outside of standard environment - Google Issue Tracker
  • Get Serving URL for images stored in Storage (Similar to App Engine Image Class) · Issue #1295 · GoogleCloudPlatform/google-cloud-python

  • Serving URL은 누구나 액세스할 수 있습니다.



    생성되는 URL은 랜덤 캐릭터 라인이 붙어 있으므로, 추측은 어렵습니다만, URL 자체는 누구라도 액세스 할 수 있는 상태가 되어 있습니다.
    생성자의 cloud storage 객체가 비공개이어도, Servering URL 의 이미지는 항상 공개 상태가 됩니다.

    로컬 개발 서버에서 정상적인 Serving URL을 생성할 수 없음


    goapp serve 와 같은 로컬 개발 서버를 사용하면(자), 정상적인 Serving URL 는 생성되지 않고 다음과 같은 가의 URL이 됩니다.
    http://localhost:8080/_ah/img/encoded_gs_file:PEJ1Y2tldElEPi88T2JqZWN0SUQ-
    

    참고 사이트


  • Images Go API Overview
  • Uploading, Resizing and Serving images with Google Cloud Platform
  • GCP에서 이미지 파일 동적 크기 조정
  • 좋은 웹페이지 즐겨찾기