AWS AppSyncの新機能!Pipeline Resolver、Aurora Serverless Data Source、Delta Syncがサポートされました!
AWS AppSyncに熱いアップデート
マネージドGraphQLサービスであるAWS AppSyncに新しい機能が追加されました。
AWS AppSync releases Pipeline Resolvers, Aurora Serverless support, Delta Sync | AWS Mobile Blog
- Pipeline Resolver : 複数のResolverの組み合わせ
- Aurora Serverless Data Source : Aurora Serverlessをデータソースとして利用可能
- Delta Sync : キャッシュを2層に分割して同期する
いずれも熱いアップデートですね!
Pipeline Resolverを試してみた
早速Pipeline Resolverを試してみました。Pipeline Resolverは簡単に説明すると複数のResolverを束ねた、まとまったパイプライン状のResolverを構成する機能です。各ResolverのRequestとResponseはMapping Templateで制御しつつ、全体をBefore/AfterのMapping Templateで制御できます。
チュートリアルにある写真閲覧アプリを動かしてみます。
「One-Click Setup」の「Launch Stack」を選ぶとCloudFormation Stackを立ち上げることができます。Parameterには自分のメールアドレスを入れてください。
作成できました。
AppSyncのコンソールを開いてみると「AppSyncTutorial-PicturesViewer」というAPIが作成されています。
Data SourceはDynamoDBに picture
テーブルと friends
テーブルが用意されます。
Schemaはこんな感じです。「写真の追加」と「お友達の追加」のMutationがあります。
input CreatePictureInput { owner: ID! src: String! } type Mutation { createPicture(input: CreatePictureInput!): Picture! @aws_auth(cognito_groups: ["Admins"]) createFriendship(id: ID!, target: ID!): Boolean @aws_auth(cognito_groups: ["Admins"]) } type Picture { id: ID! owner: ID! src: String } type Query { getPicturesByOwner(id: ID!): [Picture] @aws_auth(cognito_groups: ["Admins","Viewers"]) } schema { query: Query mutation: Mutation }
SchemaからResolverを見てみると getPicturesByOwner
QueryのResolverに Pipeline が指定されていることが確認できます。
Pipelineの編集画面です。PipelineはBeforeとAfterのMapping Template(VTL)の間に複数のResolverを挟むことができます。各ResolverにもRequestとResponseのMapping Templateが設定できます。
試してみます。Query画面に「Login with User Pools」ボタンがあるのでクリックします。
ログインします。ClientIdはCloudFormation StackのOutputsで確認できます。
以降はCognito User Poolsで特定のユーザーで認証された状態でQueryやMutationが行えるようになります。
createPicture
を使って、yuki
(※自分) と shaggy
と rex
の写真を追加します。最終的に shaggy
をフレンドにし、フレンドの写真のみが検索できることを試します。
mutation { createPicture(input:{ owner: "nadia" src: "nadia.jpg" }) { id owner src } }
mutation { createPicture(input:{ owner: "shaggy" src: "shaggy.jpg" }) { id owner src } }
mutation { createPicture(input:{ owner: "rex" src: "rex.jpg" }) { id owner src } }
次に自分と shaggy
をフレンドにします。
mutation { createFriendship(id: "yuki", target: "shaggy") }
次に getPicturesByOwner
Queryを使います。フレンドである shaggy
の写真は検索できます。
query { getPicturesByOwner(id: "shaggy") { id owner src } }
{ "data": { "getPicturesByOwner": [ { "id": "fe31c958-f520-4d66-8de9-da3ccf1a61f1", "owner": "shaggy", "src": "src://shaggy.jpg" } ] } }
フレンドではない rex
の写真は検索できません。
query { getPicturesByOwner(id: "rex") { id owner src } }
{ "data": { "getPicturesByOwner": null }, "errors": [ { "path": [ "getPicturesByOwner" ], "data": null, "errorType": "Unauthorized", "errorInfo": null, "locations": [ { "line": 2, "column": 5, "sourceName": null } ], "message": "Not Authorized to access getPicturesByOwner on type Query" } ] }
AppSyncがより使いやすくなるアップデートです!
Pipeline Resolver、Aurora Serverless Data Source、Delta Syncはそれぞれ今まではめっちゃ頑張れば自作できたのですが、簡単に作れるようにサポートされたことで、要件に合った実装を実現することが容易になりました。特にPipeline ResolverはResolverの共通化などをうまくやると複雑なフローが発生するような処理も簡単に構築できます。
ぜひぜひ使っていきましょう!