👻

FileMakerでGCSにファイルをアップロードしたい

2021/12/09に公開

はじめに

とある事情によりFileMakerからGoogle Cloud Storage(GCS)にファイルをアップロードする必要が生まれました。さほど難しくはありませんでしたが、知らないとハマりそうなポイントもいくつかあったので、後学のために情報を共有しておきます。

認証・認可(OAuth2)

GCSに限らずGoogleのサービスを利用するには大抵の場合、認可(Authorization)が必要です。認可というのは特定の条件に対して、あるリソースにアクセスする権限を付与することをいいます。似たような言葉で認証(Authentication)というのがありますが、こちらは利用者が誰であるかを確認することを指します。認証と認可はセットで語られることが多く、混同されがちですが、概念としてはまったく別のものです。

今回やりたいことは、FileMakerアプリに対するGCSへのアクセス権限の付与なので、認証ではなく認可になります。

具体的な手順はこちらです。2年以上前に書いた記事ですがいまだに役立っています。

https://qiita.com/sikkim/items/f39ba5c8b800e7548cb6

上記の記事はGoogle Translation APIを利用するための手順なので、スコープの設定を下記のように変える必要があります。

export SCOPE=https://www.googleapis.com/auth/devstorage.read_write

GCPの全サービスを使いたい場合は下記のようにしてもよいでしょう。

export SCOPE=https://www.googleapis.com/auth/cloud-platform

記事のとおりに手を動かせばリフレッシュトークンが取得できたはずです。なお、取得したリフレッシュトークンは他人に見せてはいけません。

リフレッシュトークンからアクセストークンを生成する

ここからはFileMakerを使います。GoogleのAPIを利用するにはアクセストークンが必要ですが、アクセストークンは一定時間経つと失効してしまうので、実際にはリフレッシュトークンを利用して毎回生成します。リフレッシュトークンからアクセストークンを生成するスクリプトは下記のとおりです。

12行目のcURLオプションの設定はこのようになっています。

"-X POST
--data refresh_token=" & $REFRESH_TOKEN &
" --data client_id=" & $CLIENT_ID &
" --data client_secret=" & $CLIENT_SECRET &
" --data grant_type=refresh_token"

FileMakerのcURLオプションは結構雑に書いても動く場合が多いのですが、今回はかなりシビアで改行後のスペースをひとつ省略しただけで動かなかったので正確に書きましょう。

GCSへのオブジェクトアップロード

アクセストークンが取得できたらファイルをGCSにアップロードします。アップロード対象のファイルは事前にオブジェクトフィールドに格納してある想定です。スクリプトはこちらです。

今回は音声ファイルをアップロードしたため4行目でm4aという拡張子を付けています。実際には何でも構いません。

13行目のURLの生成はこのようになっています。

"https://storage.googleapis.com/upload/storage/v1/b/" & $BUCKET_NAME & "/o?uploadType=media&name=" & $OBJECT_NAME

14行目のcURLオプションはこのようになっています。

"-X POST
--data-binary @$image
-H \"Authorization: Bearer " & $access_token & "
-H \"Content-Type: audio/x-m4a\""

Content-Typeは省略しても多分大丈夫です。--data-binary @$imageという記述がありますが、FileMaker上のオブジェクトをバイナリデータとしてアップロードするには、このようにいったん変数に格納してから指定します。オブジェクトは12行目で変数$imageに代入しています。

これでFileMaker上の任意のファイルをGCSにアップロードすることができました。

Googleに限らずAPIを利用するとアプリケーションでできることの幅が広がります。使いこなせるようになると便利ですよ。

Discussion