この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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の共通化などをうまくやると複雑なフローが発生するような処理も簡単に構築できます。
ぜひぜひ使っていきましょう!