AppSheetからApigee経由でREST APIを呼び出す

はじめに

AppSheetを使うと、本当に簡単にノーコードでアプリを開発できます。ただ、手元のスプレッドシートを活用する個人用ではなく、企業内で統制をとりながら本格的に業務利用するには、API呼び出しによるビジネスロジックとの連携が必要になるでしょう。

ということで、最近正式にサポートされたApigeeによるREST連携が、どんな感じで使えるのか試してみました。 おそらくもっともシンプルな手順になっているかと思いますので、手短にAppSheet+Apigeeの動作検証してみたい方がいらっしゃれば、参考にしてみてください。

ゴール

AppSheetからApigeeデータソースを経由してREST APIを呼び出してみる。以下公式ページにある動画みたいなことを自分の環境でやりたい。 

https://help.appsheet.com/en/articles/4438873-apigee-data-source

前提

  • 一番手軽かつ安価に試せること。そのため、Apigeeは評価アカウントを利用すること。
  • AppSheetからApigeeへの接続には「Open APISpec」と「Manual」の二通りの方式があるが、AppSheet推奨の「Open APISpec」方式で試すこと。※ManualだとRead Onlyでデータの一覧取得しかできない
  • 呼び出すAPIはモック(固定の値を返す)。
  • (極力)コードを書かない!

事前準備

1.Apigee Edge 評価アカウントの作成

以下手順でApigee Edge の評価アカウントを作成します。評価アカウントは60日無料で利用できます。

https://docs.apigee.com/api-platform/get-started/create-account?hl=ja 

注意!Apigee は大きく、Google Cloudと統合されている「Apigee on Google Cloud」と、そうではない「Apigee Edge for Public Cloud」の2系統がある。当然コンセプトやツールの使い勝手はほぼ同じだが、前者の評価アカウントは、GCPVPC外部からの接続ができない(AppSheetから繋がらない)ので今回の評価では利用しなかった。というか途中で気が付いてEdgeに切り替えた。違いについて詳しく知りたい方は公式ドキュメントを参照。https://cloud.google.com/apigee/docs/api-platform/get-started/compare-apigee-products?hl=ja

2.テスト用APIの用意

テスト用のAPIを用意します。モックで構いません。ただしAppSheetから利用するには仕様に制限があるので注意してください。https://help.appsheet.com/en/articles/4438873-apigee-data-source にあるとおり、レスポンスがAppSheetのTable(RDBのような表形式)して扱える形式である必要があります。

特に、AppSheetでテーブル名として扱われる配列のプロパティ名設定を忘れないようにしましょう。以下画像のソース中の”persons”の部分です。

今回の検証ではCloud Functionsを利用したのですが(試す程度なので無償の範囲で収まる)、例えば、https://jsonplaceholder.typicode.com/  のようなサービスでも良いです。なんにせよ、ブラウザやテストクライアントツールを使ってこのAPIが値を返すことを確認できてから、検証に入ります。

f:id:HappymanOkajima:20210214181114p:plain

Cloud Functionsで作成したモックAPI

検証手順 

まずはApigee Edge側の設定です。実際は必ずしも以下手順通りでなくても良いのですが、最も早く筋がよさげなやり方でやってみました。

1.Specの作成

OpenAPI Spec3.0にてAPI仕様を書きます。メニューの「Develop > Specs > +Spec > New Spec」を実行すると、サンプルが表示された状態でエディタが起動するので、これを手直しする形で進めると簡単です。

参考:https://docs.apigee.com/api-platform/tutorials/create-api-proxy-openapi-spec

f:id:HappymanOkajima:20210214183942p:plain

Specエディタ。起動するとサンプルが表示される。

注意!サンプルでは「openapi: 3.0.3」とあるが、このままだと次のステップのAPI Proxy生成時にエラーとなる。openapi: 3.0.0 に修正すること。 

実際に作成したSpecは以下のGitHubリポジトリにあります。サンプルを元に作っているのでGETメソッドに対応するものしかなく、値を取得することしかできませんが、今回の検証には十分です。

https://github.com/HappymanOkajima/apigee-eval/blob/main/persons-mock-api.yaml

 仕様を書く上で大切なのが、serversと、paths。serversには実際のAPIのエンドポイントを指定し、今回だとCloud Functionsで作ったAPIのURLとなります。

なお、AppSheetはこのデータソース作成時にこのSpecを読むことで、APIがどのようなインターフェースなのか、つまりTableの名称やカラムについての情報を読み取る仕組みとなっています。一方「Manual」の場合はSpecがないので、接続先のApigeeのエンドポイントだけでなくテーブル名をResourece Pathとして別途指定してやる必要があります。

f:id:HappymanOkajima:20210214191248p:plain

AppSheetのApigeeデータソース設定(OpenAPI Spec)

2.API Proxyの作成

いよいよAppSheetから呼び出されるAPI Proxyを作りますが、ここではAPIのSpecから自動生成してみます。「Develop > API Proxies > +Proxy」を実行し、次に「Reverse Proxy(most commn)の下にある「Use OpenAPI Spec」をクリックし、表示されるポップアップのMy Specより、先ほど作成したSpecを選択します。 

