Posted at

Images API にはストレージオブジェクトの OWNER 権限が必要

More than 1 year has passed since last update.


Images API

Google App Engine では Images API という、とても便利な API が提供されています。

https://cloud.google.com/appengine/docs/standard/go/images/

これは Google Cloud Storage に保存された画像を、フォーマットやサイズを指定して配信してくれる画像プロキシのようなものです。

(日本だと、さくら&pixiv で ImageFlux というサービスが同じような機能を提供しています)


App Engine

App Engine から Google Cloud Storage に画像を保存して Images API を呼び出す場合は特に気にすることはありません。App Engine を作成すると、アプリ名(example.appspot.com)と同じ名前のバケットが Google Cloud Storage に作成され、そこに保存し、そこから Images API を使うだけです。


外からファイルをアップロードした場合

App Engine の外(ローカルや、別のマシン)からファイルをアップロードする場合は、適切な権限を設定する必要があります。

画像が READ 可能なだけでは Images API の呼び出しが失敗するので、オブジェクトの OWNER 権限を App Engine に対して付与します。App Engine はバケットに対して OWNER 権限を持っていますが、オブジェクトごとの ACL が優先になっている(外部からアップロードした場合、そのストレージオブジェクトの OWNER はアップロード者になる)ので、対象オブジェクトへの OWNER 権限は別途付与する必要があるようです。

App Engine のサービスアカウント "App Engine default service account" が example@appspot.gserviceaccount.com のような名前で存在していると思いますので、そのアカウントに対して OWNER 権限を付与します。

gsutil acl ch -u example@appspot.gserviceaccount.com:OWNER gs://example.appspot.com/your-image.jpg

これで、対象オブジェクトに対して Images API を使うことができます。