約一年、Amplify を使い続けて得た知見
概要
実務にて、 AWS Amplify を約一年近く触りました。
Amplify と付き合って得た知見をまとめてみます。
前提
amplify cli を使用を前提としています。
まとめ
- 認証とデータストア系は、
import
オプションで Amplify 管理下に取り込もう - 外部ライブラリは、Lambda Layer で管理しよう
- Amplify のカスタマイズは慎重に検討しよう
- AWSリソースの手動運用や、独自 CDK (または Cloudformation)とのダブル運用も検討しよう
import
オプションで Amplify 管理下に取り込もう
認証とデータストア系は、 Amplifyがサポートする AWSリソースは、 amplify add
コマンドで手軽に作成できます。
amplify add
で追加したAWSリソースは、Amplify 環境を複製する場合、全部コピーされます。
しかし、複数人開発などで開発環境を複製する場合では、一部のリソースは複製せず共有したいことがあります。
- 主に Cognito , S3バケット、 DynamoDB
そもそもなぜ、複数人開発時に Amplify 環境を複製したくなるのか、こういったときにどうするべきかをまとめます。
複数人で、一つの開発環境を共有する問題
git でいう conflict が発生するような状況において、 Amplify では特に conflict は発生せず、最後にデプロイした情報で上書きされます。
これは、誰かが動作確認のためにデプロイしたコードを、他の誰かが上書きする可能性を示唆します。
幸い、 Amplify は同一構成の環境を簡単に複製できます。
そのため、開発者一人一人に個別の Amplify 環境を構築することで、上書き問題は解決出来ます。
一方で、そのまま複製する場合は、次に述べる注意点があります。
開発者一人一人、専用の Amplify 環境を作成する際の注意点
Amplify 環境を複製する場合、 amplify add
で追加したAWSリソースは、全て新規作成と言いう形でコピーされます。
Lambda や API Gateway は望むところですが、一部のAWSリソースは開発者全員で共有したい場合があります。
- 具体的には、 Cognito 、S3バケット、 DynamoDB 辺り
◆Amplify 管理下から除外して複製を避ける
この問題は、 複製したくないAWSリソースを、予め Amplify 管理下から除外することで避けることが出来ます。
cognito の場合、 amplify remove auth
コマンドで除外できます。
- この際、cognito リソースは削除されず、Amplifyとのリンクが切れるだけ
詳細は、以下公式ドキュメントをご確認ください。
他のリソースも、公式ドキュメントを参考に、 Amplify 管理下から除外する(≒ Amplify とのリンクを切る)ことが出来ます。
しかし、S3 , Cognito , DynamoDB は、Amplify SDK から参照するために、Amplify 管理下において置きたい場合がほとんどだと思います。
◆複製したくないが、Amplify 管理下には置きたい場合
Amplify は、 amplify import
コマンドにて、 AmplifyがサポートするAWSリソースを取り込むことが出来ます。
そして、 amplify import
コマンドで取り込んだ AWSリソースは、Amplify 環境複製の際にコピーされません。
以下の公式ドキュメントにて、 cognito を複数の Amplify 環境で共有する手段の概要が記載されています。
まとめると ... ?
- Amplify を使って複数人で開発する場合、開発者一人一人専用の環境を用意すると、開発が捗る
- 開発環境複製の際、開発者全員で共有したい(≒複製したくない)リソースは、以下の手順で Amplify との関連を弱める
-
remove
オプションで、Amplify 管理下から外す- AWS リソース本体は削除されない
-
import
オプションで、Amplify 管理下に戻す- Amplify を使用する前から作成している AWSリソースも、 (Amplify サポート対象なら) 取り込み可能
-
import
で取り込んだAWSリソースは、add
で追加した時と違い、Amplify環境を複製してもコピーされません。
これで、気兼ねなく Amplify 環境を複製できます。
外部ライブラリは、 Lambda Layer で管理しよう
Lambda コードを開発する場合、npm
などで外部のライブラリを追加することは頻繁にあります。
この時、外部ライブラリは、専用の LambdaLayer を設けて管理することで、開発効率が向上します。
Lambdaコードと一緒に管理する場合の問題点
Lambda 関数デプロイ時、Lambda 関数に付随する形でライブラリも一緒にデプロイされます。
これにより、以下の問題が発生します。
- デプロイ速度の低下
- 一緒にデプロイするライブラリの分だけ通信量が増え、その分デプロイ速度が低下する
- マネジメントコンソールからコードを確認できない
- デプロイする Lambdaコードとライブラリのデータ量が3MBを超えると、マネジメントコンソールからコードを確認・編集できなくなる
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution
特に、マネジメントコンソールからコードを確認・編集できない点が問題です。
◆そもそもマネジメントコンソールからコードを確認・編集ことはあるのか
Amplify で管理するリソースが増えるにつれて、Amplify のデプロイ速度そのものが低下します。
- ちょっとした変更でも、デプロイ完了までに数分要する
これは、一度のトライアンドエラーの度に、数分待たされることを意味します。
この時、マネジメントコンソールからコードを確認・編集できると、該当コードをさっと修正・手動デプロイして動作確認できます。
つまり、トライアンドエラーの速度が向上し、総じて開発効率が向上します。
◆マネジメントコンソールから編集する際の注意点
マネジメントコンソールから加えた編集は、 Amplify デプロイ時に全て上書きされます。
編集結果をAmplify 配下に取り込むには、問題のない事を確認できたコードを、Amplify 管理下の Lambda ソースコードにも反映させる必要があります。
マネジメントコンソール経由の編集は、時間のかかる amplify push
を待ちたくないような、以下のようなユースケースで使用するものだとお考え下さい。
- コードのちょっとした調整
- 軽微なバグ修正
- 頻繁に繰り返すトライアンドエラー
こうして満足のいくコードを作成できたら、変更箇所は忘れずに Amplify 管理下の Lambda ソースコードにも反映させましょう。
外部ライブラリ専用の LambdaLayer を設けて管理する
外部ライブラリ専用の LambdaLayer を設け、そこで外部ライブラリを管理します。
後は、外部ライブラリを使用したい Lambda関数に、 LambdaLayer を紐づけるだけです。
これにより、以下の効果が得られます。
- Lambda関数本体と LambdaLayer は別々にデプロイできるようになる
- Lambda関数本体のデータ量を軽量に保つことが出来る
- Lambda関数のデプロイ速度が向上
- (3MBを越えなければ) マネジメントコンソールからコードを確認・編集できる
公式ドキュメントに、Amplify cli から LambdaLayer を(作成方法を含め)Lambda 関数に関連付ける方法が記載されています。
まとめると ... ?
外部ライブラリは、専用の LambdaLayer を設けて管理しましょう。
これにより、開発効率が向上します。
- Lambdaのマネジメントコンソールからコードをトライアンドエラーできる
- 時間のかかる
amaplify push
を待たずにコードを試行錯誤できるため、開発速度が向上する
- 時間のかかる
Amplify のカスタマイズは慎重に検討しよう
Amplify がサポートするAWSリソースは決して多くありません。
そのため、Amplify 未サポートのAWSリソースを Amplify で扱う手段がいくつか用意されています。
- Amplify 未サポートのAWSリソースを Amplify で管理したい
- 自作 CDK 、自作 Cloudformation を Amplify に取り込む
- Amplify で作成したAWSリソースをカスタマイズしたい
-
override
オプションにて、設定を上書き - ☠️Amplify が生成した Cloudformation テンプレートを直接編集☠️
-
カスタマイズのつらみ
いざ上記手段でカスタマイズを試みると、以下のような問題に直面します。
- 運用・保守が大変
- Web上に情報が少ない
- 公式ドキュメント
- やってみた系の記事
これにより、 amplify の管理に大きく消耗することとなります。
◆運用・保守が大変
Amplify の実態は Cloudformation です。
そんな Amplify をカスタマイズするため、発生するエラーも、 Cloudformation 由来のものが中心となります。
当然、トラブルシュートに、 Cloudformation の知識が必要となります。
また、Amplify は、デプロイ時に発生したエラーのロールバックが非常に遅いです。
- Amplify の実態が Cloudformation であることを思い出してください
- Cloudformation を触ったことがある方なら覚えがあるかと思います
そのため、一回のトライアンドエラーに数分(下手するとそれ以上)の時間を要します。
◆Web上に情報が少ない
Amplify カスタマイズの「やってみた系」記事は決して多くありません。
そのため、トラブルシュート時やカスタマイズ実装時(特に override
系)は公式ドキュメントが頼りとなるのですが、公式ドキュメントだけでは解決出来ない問題も発生し得ます。
本当にカスタマイズする必要はあるのか
Amplify を使い始める動機の多くは「スモールスタート」にあると思います。
しかし、Amplify をカスタマイズした結果、カスタマイズやその後の運用・保守に消耗するようになります。
せっかくクラウドインフラを Amplify にまかせて機能実装に注力しようと Amplify を選択したのに、Amplify の管理に時間を取られる ... 。
これでは本末転倒です。
いきなりカスタマイズに走るのではなく、以下の代替案を検討することをお勧めします。
- 手動運用
- Amplify 未サポートのAWSリソースは、管理コンソールなどで手動作成する
- 手順書を作成・適切に管理することで、誰でも対応できる
- 更新頻度が少ない場合は有効
- 独自 CDK,Cloudformation を Amplify に取り込まずに運用する
- Amplify と 独自CDK,Cloudformation のダブル運用
- デプロイの手間は多少増えるが、AWSリソースの依存関係を制御しやすい
- AWSリソース依存関係にまつわる CloudFormation エラーにある程度対処できる
- 以下の場合に有効
- 更新するAWSリソースが多い
- 頻繁にデプロイする
Amplify のカスタマイズは、 Ruby on Rails でいう、「レールから外れる」行為に相当します。
公式が用意したフレームワークを超えて機能を拡張するため、ある程度の技術力と覚悟が必要になります。
まとめると ...?
Amplify のカスタマイズは慎重に検討しましょう。
- 以下の代替案ではダメですか?
- AWSリソースの手動運用
- 独自 CDK (または Cloudformation)とのダブル運用
- カスタマイズの費用対効果は十分ですか?
- カスタマイズで得られる価値は、カスタマイズ工数と、カスタマイズ後の運用・保守工数に見合っていますか?
おわりに
Amplify は、スモールスタートを切りたい場合において、非常に優れた選択肢だと思います。
上手に使いこなしたいものです。
自分は色々失敗して学びましたが、この知見が他の方の一助となれば幸いです。
参考記事
- https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/gettingstarted-limits.html
- https://docs.amplify.aws/javascript/build-a-backend/auth/import-existing-resources/
- https://docs.amplify.aws/javascript/tools/cli/custom/cdk/
- https://docs.amplify.aws/javascript/build-a-backend/auth/override-cognito/
- https://docs.amplify.aws/react/build-a-backend/restapi/override-api-gateway/
Discussion