f:id:HappymanOkajima:20210214184507p:plain

API Proxy作成画面

f:id:HappymanOkajima:20210214184707p:plain

Spec選択用ダイアログ

うまく行くと次のような画面が表示されます。必要な項目はSpecから読み取られ、あとは必要に応じて設定を見直していけばよいウィザードスタイルです。「Target(Exitsing API)」に、Specのserversで指定したものが設定されていることを確認し、「Next」をクリックします。

f:id:HappymanOkajima:20210214184829p:plain

API Proxy設定ウィザード画面

次はポリシー(Policies)の設定です。Apigeeのポリシーは柔軟かつ強力で、コードを書かず、かつ、ターゲットのAPIに手を加えずに、セキュリティやクオータ、キャッシュなどの機構を挟みこむことができるメカニズムです。

 

f:id:HappymanOkajima:20210214184929p:plain

ポリシー設定画面

AppSheetからの接続にはAPI Keyが必要となるので「Security:Authorization」を「API Key」に変更します。ポリシーは当然後から追加することも可能ですが、ここでやってしまうと少し楽になります。 

あとはウィザードに従い手順を進めます。

f:id:HappymanOkajima:20210214185020p:plain

オペレーション選択画面

f:id:HappymanOkajima:20210214185047p:plain

バーチャルホストの設定画面

f:id:HappymanOkajima:20210214185115p:plain

デプロイ前の確認画面。とりあえずtest環境のみデプロイする設定に

f:id:HappymanOkajima:20210214185233p:plain

設定完了。「Edit proxy」を実行

f:id:HappymanOkajima:20210214185320p:plain

デプロイ完了

3.APIキーの発行

AppSheetからの接続に必要となるAPIキーを発行するには、API Proxyに加え、「API Product」「App」「Developer」を作成する必要があります。APIキーは「App」の「Credentials」に設定されることになりますが、「App」を作るには「Product」と「Developer」が必要となるため、先にこれらを作ります。

f:id:HappymanOkajima:20210214185612p:plain

Apps設定画面のCredentialsグループに表示されるAPIキー

API Productを作る

メニューの「Publish > API Products +API Product」より、必要項目を入力しSaveします。大切なのは、「API proxies」で、ここで先ほど作成したAPI Proxyを選択します。

f:id:HappymanOkajima:20210214185715p:plain

API Product設定画面

f:id:HappymanOkajima:20210214185832p:plain

API resourceの選択ダイアログ

とりあえず他の項目は必要最低限の確認と設定としました。

Developerを作る

次に「Publish > Developers >+Developer」より、Developerを作成します。メールアドレスにはとりあえずApigee Edgeにログインしているものを指定すれば良いでしょう。

f:id:HappymanOkajima:20210214185931p:plain

Developerの設定画面
Appを作る

最後に「Publish > Apps > +App」より、Appの作成です。

f:id:HappymanOkajima:20210214190010p:plain

Appの設定画面

Developerには、先ほど作成したDeveloper(アカウント)を指定します。

Productには、同様に先ほど作成したProductを選択します。

f:id:HappymanOkajima:20210214190110p:plain

Product選択ダイアログ

その後Saveすると、CredentialsにAPIキー(Key)が表示されます。「Show」をクリックすると実際の値が表示されるので、これをAppSheetから指定することになります。(※ AppおよびAPIキーは、4.で説明するポータルからアカウント毎に作成することも可能です)

f:id:HappymanOkajima:20210214190203p:plain

App設定画面。Keyが表示された

3.ポリシーの修正

APIキーは作成できたましたが、実はまだこのままではAppSheetとApigeeは繋がりません。AppSheetはHTTPヘッダ(x-apikey)でAPIキーを指定する仕様ですが、先ほどウィザードでSpecから作成したAPI Proxy(のポリシー)は、クエリーパラメータでAPIキーを指定する動作となるからです。そのため、ポリシーの内容を手で若干修正し、HTTPヘッダによるキー受け渡しに変更する必要があります。

 手順は以下ドキュメントの「ベストプラクティス:HTTPヘッダでキーを渡す」に従えば良いので説明は割愛します。

 https://docs.apigee.com/api-platform/tutorials/secure-calls-your-api-through-api-key-validation?hl=ja#extracreditpassingthekeyinthehttpheader

4.Portalの作成

AppSheetから接続する前に、やっておきたいことがあります。Portal(開発者用の専用サイト)の作成です。メニューの「Publish > Portals > +Portal」から簡単に作成できて、このポータルから、AppSheetのデータソースを作成するときに必要な「OpenAPI Spec URL」をホストすることもできて便利です。

f:id:HappymanOkajima:20210214190259p:plain

Portal設定画面

まずは「API catalog」から設定しましょう。

f:id:HappymanOkajima:20210214190332p:plain

API catalog設定画面

