Google Photoを業務システムのクラウドストレージとして使った結果


はじめに

弊社で、お客さんから依頼を受けて開発している基幹システム(Web系)があるのですが、
業務の一部として、街に行って物件の写真を撮ってくるということを行っています。
この写真は、お客さんにとっては貴重な情報であり、日々の業務でも多用されるものです。

業務的な要件

各物件はシステムできちんと管理しており、撮影した写真もシステムで管理しております。
管理している写真は社内サーバにあり、格納している写真44000枚ほどでした。
これらをクラウドストレージに移行したいという依頼を受けました。
各画像はブラウザ上から見られる必要があります。
どのサービスを使うのかという話になったとき、Google Photoなら、圧縮すれば容量が無制限で使えるとのことで、使うことになりました。

ところが、仕様を調査したところ、いろいろと制約が多いことが判明しました。

日にち単位のアクセス制限がある

Google Photo APIの場合、1日のアクセス制限が2500アクセスのようで、44000枚もの写真データを一度に移行できませんでした。
そのため、一日2000~2250ほどまでアクセスするようにし、20日以上かけて定時バッチでアップロードしていくことになりました。

EXIF情報を登録できない

物件の写真はスマホで撮影し、物件の位置も知る必要があるため、写真のEXIFの位置情報を使います。
ところが、Google Photoに上げるとEXIF情報が保存できないのです。
物件の写真を撮った時に、その場でGoogle Photoに上げて、システムからGoogle Photoにアクセスして緯度経度を取得するということができません。
システムに写真を登録する際に、EXIF情報から緯度経度を取得し、DBに保存するという従来の方法を維持することになりました。

APIから削除ができない

APIに写真やアルバムの削除機能がありません。
間違えて写真をアップロードしたとき、API経由で削除ができません。
Google Photoのページから手動で削除する方法しかないのです。
そのため、
システムから削除された場合、写真を管理するDBのテーブルについては論理削除にし、削除されたやつについては適宜画面から削除することになりました。
早く削除機能が実装されることを祈ります。

プレビュー画像のURLが固定でない

画像を取得するとき、写真IDを元にしたURLではなく、
その都度URLが変わるため、いちいち問い合わせをしなければいません。
そのため、写真を1枚取得するには、2回アクセスをしなければいけないのです。

以下のようにMEDIA_ITEM_ID(写真アップロード時に取得したID)を指定して、写真を取得するには、レスポンスが返すbaseUrlにアクセスします。

APIからだと「元のサイズ」でしかアップロードできない

Google Photoには、アップロードのモードとして、「元のサイズ」と「高画質」という2つのモードがあります。
「元のサイズ」はアップロード画像を元のサイズのままアップロードし、この場合は容量を消費します。
「高画質」はGoogle独自の技術で高画質のまま画像を圧縮してアップロードします。冒頭で「容量無制限」と言いましたが、こちらのことです。
写真の移行作業を毎日行っていたとき、一週間くらいしたら、容量が足りなくエラーになってしまい、調査したら、元のサイズのままアップロードを繰り返し、容量を食いつぶしていたということがありました。
Google Photoの機能で、「容量を開放」という機能があるので、それを実施すれば全写真が「高画質」モードになります。
ただ、APIから「容量を開放」という機能がないため、手動でやらなければいけません。。

ID変更事件(2018年9月)

2018年8月末にシステムをリリースしてから数日後に事件が起きました。
お客さんから「写真が見れない」という問い合わせを受け、調査したところ、青ざめてしまいました。

9月5日のNotes
If you stored IDs (such as IDs for albums, media items or enrichment items) before 5 September 2018, they will no longer work as the format has changed. You will need to obtain new IDs for use in your application.

いわゆる、9月5日前に取得したIDは、リセットされているとのこと。
DBに写真IDを保持して、そのIDを元に写真を取得するというロジックのため、
業務システムから全ての写真がアクセスできなくなりました。
IDを振り直すことも考えましたが、特定できる情報がGoogle Photo側になく、
泣く泣くもう一度やり直すことになりました。
ただし、システムから写真を登録する時点では、アプリサーバに写真を保存してそれを参照し、夜間バッチでGoogle Photoにアップロードするというロジックになっていたため、写真が見れないということは避けられました。

まとめ

Google Photo APIは、Picasaから変わったAPIなので、まだ発展途上なのかもしれません。
データをきちんと管理をしなければいけない業務システムに使うには、注意が必要です。