AppSync入門

###はじめに

AppSync初心者向けの操作解説します。
この記事ではコンソール操作とcurl実行まで。
### 作る

とりあえず「ウィザードで作成」ではじめてみます。

![スクリーンショット 2020-12-11 17.51.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/879de0b5-4638-1e3a-c5f1-1dd0fd9b9430.png)

すべてデフォルトの状態で進めていくとAppSyncができあがっています。API名はデフォルトで「My AppSync App」となっています。
また同時にDynamoDBも「MyModelTypeTable」というテーブルが新規で作成されています。

デフォルトでDBもセットで作ってくれるようですね。

### スキーマ画面の見方

作成したAppSyncに入ると左ペインに「スキーマ」というのがあります。（いっつも思うけど、ペインってなんだよ）
クリックすると下のような画面がでると思います。

![スクリーンショット 2020-12-11 17.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/9347043e-3a24-6195-f1d7-6cb88f5d1923.png)

ここがまぁわかりにくいのですが、デフォルトでいろいろと書かれているのが確認できてると思います。
APIの命令郡なのかなぁと思っています。

「input」と「type」という宣言詞っぽいものがみえます。
・inputは変数のオブジェクトを定義するものです。
・typeは命令を定義するものです。

typeで定義されているものは大きく３つあるようです。

|命令|意味|
|---|----
|query|問合せ処理（GETっぽい）|
|mutation|登録、削除、更新(POSTっぽい)|
|subscription|リアルタイム通信用？MQTTとか？|

#### mutation

Mutationの書き方をみてみましょう。

```
type Mutation {
	createMyModelType(input: CreateMyModelTypeInput!): MyModelType
	updateMyModelType(input: UpdateMyModelTypeInput!): MyModelType
	deleteMyModelType(input: DeleteMyModelTypeInput!): MyModelType
}
```

ここでは3つの命令(create,update,delete)を作成しています。

各セットには(input: CreateMyModelTypeInput!)みたいな文字があります。
これは以下（⬇️）の定義のことを示すようで、インプットに「title」というString型の変数？カラム名を使うようです。

```
input CreateMyModelTypeInput {
	title: String
}
```
これは実際にコンソール上でクエリを作る工程でイメージがつくとおもいます。

もうひとつポイントがあります。
3つの命令の文末に「MyModelType」というものが記載されています。
これは以下（⬇️）の定義のことを示すようで、daynamoのテーブル構造を示しているようです。
なので「createMyModelType」を実行する場合は、下記の2つのパラメータを定義することができます。


```
type MyModelType {
	id: ID!
	title: String
}
```

ちなみに各スキーマ内に記述されている「！」マークは必須項目を示します。

#### query

Queryをみてみましょう。

```
type Query {
	getMyModelType(id: ID!): MyModelType
	listMyModelTypes(filter: TableMyModelTypeFilterInput, limit: Int, nextToken: String): MyModelTypeConnection
}
```
ここでは2つの命令を作っています。

ここでも文末にオブジェクトが記述されています。

listMyModelTypesではnextTokenという指定がありますが、どうやらリレーションやページ分割といったやや高度な設定になるらしい。
https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/using-your-api.html

listMyModelTypesでFilterと定義されている箇所も別オブジェクトを参照している。

###リソルバの設定

ここはプチハマりしたのですが、リゾルバの設定について触れておきます。
下記の画面右側にresolversと記載されているのがあります。
ここにはSchema（画面左）で記述した命令が表示されています。

![スクリーンショット 2020-12-11 17.57.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/5beec879-1b5c-c5f6-a865-3acb97bdf5f2.png)

ためしにmutationをコピペして「createMyModelType2」をつくってみましょう。

![スクリーンショット 2020-12-11 18.59.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/05e2dfec-d928-c1e4-09ca-afd01fa2a9c8.png)

すると右側にはcreateMyModelType2が表示されています。
ほかにMutationたちはResolverに「MyModelTypeTable2」と書かれています。（デフォルトだと2はついてないのですが、私のサンプル画面だとついちゃってます）
これはDynamoDBのテーブルになります。

なので、コピペしてつくったcreateMyModelType2にも同様のテーブルを付与することができますし、
「データソース」で追加した既存テーブルを使うことができます。
つまりMutationと紐づくテーブルは1:1のようです。


###クエリしてみる

AppSyncにはコンソール上からスキーマで定義した命令を実行することが可能です。
やってみましょう。


まず空っぽのDynamoDBにデータを登録してみます。

![スクリーンショット 2020-12-11 19.10.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/428cf89f-ca96-b061-c7d5-01781840fcc4.png)


こんな感じで実行します。
Mutation選んで、createMyModelTypeを選んでtitleに「testdata1」といれています。
すべて左側のプルダウンしたのエリアで操作するこで、コードっぽいものが生成されました。

右側には実行結果がでてますね。IDは自動で付与されます。

ちゃんとDynamoにも入ってました。（ゴミデータがあってみづらいくてすいません）
![スクリーンショット 2020-12-11 19.19.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/7f102040-c826-72a0-f7d4-e1a0d73f4de0.png)


では、次にこの登録したデータを参照してみたいと思います。

![スクリーンショット 2020-12-11 19.15.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/5580a747-47da-2623-54ed-22a913f1caef.png)

はい。こんな感じでとれますね。ID指定は必須なんでちょっと長いですが、コピペしました。

ちなみに listMyModelTypesでフィルター検索も試してみます。

![スクリーンショット 2020-12-11 19.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/4b765d04-6c6a-493d-6dd8-cb258b6a0672.png)

filterの箇所に検索条件っぽいものがあったので、今回「beginWith」にIDの頭3文字をいれて検索してみました。
インデックスが数字だったらここで不等式で検索とかできる感じですね。

### curlからも実行してみる。

ということで、AppSyncのコンソール上では一応Dynamoに登録とか参照ができましたね。
実際にAPIとして操作していくことになるので、まずは初歩のCurlあたりを試してみましょう

AppSyncのAPIURlは「設定」から確認できます。

![スクリーンショット 2020-12-11 19.21.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319145/ed678be0-4d30-3c38-3faa-cb71f103af0d.png)

APIキーめっちゃ表示されてますが、すぐに消すので、、、、

AppSyncの認証認可はいくつか用意されていますが、APIキーはあまり商用環境ではおすすめできないのでテストだけに留めてくれればと思います。
ちなみにAPIキーはデフォ有効期限が1週間、最大365日でexpireします。
実際はCognito連携とかが多いかもですね。
参考：https://docs.aws.amazon.com/ja_jp/appsync/latest/devguide/security.html

ということでAPI URLとAPIキーがそろったので実行してみます。

```
curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:da2-muv7xqwvurebzbknzk4e4uuw232" -d '{ "query": "query {getMyModelType(id:\"3aacd1c9-e0fc-402f-b923-83a45a6f8b54\"){ title } } " }' https://byink3pajrfl7fmtz2eppnmfhm.appsync-api.ap-northeast-1.amazonaws.com/graphql
```

まぁ、ちょっと細かい解説はおいておきますが、こんな感じでcloud9とかvscodeから実行すれば値がとれます。

### まとめ

API-GatewayとLamdbaつかうより楽だけど、スキーマがまだちゃんと理解できていないですね。。
次回はAmplifyからcognito認証でたたいてみようと思います。