「+」を押して、どのAPI Product用のポータルなのかを指定します。

f:id:HappymanOkajima:20210214190521p:plain

API productの選択ダイアログ

引き続き、適宜項目を設定します。「Source API spec」の指定を忘れないようにしましょう。これを指定することによって、開発者はポータルからAPIのSpecをダウンロードできるようになります。 

f:id:HappymanOkajima:20210214190404p:plain

API details設定画面

注意!Audienceの設定をデフォルトのアノニマスにしておかないと、この後の手順でAppSheetから「DOWNLOAD SPECのURL」を指定しValidateする際にエラーとなる。おそらくAppSheetがホストされているサーバーから読み取れないから。


あとは、Users の指定ですが、ポータルを利用するユーザーは、この画面からではなく、実際のポータルから登録します。画面右上の「Live Portal」を開いてください。

f:id:HappymanOkajima:20210214190844p:plain

Users設定画面。右上の「Live Portal」リンクを開く

すると次のようなページが表示されます。それっぽいですね。デザインなどもカスタマイズできますが、今回はそのままでいきます。

f:id:HappymanOkajima:20210214190940p:plain

開発者用ポータルページのトップ

まずは「Sign In」からアカウントを作成します。「Create an account」から直感的アカウントを登録できるので、そのままメールによるアクティベイトまで終わらせましょう。

 サインインし、「APIs」を見てみると、次のような画面が表示されるはずです。

f:id:HappymanOkajima:20210214191016p:plain

開発者用ポータルのAPIページ

f:id:HappymanOkajima:20210214191055p:plain

今回作成したAPIのページを見てみる

このページから実際にAPIをテスト実行したり、Spec を右上の「DOWNLOAD SPEC」からダウンロードできます。

 もちろんAppはポータルからも作成することができて、そこからAPIキーを入手することが可能です。ポータルの右上のアカウントのところがメニューになっており、そこから「Apps」を選択し、その後表示される画面から「+New App」を実行します。

f:id:HappymanOkajima:20210214191134p:plain

開発者ポータルからのApp登録

このような画面が表示されるので、利用したいAPIを「Enable」に設定し「CREATE」することで、Appが作成され、API Keyも作成されます。

5.AppSheetリソースの作成

いよいよ、AppSheetでの作業です。ここまでの手順で「Apigee API Key」と「OpenAPI Spec URL」は手に入っているはずなので、それぞれ、APIキーと、ポータルページの「DOWNLOAD SPEC」のURLをコピー&ペーストで入力し、「Validate」を実行します。

f:id:HappymanOkajima:20210214191248p:plain

AppSheetのApigeeデータソース設定(OpenAPI Spec)

順調に行けば、エラーメッセージが表示されず「Authorize Access」ボタンが押せるようになります。後は、以下AppSheetのマニュアルの動画通りに進めればOKでした。

 https://help.appsheet.com/en/articles/4438873-apigee-data-source

このような感じで、personsテーブルとしてApigee ProxyのAPIが表現されています。

f:id:HappymanOkajima:20210214191329p:plain

AppSheetの画面。Apigeeに接続できた

補足

AppSheetからManualで接続する場合

「Apigee API Base Path」には、API ProxyのURL(今回の場合はhttps://okajima-eval-test.apigee.net/persons-api)を、「API Resource Paths (comma separated)」には、テーブル名(今回の場合は persons )を設定します。

 今回作成した(ポリシーでHTTPヘッダによるAPIKey必須とした)API Proxyは当然指定する必要がありますが、実は「Apigee API Key」は必須ではありません。APIキー不要なAPI Proxyであれば、指定する必要はありません。

POST、PUT、DELETEを含むAPIの場合

ここまではGETのみのSpecで進めてきましたが、実務ではデータの追加や更新、削除を行うAPIも必要となります。例えば以下のようなSpecを準備し、ここまでの説明と同じような流れ(API Proxyを生成し…)で進めることができるので、試してみてください。

 https://github.com/HappymanOkajima/apigee-eval/blob/main/eval-mockapi.yaml

検証してみて

Apigee Edgeがプロキシとなることで、APIキーなどの制御を元々のAPI側で意識せずアドオンできるのがいい感じでした。また、Apigee Edgeはツールの使い勝手も良く、ドキュメントも日本語で充実しているのが嬉しいです。

 AppSheetからAPI呼び出しするには他にActionからのWebhook呼び出しを使う手もありますが、Webhookの性質上呼びっぱなしとなるので、企業内の既存システムと密に連携するならApigeeデータソースを使うのが良さそうですね。

Googleは Business Application Platform という動きを始めていますし、ノーコードと企業システムとの連携という意味では、AppSheet Automation 含め注目です。 

残課題

AppSheetから接続はできたものの、APIがモックなので「実際に値が更新できるのか?」「性能は?」などの検証はできていません。近々試してみたいと思います。

その他参考になったリソース

今回の記事はApigeeやOpenAPIの概念や用語の説明を省いています。必要に応じて以下のエントリなどを参考にしていただければと思います。