使用AppSync和GraphQL操作DynamoDB

首先

有一天,当我谈到将我们公司的IoT.kyoto VIS应用在Serverless上进行替换时,有个人看了看架构后给出了建议:“API的部分为什么不用AppSync来实现呢?”因此,我就开始使用AppSync来学习GraphQL。
在这篇文章中,我们的目标是使用简单的GraphQL操作DynamoDB的数据,并将步骤一一记录下来。

GraphQL 是一种查询语言,可以用来描述和请求数据。

GraphQLはAPI用のクエリ言語であり、データ用に定義した型システムを使用してクエリを実行するためのサーバー側のランタイムです。
GraphQLは、特定のデータベースまたはストレージエンジンに結びついておらず、代わりに既存のコードとデータに基づいています。

引用:https://graphql.org/learn/

引文来源:https://graphql.org/learn/

嗯,感觉它可能会代替RESTAPI!

AppSync是什么

AWS AppSync では、ウェブアプリケーションやモバイルアプリケーション内のデータがリアルタイムで自動的に更新されます。
また、オフラインユーザーが再接続するとすぐにデータが更新されます。AWS AppSync により、応答性に優れた協働的なユーザーエクスペリエンスを実現できる、
共同のモバイルアプリケーションやウェブアプリケーションを簡単に構築できます。

AWS AppSync を使用すると、iOS、Android、JavaScript、React Native を使ってネイティブなモバイルアプリケーションやウェブアプリケーションを
構築できます。
AWS AppSync コンソールにアクセスし、シンプルなコードステートメントでアプリケーションのデータを指定して、使用を開始してください。
アプリケーションのデータの保存、処理、取得に必要なものすべては、AWS AppSync で管理されます。

请参考以下引用: https://aws.amazon.com/cn/appsync/

如果你在AWS上使用GraphQL,那么请将AppSync视为必备的工具。

角色入场

在AWSAppSync中,主要有这么多的角色出现。

image.png

应用程序编程接口

发出对已定义的GraphQL API的调用。
会生成一个用于调用的设置文件。

image.png

方案

GraphQL的定义是设置API和使用元素的类型定义等。

AWS AppSync Console 2018-11-06 18-11-14.png

解决者

API的作用是定义操作。

AWS AppSync Console 2018-11-06 18-11-53.png

这次的目标

我們會按照畫像的方式在DynamoDB進行PutItem。

DynamoDB · AWS Console 2018-11-06 18-00-22.png

开始工作!

创建API

AWS AppSync Console 2018-11-06 17-32-37.png
AWS AppSync Console 2018-11-06 17-35-03.png
AWS AppSync Console 2018-11-06 17-36-36.png

创建Schema

AWS AppSync Console 2018-11-06 17-37-52.png

我们将先创建一个DynamoDB表。只需要更改表名,其他设置将按默认配置创建表。

AWS AppSync Console 2018-11-06 17-39-15.png
AWS AppSync Console 2018-11-06 17-44-59.png
AWS AppSync Console 2018-11-06 17-47-34.png
AWS AppSync Console 2018-11-06 17-45-29.png

通过这个操作,DynamoDB会创建一个表。
同时,会自动生成这样的Schema。

AWS AppSync Console 2018-11-06 17-51-36.png

执行实际查询

AWS AppSync Console 2018-11-06 17-55-08.png

打开这个控制台界面后,您将看到左侧是用于输入GraphQL的区域,右侧则展示执行结果的区域。

AWS AppSync Console 2018-11-06 17-56-35.png

让我们尝试创建一个项目。
要进行创建,需要调用名为createMyCustomType的API。
为了调用上述API,需要什么呢?
如果查看模式,可以确认一下。

createMyCustomType(input: CreateMyCustomTypeInput!): MyCustomType

有这样的描述。由于写有「CreateMyCustomTypeInput!」,那么我们需要什么样的输入呢?让我们来确认一下「CreateMyCustomTypeInput」。

input CreateMyCustomTypeInput {
    title: String!
    content: String!
    price: Int
    rating: Float
}

因为写着这样,所以标题(title)和内容(content)是必需的。类型应为字符串(String),所以将以下文本粘贴到控制台屏幕的左侧。


mutation create {
  createMyCustomType(input: {
    title: "テストタイトル"
    content: "テストですよよよ。"
  }) {
    id
    title
    content
  }
}

点击左上角的执行按钮,


{
  "data": {
    "createMyCustomType": {
      "id": "2033baef-fb4e-4bf6-a155-f08775103994",
      "title": "テストタイトル",
      "content": "テストですよよよ。"
    }
  }
}

返回了这样的执行结果,并且将项目放置在了DynamoDB中。

DynamoDB · AWS Console 2018-11-06 18-00-22.png

让我们尝试获取创建的项目。将以下文本粘贴到控制台屏幕的左侧。


query list {
  listMyCustomTypes {
    items {
      id
      title
      content
    }
  }
}

当您点击左上角的执行按钮时,效果是相同的。


{
  "data": {
    "listMyCustomTypes": {
      "items": [
        {
          "id": "2033baef-fb4e-4bf6-a155-f08775103994",
          "title": "テストタイトル",
          "content": "テストですよよよ。"
        }
      ]
    }
  }
}

可以获取到类似上述的结果,并可以获取到创建的项目的信息。还有其他提供的API,可以尝试一下。使用方法与createMyCustomType相同。

type Mutation {
    createMyCustomType(input: CreateMyCustomTypeInput!): MyCustomType
    updateMyCustomType(input: UpdateMyCustomTypeInput!): MyCustomType
    deleteMyCustomType(input: DeleteMyCustomTypeInput!): MyCustomType
}

type Query {
    getMyCustomType(id: ID!): MyCustomType
    listMyCustomTypes(filter: TableMyCustomTypeFilterInput, limit: Int, nextToken: String): MyCustomTypeConnection
}

最后一点

这次介绍的只是一小部分。还可以自己制作API,设置多个数据源(如DynamoDB表),可以做许多不同的事情。
我自己还有很多事情没有尝试过,所以以后还要更深入地探索。
再见!

广告
将在 10 秒后关闭
bannerAds