coursera の 講座を通して知った AWS オススメの Serverless な開発

## はじめに

年末年始の休みはコロナの影響でどこにも行かなかったので、 [coursera](https://www.coursera.org/) の [AWS Fundamentals: Building Serverless Applications](https://www.coursera.org/learn/aws-fundamentals-building-serverless-applications) を集中受講してみました。

感想をざっくりまとめると、以下のようになります。

- AWSがオススメする Serverless な Webアプリケーションの構成がなんとなく見えてきた。
- AWSを使って、ServerlessなWebアプリを自分で作ってみたい。
- 実際のお仕事で開発するには、まだまだ自分の知見が足りない。

## 講座の内容

この講座は有料ですが、１週間の間は全コンテンツを無料で参照できるようになっています。AWSがオフィシャルで公開している講座の１つです。
AWSのサービスを組み合わせて、Serverless な Webアプリケーションを開発していきます。ただし、フロントエンド（HTML, CSS, JavaScript）はあらかじめ用意されており、バックエンド側の作業がメインになります。

実習は、AWSのアカウントを持っていることが前提です。一部、実習のテキスト通りにAWSコンソールを操作しても、期待通りの結果にならない部分がありました。恐らく講座作成当時には正しかった情報でも、AWSのサービス自体が改善されて、画面の構成や機能が変更されているからだと思います。まあ、公式のドキュメントを頼りに、自力で調べれば何とかなるレベルなので、その方がかえって勉強になるかと思いました。

なお、カリキュラムは、AWSの利用料金が高くならないように (free tier という言葉があった) 一応配慮されているようです。

## 講座を通してわかったこと

### AWSオススメの Serverless な構成

何となくですが、講座を受講してみて、 AWSが推奨するようなServerlessなアプリを開発する時の、構成の基本みたいなものがわかった気がします。

- フロントエンド（HTML, CSS, JavaScript, etc)は、 S3のバケットにまるっと放り込む。
- S3に静的サイトのホスティングの設定をしてブラウザーからアクセスできるようにする。
- CloudFront を使って、静的サイトの高速化をする。
- データは DynamoDB に保存する。
- データに対する操作（アプリケーションロジック）は、Lambda を使う。
- API GateWay で Web API のインターフェースを用意する。
- API GateWay で受け取ったリクエストは、 Lambda で処理する。
- フロントエンドからは、API GateWay で用意した Web APIを呼び出す。

とまあ、こんな感じです[^1]。

実際、S3や、DynamoDB や Lambda はアプリの規模にもよるでしょうが、

- S3, Lambda, DynamoDB は、無料枠（または、低コスト）の範囲である程度、利用できそう。
- これらのサービスを接続しやすいようにAWSコンソールのインターフェースが工夫されている。

といった点からも AWS がオススメする Serverless な Webアプリの構成の定番なのかなと感じました。

細かい操作や設定やプログラミングはさておき、この概要がわかっただけでも収穫でした。

## 講座を受けて課題と感じたこと

### サービスの組み合わせ方が大変そう

どのサービスをどう組み合わせれば欲しいシステムが実現できるのか、現実には悩みそうです。（だからこそ、今回１つの定番と思われる組み合わせを知ることができたのは収穫でした。）
この辺のどのAWSのサービスをどう組み合わせてシステムを実現するかってところがポイントになるから、AWSには、システムアーキテクトという資格が用意されているのかと腑に落ちました。

### 設定が大変そう

いろんなサービスを組み合わせて使うので、それらを繋ぎ合わせるための設定が大変だと感じました。講座は、ドキュメントがあって、それに従ってやればできてしまうのですが、自分で一からやれと言われると面倒そうです。（後、講座では手抜きで、サービスにフルアクセス可みたいな設定にしちゃってますが、本来は最低必要なものだけに権限を制御すべき[^2]だし、そのあたり考え出すと結構大変そうです。）
そのための解決策として、DevOpsとか、CLIで全部できるようになっているとかがあるのかと想像しているのですが、まだよくわかってません。

### デバッグが大変そう

エラーがあるときに、どのサービスでエラーが発生しているのか見つけにくそうな気がしました。サービスが分散しているためにどのサービスでエラーになっているのかわかりにくそうです。（わかりにくいのは、別にAWSに限ったことではないですが...)

また、 Lambda のコードをローカル環境で（デプロイしないで）テストする方法[^3]が良くわからないです :thinking: 
この辺も別でAWSがサービスがありそうなんですが、まだわかってません :sweat_drops: 

### コードレビューが大変そう

メインは Lambda のコードになると思うのですが、これをどこでコードレビューするのか、レビューの際にどうやって動作を確認すれば良いのか、その解が見つかっておりません。
この辺も別でAWSが...（以下略）

### Lambda で使う開発言語

講座では JavaScript が使われていたのですが、何を選ぶのが良いのか。
まあ、Rubyを選びたいところなんですが、どの言語が有利なのか（AWSのサポート具合の充実度）が気になります。

## まとめ

AWSという新しいオモチャを手に入れた（アカウントを作った）ので、何かアプリを作ってみたいところです。AWS オススメの Serverless 開発が少しわかったのですが、わかった分だけ、わからないことがどんどん増えました。
あとは、１年間どれだけ無料枠で遊び倒して、知見を深められるかが勝負の分かれ目です:sweat_smile:

## 参考資料など
- Coursera の講座
  - [AWS Fundamentals: Building Serverless Applications](https://www.coursera.org/learn/aws-fundamentals-building-serverless-applications)
  - [Introduction to AWS Identity and Access Management](https://www.coursera.org/learn/introduction-to-aws-identity-and-access-management)
  - [Amazon DynamoDB: Building NoSQL Database-Driven Applications](https://www.coursera.org/learn/dynamodb-nosql-database-driven-apps)
- AWSのドキュメントのページ
  - [Serverless Applications Lens - AWS Well-Architected Framework](https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/welcome.html)

[^1]: これを図にしようかと思ったのですが、実際、AWSのオフィシャルサイトでWebアプリの構成例として公開されていました。 [Serverless Applications Lens - AWS Well-Architected Framework](https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/welcome.html) の PDFの「Web Application」のページに図が載ってました。PDFは、まだ読んでませんが、やっぱり、AWSが、推奨している構成のようですね。ちなみに、講座では、認証部分は省略されてましたので、Cognito は登場しません。

[^2]: AWSのアクセス権限の考え方に関しては、Coursera に AWS 公式のIAMの講座 [Introduction to AWS Identity and Access Management](https://www.coursera.org/learn/introduction-to-aws-identity-and-access-management) があります。

[^3]: 今、受講している [Amazon DynamoDB: Building NoSQL Database-Driven Applications](https://www.coursera.org/learn/dynamodb-nosql-database-driven-apps) では、Cloud9上でコードを書いて、consoleで動作確認してそれを Lambda 関数としてそのまま貼り付けるやり方をしています。handlerの関数から実際の処理を行う関数を呼び出し、Cloud9のコンソールでも実際の処理を行う関数の動作確認をするようになっています。この辺り、基本的なことではありますが、テストしやすいようにコードを書く工夫すれば、テストは書けそうな気がします。