AWS Lambda から AppSync の API を ぶん殴る

r3_yamauchi
R3 Cloud Journey
Published in
6 min readDec 11, 2018

AWS の 年次カンファレンス “re:Invent” も終わり、2018年も年の瀬ですね。今年の特に後半はブログをサボりがちでしたが、また少しずつアウトプットしていけるようにしたいと思います。

今回は

というお題が来たので、AWS Lambda の関数の中から AppSync (GraphQL) の API にアクセスする方法をまとめます。

AWS AppSync については、これまでに何度か書きましたが GraphQL というクエリ言語を使ってアクセスする APIです。この一年で事例も多く出てきたので詳しいことはそちらに任せるとして、”GraphQL” や “クエリ言語” という単語のイメージに引きずられて拒絶反応を示されることがあるのが残念なところです。クライアントアプリで Flux や Redux をお使いであれば、それをそのままクラウド側に格納できる API だと考えると良いのではないかと思います。

AppSync (GraphQL) の APIにアクセスするのは API Gateway の API にアクセスする場合と同じで、基本的には HTTPでアクセスすれば良いだけです。したがって、(例えば Python用の boto3 など、)各言語用のAWS SDKに AppSync の GraphQL API を呼び出す機能は現在提供されていません。

ただ、それではちょっと不便なので、最近では Amplify を使用する例が多く見られますし推奨されています。これを使えば一行書けば AppSync の APIを呼べるのですが、Amplify に AppSync が統合される前は AppSync SDK というものを使っていました。

これを用いた例が 7月に行われた Meguro.dev での モヒカンのソリューション・アーキテクト塚田さんプレゼンに書かれています。

https://speakerdeck.com/akitsukada/real-time-voting-system-using-aws-appsync-aws-amplify-and-aws-iot-enterprise-button?slide=13

以下、色々書きましたが、

ElasticSearch の API を叩く場合などと同様に SigV4 を作って AppSync のエンドポイントに投げつければ良いということですね。IAM認証を使用する際は叩くAPIリソース に対する “appsync:GraphQL” アクションを許可するか、管理ポリシー AWSAppSyncInvokeFullAccess を付けてしまってください。

JS の例が
https://github.com/aws-samples/appsync-refarch-realtime/blob/master/sam-app/get-movie/app.js
にあるので参考にしてください。Python の例は末尾にあります。

以下は、元々書いていた内容です。

AppSync SDK for JavaScript を AWS Lambda 内で使用する際の注意点は
https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/building-a-client-app-node.html
に書かれています。

AWS AppSync integrates with the Apollo GraphQL client for building client applications. AWS provides Apollo plugins for offline support, authorization, and subscription handshaking. This tutorial shows how you can use the AWS AppSync SDK with the Apollo client directly in a Node.js application.

Note: For AWS Lambda functions, ensure you set fetchPolicy: ‘network-only’ as well as disableOffline: true in your AppSync client constructor.

前置きはこのくらいにして、Lambda 関数から AWS AppSync の API を叩くコードを見てみましょう。

まずはデータを投入する例(mutation)から

AWSAppSyncClient オブジェクトのインスタンスを作って、mutate メソッドに変数とGraphQLクエリを渡してやるだけです。

注意点として、前述の解説ページにあったように Lambda関数内では AppSync との間の通信がオフラインになることを考慮してもあまり意味がないので AWSAppSyncClient オブジェクトに disableOffline: true を渡す必要があります。(localStorage の Polyfill を入れればオフライン対応もできるかもしれませんが未確認です・・)

あとは Apollo Client が内部で fetch メソッドを使用しているので、fetch の Polyfill (何種類か存在しますがどれでも良いです)を入れる必要があります。

次はデータを取得する例

fetchPolicy に ‘network-only’ を指定する必要があります。

Cognito User Pools を使って認証する場合はこんな感じです。

最後に Python から AWS AppSync の API を叩く例を紹介します。

ElasticSearch の API を叩く場合などと同様に SigV4 を作って AppSync のエンドポイントに投げつければ良いということですね。IAM認証を使用する際は叩くAPIリソース に対する “appsync:GraphQL” アクションを許可するか、管理ポリシー AWSAppSyncInvokeFullAccess を付けてしまってください。

他の言語では試したことがないのですが、同じ要領で実行できると思います。

--

--

r3_yamauchi
R3 Cloud Journey

アールスリーインスティテュートで、これまでになかった画期的な kintoneカスタマイズサービス gusuku Customine(カスタマイン) を開発しています。kintone認定アプリデザイン/カスタマイズ スペシャリスト