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の共通化などをうまくやると複雑なフローが発生するような処理も簡単に構築できます。

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