Files APIとは?
GAEに付属しているBlobstoreに対して、プログラムから操作を行うために用意されたAPIです。
BlobstoreにはBlobstore APIと呼ばれるモノも用意されていますが、このAPIでBlobstoreにデータを保存するには、ユーザーにWeb Formを提示して、そこからローカルファイルをUploadするといった手順が必要になり、プログラマブルにデータの保管ができません。
Files APIの終了スケジュール
詳細は以下のURLに掲載されています。
https://cloud.google.com/appengine/docs/deprecations/files_api
この記事を書いた日(2015/8/9)の状況は以下になります。
- 既に新規アプリケーションではFiles APIを使用不可
- 既存アプリケーションからの使用について、日本時間で1時と18時からそれぞれ1時間の間、時々使用不可
- 8/26からは24時間にわたって時々使用不可
- 9/9には完全シャットダウン
既存プログラムコード(Java)
実際に手を入れる必要があったコードは以下になります。
FileService fileService = FileServiceFactory.getFileService();
AppEngineFile file = fileService.createNewBlobFile("text/tab-separated-values", filename);
FileWriteChannel writeChannel = fileService.openWriteChannel(file, true);
int size = writeChannel.write(ByteBuffer.wrap(requestData.getRequestBytes()));
writeChannel.close();
writeChannel.closeFinally();
Files APIを使用して、リクエストに含まれたデータをBlobstoreに保管するまでの処理です。
改修後のプログラムコード(Java)
改修後のコードは以下になります。
GcsService gcsService = GcsServiceFactory.createGcsService();
GcsFilename gcsFileName = new GcsFilename(BUCKET_NAME, gcsObjectName);
GcsFileOptions options = new GcsFileOptions.Builder().mimeType("text/tab-separated-values").build();
GcsOutputChannel gcsWriteChannel = gcsService.createOrReplace(gcsFileName, options);
int size = gcsWriteChannel.write(ByteBuffer.wrap(requestData.getRequestBytes()));
gcsWriteChannel.close();
Files APIの後継として用意されたGCSライブラリを使用しています。
リクエストに含まれたデータをGCSに保管するまでの処理です。
おわりに
データの保管先がBlobstoreからGCSに変わりましたが、比較的簡単に移行できました。
各種APIの終了という事態は避けられないものですが、皆で情報共有しながら乗り越えていければと思います。