DEVELOPMENT
目次
2020/05/15更新
- この記事の方法ですが、すみません、ダメでした。API自体を一緒にしないと別のDBを作成し参照してしまいます。
- DBテーブル名は以下の命名規則です
- (Schemeで指定したモデル名)(Ampilfy側で割り振りされた、APIのキー)(Amplifyのenv)
となりますので、当然、APIが異なれば、DynamoDBは別となります。
同じDBを参照したければ、/Amplify以下を共通化(submodule)化し、同じAmplifyを利用するしかなさそうです。
そのため以下は参考になりません。すみません。
はじめに
Amplifyを使うと、サーバーサイドの実装が楽になり、ローカルからコマンドを叩いていくだけで、簡単に実装できますね。
今回はAPIを作成し、DynamoDBからデータを読み書きする際、他のプロジェクトから同じDBテーブルを参照したいことがあるかと思います。これは可能なのか?疑問でしたが、試した所うまくいきました。
例)
- サービス側プロジェクト
- 管理ツール側プロジェクト
がよくあるかと思います。
この場合、管理ツールで設定したデータの内容をサービス側でも当然読み書きすると思います。こういう場合それぞれのプロジェクトで同じテーブルを参照したいですね。
また、それぞれAuth(Cognito)で認証している場合、それぞれを別の認証にしたいですよね。 これも可能でしたので、この手順をご紹介したいと思います。
※ 今回アプリケーションのコード自体の紹介はないんで、たまに出てくる例はVueですが、Reactや他のものでも、特に問題ありません
概要
- プロジェクトAとプロジェクトBの2つのプロジェクト
- それぞれのプロジェクトでAmplifyを使用、APIはGraphQLをAppSync上で実行する形
- APIに認証ほしいため(Auth(Cognito)で)、API自体のエンドポイントはそれぞれ別にする
- Amplifyの自体も別
- IAMは共通でOK
- 共通なのは、各プロジェクトで作成されるAPIから使用されるDynamoDBのテーブルのみ
- それ以外はすべて別となる
前提
-
Amplify導入済とAuth(ログイン認証)の追加
-
Amplify にAPIを追加(←これは普通にAPIを追加する手順なので、一読いただければOKです)
手順
- 予めAPIの名前を決めておく。ここでは「commonSample」とします
- 今回はサンプルで作成される、「Todo」テーブルを共有してみます
プロジェクトA
$ amplify add api
? Please select from one of the below mentioned services: (Use arrow keys)
❯ GraphQL
REST
? Provide API name: commonSample API名です
? Choose the default authorization type for the API
API key
❯ Amazon Cognito User Pool <- 今回はCognitoでログイン認証したユーザー向けのAPIなのでコレ
IAM
OpenID Connect
? Do you want to configure advanced settings for the GraphQL API (Use arrow keys)
❯ No, I am done.
Yes, I want to make some additional changes.
? Do you have an annotated GraphQL schema? (y/N) N
? Do you want a guided schema creation? (Y/n) Y
? What best describes your project:
❯ Single object with fields (e.g., “Todo” with ID, name, description) <- シンプルな一つのスキーマで試すならコレ
One-to-many relationship (e.g., “Blogs” with “Posts” and “Comments”)
Objects with fine-grained access control (e.g., a project management app with owner-based authorization)
? Do you want to edit the schema now? No
The following types do not have '@auth' enabled. Consider using @auth with @model
- Todo
Learn more about @auth here: https://aws-amplify.github.io/docs/cli-toolchain/graphql#auth
GraphQL schema compiled successfully.
Edit your schema at ~/amplify/backend/api/xxxxxxxx/schema.graphql or place .graphql files in a directory at ~/amplify/backend/api/xxxxxxxxx/schema
Successfully added resource xxxxxxxxxxxx locally
- すると色々と必要なファイルが生成されます
- 途中認証を聞かれるので、cognitoのpool idを指定
-
schemaは、「/amplify/backend/api/xxxxxxxxxxx/schema.graphql」となり、このファイルを元に、amplify pushした際にtableが作成されます
- schema
type Todo @model @auth(rules: [{allow: owner}]) {
id: ID!
name: String!
description: String
}
-
@authを追加するとログインしているユーザーのみデータ取得される形となる
- コード上で必要なmoduleは、上記schemaを元に「src/graphql/」以下に必要なmethodが自動で実装されます
ここまでで、プロジェクトAに「commonSample」というAPIを作成し、commonSampleAPIでTodo テーブルを参照しにいけるようになりました
- pushします
$ amplify push
プロジェクトB
こちらでも同じように、add apiをしますが、schemaを先に用意しておき、指定します。
-
まずプロジェクトAのschema.graphqlを持ってきます
$ mkdir amplify/backend/api/commonSample/ $ cp ../プロジェクトA/amplify/backend/api/commonSample/schema.graphql amplify/backend/api/commonSample/schema.graphql
- add apiします
$ amplify add api
? Please select from one of the below mentioned services: (Use arrow keys)
❯ GraphQL
REST
? Provide API name: commonSample API名です
? Choose the default authorization type for the API
API key
❯ Amazon Cognito User Pool <- 今回はCognitoでログイン認証したユーザー向けのAPIなのでコレ
IAM
OpenID Connect
? Do you want to configure advanced settings for the GraphQL API (Use arrow keys)
❯ No, I am done.
Yes, I want to make some additional changes.
? Do you have an annotated GraphQL schema? (y/N) y
> amplify/backend/api/commonSample/schema.graphql
ここでコレを指定する
あとは、基本y選択で進めます。
すると、API自体は(もちろんエンドポイントも)別となりますが、参照先のDBテーブルを一緒にすることが可能です。
- pushします
$ amplify push
要約
-
amplify add api した際、
- API名を統一する
- schemaの定義でtable名を同じにする
schemaを共通レポジトリにする
- この2つのプロジェクト共通のschema.graphqlファイル用レポジトリを作成する
- つまり共有するということは基本schemaは同じになるはずです
- そのため、それぞれのプロジェクトで別々に管理するのはナンセンスかもしれません
git のsubmoduleを使う
-
submoduleについてはこちら
-
新たなレポジトリを作成
- amplify/backend/api/commonSample/ 以下のみを管理する形
- ただ、上記Dir以下に、cognitoの認証の設定等も含まれているので、共有化したいのは、schema.graphqlファイルのみ
- .gitignoreを上手く使う
- 作成する(共通レポジトリのdir名はここでは、commonRepo)
$ cp -p プロジェクトA/amplify/backend/api/commonSample/* commonRepo/
- gitignoreファイル作成
build/
resolevers/
stacks/
parameters.json
transform.conf.json
- schema.graphqlファイル以外全部ですね。そうすることで、各プロジェクトからamplifyコマンドの実行時ファイルが上書きされても、schemaファイル以外影響ありません
-
commit
$ git add. $ git commit -m "first commit" $ git push origin master
各プロジェクトでの設定
- 一回 別dirに掃けておく
$ mv amplify/backend/api/commonSample amplify/backend/api/commonSample_tmp
- 一回消さないと submodule追加できないから消す。コミットまで
git rm -r amplify/backend/api/commonSample
git add .
git commit -m "remove api"
- submodule追加
git submodule add git@xxxxx.xxxx.xxx/xxxxx-xxxxxxx amplify/backend/api/commonSample
- 元のschema.graphql以外の必要だったファイルを履けてた_tmpから submodule dir の配下に移す
git amplify/backend/api/commonSample_tmp/* amplify/backend/api/commonSample/
- 移しても、.gitignoreでschema以外弾いているので、submoduleのリポジトリ的には影響しないが、amplifyとしてはちゃんと動くようになる
- 不要なものを消して、commit push
git rm -r amplify/backend/api/commonSample_tmp
git add .
git commit -m "add submodule for schema"
git push origin develop
運用時
更新を取得
- submoduleの最新もしくは内容を指定して取ってくる
- 基本更新があるかどうかは、root dirでgit statusで把握できる
- 更新がある場合、最新の状態にする場合
git submodule update --remote
- branchやcommit を指定して反映する場合はsubmodule dirに移動して通常通り gitコマンドで
cd amplify/backend/api/commonSample/
git pull xxxxx や
git checkout xxxxx等
更新する場合
cd amplify/backend/api/commonSample/
git add .
git commit
git push....
通常通りの操作
- これで2つのプロジェクトでDBのテーブルの共通化ができました
まとめ
- ドキュメントや記事が全くなく、ダメ元で試しましたが、上手く行きました。
- またAPI名は同じ名前にしたところで、別のAPIとして扱ってくれるので、それぞれでのCognito認証の掛かったAPIで、同じテーブルを参照できます
- こういう場面結構あると思いますが、Amplifyも実際に開発で使えますね。サーバーサイドの工数がぐんと下がるはずです
参考
株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。詳細はこちらから