Blogaomu

WEBアプリケーション開発とその周辺のメモをゆるふわに書いていきます。

JAWS-UG金沢 #34 に参加しました #jawsug

jawsug-kanazawa.doorkeeper.jp

AWS Summit Tokyo 2018で開催された、AWSクラウド上のマネージド・サービスをサーバレスアーキテクチャで組み合わせたアプリケーションの開発方法を学ぶ、開発者向けのハンズオンイベント Dev AWSome Day で利用された教材を使ってサーバレスアプリケーションを開発するもくもく会が行われました。

流れ

先ほどのDev AWSome Dayリンクのタイムテーブルに添って開発を進めていきました。画像をアップロードして画像認識処理によってラベルを取得し保存。保存した画像とラベルデータを一覧で表示する。というWebアプリケーションを開発するというテーマでした。

  • 開発用IAMユーザーの作成、IAMロールの作成・割り当て
  • AWS Cloud9(IDE)を使った開発
    • 開発に使うのはPython(Lambda), node.js(Lambda), React(Frontend)
  • Amazon Cognitoユーザープールの作成、フェデレーティッドアイデンティティの利用
  • Amazon S3への画像データアップロード
  • アップロードされた画像をRekognitionに処理させる
    • S3にPutされたイベントによりLambdaでの処理がキックされる
  • DynamoDBへのラベルデータの保存
  • API Gatewayを利用しDynamoDBからデータを一覧取得
  • Extra 1. Rekognitionの有名人検出機能を使って有名人のラベルを取得する
  • Extra 2. 画像の削除機能

感想など

私が特に気になっていたのはAmazon Cognitoを使う部分で、調査で少しだけ触った程度なので実際のアプリケーションと合わせて使うとどう便利になるんだろうという観点でした。流れとしては、まずユーザープールを作成します。これによってユーザーのサインアップとサインイン、プロフィール(属性)の管理ができるようになります(大まかな機能)。次にフェデレーティッドアイデンティティを作成します。これは、AWSサービスに対する認可、すなわちアクセスの制御機能を提供します。この2つを組み合わせることによって、サインしたユーザーはS3とAPI Gatewayにアクセスできて、ゲストユーザーはS3 GETだけアクセスできるというような制御を行うことができます。

docs.aws.amazon.com

良さげだなと思ったのは、AWS Amplify というJavaScriptのライブラリでReactで利用できる認証コンポーネントが提供されてることです。詳しくは AWSの次世代JavaScriptライブラリ「AWS Amplify」の概要とReactアプリに導入する手順 #serverless #adventcalendar | Developers.IO で書かれていますが、Authenticator というコンポーネントを使うだけでサインアップ、サインイン処理が一発で使えるようになる、さらにサインアップ時の認証コードまで利用できる(これはCognitoユーザープールの機能かと思う)というのはアプリケーション開発者観点で驚きました。

また、S3やAPI Gatewayへのリクエスト時(AmplifyのAPIを使う)にフェデレーティッドアイデンティティによって払い出される認証情報が自動的に付与され、アプリケーション開発者としては認可についてもあまり意識しないでいい作りになっていました。

今回DynamoDBには一意のユーザー名をキーにデータを登録していましたが、ユーザーが作成する他のデータとどう結びつけるかというのは設計において悩みそうだなと思いました。あと、ローカルで開発するときはCognitoにアクセスしないといけないのかなー、そもそもCloud9で開発すればええやろ?みたいな思想なのかな、というのも気になりました。

その他の感想としては、

  • RekognitionはAPIで手軽に使えて良い(たしかGoogle Cloud Vison APIもお手軽だった)
  • CORSの対応について少し理解が進んだ
  • Lambdaデプロイいくつか方法がある(CLI, SAM(CloudFormation))
  • DynamoDB Stream初めて使った
  • ReactでDOMを削除するのよく分からなかった(結局イベントが起きたときに非表示にするというので逃げた)

複数のAWSサービスを触ることができたので復習にもなったし、実際動くものができてくるとやっぱり楽しいですね。 ここ数年サーバーサイド(API)の開発ばかりやっているので、ReactやVue.jsを使ったフロントエンドの開発もやりたいなーと思いました(実戦できるかは置いといて)。