2022年が始まりました。2021年は「DX認定の取得」、「新サービスの開発や提案」、「社内DX推進のための教育や社内認定の制度を立ち上げ」など、新しいデジタル活用での時代変化に対応するための取り組みを強く意識した1年となりました。今年はさらにこの変化を加速し、デジタル社会の中でNDCが価値を届けられるよう進めていきたいと意気込みを掲げています。今年もよろしくお願いいたします。
今回は2021年よりサービス開発に使用しているAWS Amplifyについて、簡単な紹介と、開発で得た開発時に気をつけなければいけないポイントをご紹介します。
AWS Amplifyとは
現在開発しているサービスではAWS Amplifyを採用しています。AWS Amplifyは画面(フロントエンド)からAPI(バックエンド)までを構築できるツールや機能の一式です。
既存のAWSサービス、認証に関するCognitoやストレージのS3、GraphQL APIを使用するAppSyncなど、さまざまなサービスの統合を容易にするライブラリや、アプリケーションの雛形や設定を行うことができるコマンドラインツール、フロントエンドのホスティング機能まで備えており、雛形の構築からクラウドへのデプロイまでを行うことができます。今回の開発では、複雑化するウェブアプリケーションの中で、スケールする仕組みやセキュリティの仕組みについて、継続してベストプラクティスを取り込むことを狙って本ツールを採用しています。
AWS Amplifyのすべての機能はこちらで確認することができます。
ここが便利、Amplify
Amplifyを使用するとベストプラクティスに則った、サーバレス環境の雛形を自動で構築することができます。小さく始める開発のスタートに最適です。
次のような点が、便利な点としてあげられます。
Cognitoを利用したユーザ毎の権限を利用し、APIやストレージへのアップロード、ダウンロードを簡単にフロントエンドに組み込み可能。
Cognitoでサインインしたユーザのグループを使用して、DynamoDBのテーブルごとの読み書き権限や、項目ごとの読み書き権限を設定した、GraphQLによるAPIを利用可能です。
S3へのアップロード、ダウンロード可否もCognitoの認証済みユーザポリシーが設定され、すぐにフロントエンドから利用できます。
これらが簡単に利用できるよう、接続設定がAmplifyのコマンドラインツールを通して自動設定されます。
Amplifyの管理を行う、Amplify Console上で、Route53などを使用した独自ドメインの設定を、環境ごとに簡単に行うことができる。
ベーシック認証やURL毎のリダイレクトもAmplify Consoleから設定可能。テスト利用がしやすい。
テスト環境、本番環境などの面を用意する仕組みがあり、ソースコード管理上のブランチと紐づけて管理ができる。
Amplifyを使う利点は、Cognitoを利用した権限設定を簡単に利用できること、セキュリティ周りの実装を自分で行わず、ライブラリに任せられることにあると思います。独自で実装するよりもセキュリティの不備を作りにくい仕組みであると考えています。
Amplifyを使用する上で気をつけるポイント
Amplifyは便利なツールですが、使っていく上ではAmplifyのやり方に従うことが重要だと感じています。使っていて次のようなはまりどころがありました。
Amplify CLIを使用してCognitoのグループを作成すると、Analytics機能(Pinpoint)が機能しない。 https://github.com/aws-amplify/amplify-cli/issues/4772
Amplify CLIでは対話型のコマンドでCognitoを作成することができます。この時に事前にグループを作成することができるのですが、上記のissueにある通りグループ用のポリシーが作成されず、Pinpointのリクエストが失敗します。これを解決するために、私たちはAmplifyのCLIではグループを作成せず、Cognitoのトリガーとして認証後の処理としてLambdaを動作させて、その中でグループの作成などを行いました。なるべくカスタマイズをせず、標準機能での動作を目指しています。
またCLIでグループを作成した場合には、AppSyncでGraphQLを動かす場合も、グループに対しての権限付与が必要となります。
サーバサイドで接続切断時の処理を行うことができない。
Amplifyで利用しているAppSyncでは、GraphQLのSubscriptionsという処理によりWebsocket接続の中で、DynamoDBの変更を受け取ることができます。これはGraphQLのMutation(登録・更新・削除処理)をトリガーとして、その結果を受け取ることができる仕組みです。1つのWebsocket接続の中で複数の通知を受け取ることができるように構成されています。
この接続が切れたタイミングで何か処理を行うということができません。サーバ側で処理を行える箇所がないためです。接続や、切断の状況を管理しようとすると、別の手段を取る必要があります。私たちは代替手段として、PinPointのセッショントラッキングを使用しました。
バックエンドを複数環境用意する場合のソースコード管理が難しい。
Web上の管理画面、Amplify Consoleからはフロントエンド、バックエンドそれぞれのビルド設定を行うことができます。フロントエンドは、リポジトリのブランチと紐づけることでビルド設定を行うことができます。mainブランチと紐づけた本番環境、devブランチと紐づけたテスト環境、といった具合です。
バックエンドはブランチとは紐づいていません。また、Amplifyが生成する.gitignoreに従ってソースコード管理を行うと、Amplify内のリポジトリ管理対象のソースの中に、環境の情報が含まれます。ブランチで分けてしまうと、当該ソースはマージしてはいけないソースとなり、管理が煩雑です。
また管理されているソースコードだけでは、環境を復元できません。リポジトリからソースを取得して、同環境を復元するには、CLIを使用して一から環境の初期化、認証環境の追加、権限の追加などコマンドを打っていく必要があります。環境のコピーを行うには、一度既存環境をamplify pull コマンドで同期したのちに、env addコマンドで新環境を作ることが必要です。
この件はまだベストな方法を見つけられていませんが、今のところフロントエンド、バックエンドの環境が1対1になるようにブランチでの管理を行っています。
AWS AmplifyはAWS上で素早くサービスを開発を行うのに適したツールです。2021年12月に発表された「AWS Amplify Studio」はGUI開発機能が強化され、AWSにおけるローコード開発ツールのような形に進化しています。これからもAWS Amplifyを活用しサービス開発を進め、開発ノウハウを公開していきたいと思います。
Comments