AWS AppSyncの新機能!Pipeline Resolver、Aurora Serverless Data Source、Delta Syncがサポートされました!

マネージドGraphQLサービスであるAWS AppSyncに新しい機能「Pipeline Resolver」「Aurora Serverless Data Source」「Delta Sync」が追加されました!早速「Pipeline Resolver」を試してみました。
2018.11.21

この記事は公開されてから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の共通化などをうまくやると複雑なフローが発生するような処理も簡単に構築できます。

ぜひぜひ使っていきましょう!