Top / AWS Amplify 複数のプロジェクトで同じDBテーブルを共有する方法

AWS Amplify 複数のプロジェクトで同じDBテーブルを共有する方法
May 14, 2020

DEVELOPMENT

web
js
aws
amplify
vue
dynamoDB
AppSync
GraphQL

2020/05/15更新

  • この記事の方法ですが、すみません、ダメでした。API自体を一緒にしないと別のDBを作成し参照してしまいます。
  • DBテーブル名は以下の命名規則です
  • (Schemeで指定したモデル名)(Ampilfy側で割り振りされた、APIのキー)(Amplifyのenv)

となりますので、当然、APIが異なれば、DynamoDBは別となります。

同じDBを参照したければ、/Amplify以下を共通化(submodule)化し、同じAmplifyを利用するしかなさそうです。

そのため以下は参考になりません。すみません。

はじめに

Amplifyを使うと、サーバーサイドの実装が楽になり、ローカルからコマンドを叩いていくだけで、簡単に実装できますね。

今回はAPIを作成し、DynamoDBからデータを読み書きする際、他のプロジェクトから同じDBテーブルを参照したいことがあるかと思います。これは可能なのか?疑問でしたが、試した所うまくいきました。

例)

  • サービス側プロジェクト
  • 管理ツール側プロジェクト

がよくあるかと思います。

この場合、管理ツールで設定したデータの内容をサービス側でも当然読み書きすると思います。こういう場合それぞれのプロジェクトで同じテーブルを参照したいですね。

また、それぞれAuthCognito)で認証している場合、それぞれを別の認証にしたいですよね。 これも可能でしたので、この手順をご紹介したいと思います。

※ 今回アプリケーションのコード自体の紹介はないんで、たまに出てくる例はVueですが、Reactや他のものでも、特に問題ありません

概要

  • プロジェクトAとプロジェクトBの2つのプロジェクト
  • それぞれのプロジェクトでAmplifyを使用、APIはGraphQLAppSync上で実行する形
  • APIに認証ほしいため(AuthCognito)で)、API自体のエンドポイントはそれぞれ別にする
  • Amplifyの自体も別
  • IAMは共通でOK
  • 共通なのは、各プロジェクトで作成されるAPIから使用されるDynamoDBのテーブルのみ
  • それ以外はすべて別となる

前提

手順

  • 予め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
}

ここまでで、プロジェクト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株式会社UKAI
Nobuyuki Ukai

株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。詳細はこちらから

ホームページ作成、ECサイト掲載、商品ブランディング等、ご依頼やご相談は


CONACT
入力して下さい
WRITTEN BY
うかい / 株式会社UKAI
うかい@エンジニア出身CEO株式会社UKAI

Nobuyuki Ukai

株式会社UKAI 代表取締役CEO。建築を専攻していたが、新卒でYahoo!Japanにエンジニアとして入社。その後、転職、脱サラ、フリーランスエンジニアを経て、田舎へ移住し、ゲストハウスの開業、法人成り。ゲストハウス2軒、焼肉店、カフェ、食品製造業を運営しています。2020年コロナウイルスの影響で、ゲストハウスとカフェを閉店。現在は、ECサイト新規リリース、運営と、黒毛和牛の牝牛ブランディングをしメディア立ち上げ。牝牛のお肉と、独自食品開発した食品をまもなく販売開始予定。詳細はこちらから

COPYRIGHT © 2021 UKAI CO., LTD. ALL RIGHTS RESERVED.