いつも忘れないように、コンセプトから。
###コンセプト
・お金かけてまでやりたくないのでほぼ無料でAWSを勉強する
→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
→アカウントを不正に使われるととんでもない額を請求されるので防ぐ
昨日は「AWS Lambdaで動的コンテンツ配信を考えてみる」をやってみたものの、実装はできるが画面(HTML)の実装がイマイチだなという違和感を感じていました。そこれ、「さらに先日やってみたチュートリアル」をもう一度見てみようと思ったんですが、これがなかなかハードです。ワークショップ関連のプログラムがセットになっていて、関連する部分が
\aws-serverless-workshops-master\WebApplication\1_StaticWebHosting\website\js
あたりになるんですが、ソースコードの量も多く難解です。もっとも私にJavascriptの経験がないのもあるので、ハードルがかなり上がっている、という事実もあります。
###クライアントサイドってどうすればいいの?
昨日の「AWS Lambdaで動的コンテンツ配信を考えてみる」はAPIGatewayでHTML変換を行っていました。これだと複雑な画面は作れないしなと思っているのでもう一度勉強します。AWSのサイトで、
https://aws.amazon.com/jp/serverless/patterns/serverless-pattern/
でサーバーレスのデザインパターンが載っているので見てみます。この中で、サーバーレスのWebアプリケーションは左上で、チュートリアルでやったものです。まあ、雰囲気はわかったんだけど、そうじゃないんだよね、ってことでGoogle先生に質問してみます。
結構調べてみたんですが、やってみた系の記事はAPIGatewayに頼っている実装が多いんですよね。で、さらにキーワードを変えてみるとわかりやすいページが見つかりました。いつもお世話になっているクラメソさんのページです。
「Angular でサーバーレスSPA: DynamoDB を使って「さらに読みこむ」パターンを実装しよう」という記事ですが、構成図がしっかり記載されていてわかりやすいです。Javascript系がサッパリですが、クライアントでAngularを使ってました。知らないとはいえ、他にReactやVue.jsなどがあることくらいのキーワードレベルは知っているので、「そうか、クライアント側のフレームワークを使えばいい訳ね」と納得です。確かに、これらをS3上に配置して、そこからAPIGateway経由でサーバーサイドにアクセスさせれば、サーバーレスで大規模にアプリを組むことも可能な感じがします。
###サーバーサイドってどうすればいいの?
クライアントサイドはなんとなくイメージできてきたので、サーバーサイドをこのままでいいのか、ってどころです。AWSブログを見ていると気になるものを見つけました。Chaliceを使うと、APIGatewayとLambdaをうまく管理できそうです。
https://aws.amazon.com/jp/blogs/startup/event-report-chalice-handson/
なるほどねー。みんな考えるようなことは似ているな、と思うわけです。もう15年くらいプログラミングしてないですが、すぐにこういう壁に当たって欲しくなるのは容易に想像できますね。
ちなみにChaliceの説明だと
https://qiita.com/tukkyr/items/b1f54b467375ba29facf
こちらの方の記事のほうがわかりやすかったです。
ここで少し疑問が沸きます。純粋に実装を楽しむエンジニアならChaliceに飛びつけばいいと思いますが、エンプラ経験の長い私はどうしてもベンダーロックインに対してはネガティブです。もうちょっとでいいから汎用性のあるものはないだろうか。ちょっと調べてみましたが、まだまだこれ!ってのが無いですね。見つけた中ではこの記事がニュートラルかなと思いました。
https://www.serverless.com/blog/state-of-serverless-multi-cloud/
ベンダーロックインの話をしだすと話がどんどん逸れていってしまうので、実装することを目的にするのであればChaliceを使ってみたほうがいいかも、と思います。ちなみに、OpenwhiskやKnativeも少し調べてみましたがなんか違うなと。私が考えるサーバーレスってK8sの発展形ではなくて、クラウドのマネージドサービスをどう使いこなせるものか、ってことだと思っています。要はシステム的な抽象化レイヤーをどこに入れるか、なんですが、サーバーレスフレームワークでもいいですし、別のレイヤーでもいいわけです。その話は今日は割愛します。
###現状で”お手軽”かつ”ちゃんとしたWebアプリケーション”を作るには
やり方はいろいろあるとは思いますが、クライアントサイドのフレームワーク選定と、サーバーサイドの実装、APIGatewayでの繋ぎがポイントになりそうですね。基本的にクライアントサイドはJavascript系のフレームワークになると思うので、サーバーサイドもJavascriptでいくかは悩むところです。サーバーサイドの処理や、AIとの相性を考えるとどうしてもPythonに目が行ってしまいます。個人的にJavascriptの経験もないのでPythonのほうがまだいいというか(といっても既に書いたように本格的なプログラミングは10年以上していないのでPythonを語ることはできませんが)。でもそうすると、言語の二刀流使いが必要になります。
もう少し悩んでみようと思いますが、今日の結論としては
・クライアントサイド:Angular、React、Vue.jsから選択
・サーバーサイド:Chaliceを使ってPythonベースでAPIGatewayも含めて管理
というのがベターかなと思っています。もうちょっと調べてサンプルアプリでも作れるといいんですけどね。。。