yasutomogのブログ

Software Engineerの雑記

複数のAmplifyプロジェクトを使った開発方法

トライビートという会社の札幌オフィスで開発全般やってます。
気づいたらもう12月ですね。
AWS Amplify Advent Calendar 2021のカレンダー2は、まだ空きが多いので、今年開発していく中で得た知見をメモとして残しておきます。

qiita.com

概要

  • Amplifyの複数envについては色々な記事で情報が公開されている
  • 複数のAmplifyプロジェクトを接続する記事をあまり見かけなかったので試行錯誤した
  • 実際のプロジェクトでやりたかったこと
    • 管理者サイトと一般ユーザー向けサイトを別々のAmplifyでプロジェクトで管理したい
    • AmplifyのBackend(Auth、API、Function、Storage)は共有したい
  • サブドメインとかで別々にhostingしたいんだけど、Backendはそもそも同じデータ層を扱うので、APIやFunction等で共有できるものは一元管理したい。

f:id:yasug:20211201001010p:plain

どう解決したか

  • 一般ユーザー向けサイトを普通にAmplifyプロジェクト(FrontendとBackend)で構築。
  • 管理者サイトは、Backendを用意せず、一般ユーザー向けサイトのBackendを参照させる流れで構築。

f:id:yasug:20211201002152p:plain

  • 具体的な方法は下記の公式ドキュメントが参考になりました。

docs.aws.amazon.com

  • ざっくりとした流れ
    1. まず最初に、一般ユーザー向けサイト(Backendを含むAmplifyプロジェクト)を通常のAmplifyプロジェクト構築の流れで作成
    2. 次に管理者向けサイトはフロントエンド部分のみ実装したプロジェクトを構築し、amplify init 等はせずに、 amplify pull をしてbackendに一般ユーザー向けサイトを選択する。
    3. Backendを紐付けるときに、「Do you plan on modifying this backend?」と聞かれるのは、「No」を選択し、管理者向けプロジェクトからはBackendの変更をできないようにする。
    4. あとは、ドキュメントに従い、Amplify Console上でhostingの設定をしていく

tips

  • 管理者向けサイトを amplify delete すると、一般ユーザー向けサイトのBackendも削除される。管理者向けサイト側のAmplifyプロジェクト(hostingのみ)削除されることを期待していましたが、そうではなく、接続しているBackendも削除されました。
  • Gitは別リポジトリで管理するようにした。モノレポでディレクトリで分ける構成も検討しましたが、管理者サイトのみ更新など、片一方のみビルド〜デプロイみたいなことができなそうだったので、リポジトリ毎分けるようにしました。
  • 一般ユーザー向けサイトで追加したAPIやFunctiionを、管理者サイトのフロントエンドから利用するとき、一手間必要でした。具体的には下記。
    • aws-export.js を一般ユーザーサイトから管理者サイトへコピーしてくる
    • schema.json を一般ユーザーサイトから管理者サイトへコピーしてくる
      • 以下のコマンドで最新のschema.json が取得できそうであるが、エラーとなったので手作業で頑張ってた
      • $ aws appsync get-introspection-schema --api-id <対象の AppSync の API ID> --format JSON schema.json
    • amplify codegen を叩き、API.tsやmutations.tsやqueries.ts などを生成する

感想と課題

  • APIやFunctionを共有できるのはいいが、管理者サイトでのみ必要なAPIやFunctionを追加するときに、一般ユーザーサイト側のコードを修正するのが結構しんどい。
  • 管理者サイトとプロジェクトを分けるというのは、ユースケースとしてはよくありそうなので、みんながどういう風にやっているか気になる
  • 今回の構成と直接関係があるか調査中だが、Functionを追加したときに、Lambdaに環境変数を付与すると、管理者向けサイトのAmplifyビルドがコケる。管理者サイトは参照のみのため、しっくりこないが、なぜかそうなるので調べているところ。