MEGAZONE

MEGAZONEブログ

Getting started building serverless event-driven applications
re:Invent 2023 Serverless Compute

Getting started building serverless event-driven applications

Pulisher : Managed & Support Center イ・スンヒ
Description : AWSが提供するサーバーレスアーキテクチャーを基盤とした全体的なアプリケーション設計について紹介するセッション

サーバーレスアプリケーションという概念はLambdaやSAM程度に認識していましたが、今回のセッションを通じて、AWSが提供するサーバーレスアーキテクチャをベースにした全体的なアプリケーション設計について学ぶことができると期待し、このセッションを申し込みました。

このセッションでは、サービスについて学びながら経験した試行錯誤や、経験しないようにするための最善の方法を提案します。この講演は、アプリケーション制作が初めてだったり、開発を始めてクラウドに移りたいと思ってサービスについて学びたい方におすすめの内容であり、サーバーやコンテナでアプリケーションを構築していた方、あるいは他のサービスモデルを使用していた方にも役立つと思います。

一部の大規模なAWSのお客様は、非常に重要な大規模なビジネス生産アプリケーションにこれらのサービスを使用しています。例えば、オランダ最大の物流会社の一つであるpostnlは、1日に100万個以上の小包を処理しています。 Nationwide Children’sは、ペタバイト規模の小児がんデータのワークフローを自動化するためにこれらのサービスを使用しています。最後に、タコベルは、デリバリーパートナーアプリケーションの注文イベントをシステムに送信する事例があります。

サーバーレスは、お客様がサーバー管理に多くの時間を費やしていることに気づき、AWSが新たに開発した概念です。従来のアプリケーションでは、新しいアイデアを実装し、新しいアプリケーションを生み出すためには、そのアプリケーションが実行されるサーバーとインフラストラクチャをプロビジョニングし、維持し、スケーリングする必要がありました。私たちが話しているすべてのサービスでは、サーバーの管理が不要で、アプリケーションの使用量に応じてサービスが自動的にスケーリングします。 また、使用量ベースの課金モデルを使用しているため、アプリケーションにトラフィックがないときは料金を支払う必要がありません。 そして、常に適応し、周囲の環境に合わせて改善される機能があります。

AWSのフルスタックサーバーレスアプリケーションアーキテクチャについてまとめると以下のようになります。
・データストレージにはAmazon S3を使用し、サービスアーキテクチャに最適化されたデータベースにはAmazon DynamoDBが活用されます。
・アプリケーションロジック処理にはAWS Lambdaが使用され、これは必要に応じて自動的に拡張・縮小されます。
・統合サービスには、Step Functions、Amazon SQS、Amazon EventBridge、Amazon SNSなどがあり、サービスアプリケーションに特化した機能を提供します。
・フロントエンドプレゼンテーション層では、API GatewayとAmazon Cognitoを通じてユーザーインターフェースとバックエンドの相互作用をサポートし、AWS Amplifyを使用して静的コンテンツをグローバルに分散された方法でサービスします。

簡単にLambda関数のコード例を見てみましょう。

Pythonで作業するために必要なSDKであるboto3を取得し、S3とSNSクライアントをインスタンス化し、そのサービスのAPIと対話します。 次に、ラムダハンドラがあり、このハンドラは関数が呼び出されるたびに実行され、イベントに反応します。この場合、例えば、毎日スケジュールされたイベントに反応します。S3からCSVファイルを取得するコード部分があり、選択した単語をメッセージに組み合わせて、SNSにメッセージを投稿する呼び出しに例外処理が含まれています。

アプリケーションに複雑さを追加する前に、サービスアプリケーション開発に関連するツールと開発者ツールチェーンについて紹介します。 最初は、コンソールで直接扱い、さまざまなサービスの機能を学ぶことをお勧めしますが、コンソールで直接展開することを超えて、IaCフレームワークを使用することをお勧めします。

IaCフレームワークのメリットは、あらゆるリソースを構成することができ、サービスアプリケーションに多くのサービスを関連付けることができます。フレームワークの例としては、AWS SAM(AWS Serverless Application Model)やCDK(Cloud Development Kit)があり、サービスフレームワーク、Terraformなどのパートナーツールも良いオプションです。 これらのツールは、アプリケーション全体をコードで定義するのに役立ちます。

サービスレス環境における重要なトピックの1つは、テストです。ここでは、サーバーレスアプリケーションを効果的にテストする方法についていくつかのヒントを紹介します。

まず、複雑なコードロジックを持ついくつかのラムダ関数については、ユニットテストを作成し、その関数コードをテストすることは意味があります。例えば、unittestフレームワークを使用してS3とSNSへの呼び出しをシミュレートし、実際にクラウドサービスに呼び出しを行わずにラムダハンドラをテストし、期待どおりに応答するかどうかを確認します。

当初は、S3からCSVファイルとしてリストをインポートするだけでしたが、ユーザーがサブスクリプションを更新したり、新しいユーザーを作成したりするにつれて、データのユースケースはより複雑になり、データベースを追加することが理にかなってきました。DynamoDBはサービスに最適化されており、使用量ベースの料金モデルで自動的にスケーリングされ、AWS SDKを使用してデータを操作することができます。

DynamoDBを始める際に重要なことは、DynamoDBのアーキテクチャに合わせてアクセスパターンを計画することです。 例えば、SQLデータ構造とは異なり、DynamoDBはデータを複数のサーバーに自動的に分散させ、ユーザーが規模拡大について心配する必要がありません。 したがって、データをアイテムコレクションにグループ化して、頻繁にアクセスするデータが同じ場所にあるようにすることが重要です。私の場合、ユーザーがログインしてサブスクリプションを表示・更新できるように、ユーザーごとにクエリを実行してすべてのサブスクリプションを返すようにアイテムコレクションを構成しました。

今回のセッションでは、実際のアプリケーションを設計する過程でどのように拡張するのか、拡張する過程で実際のサンプルコードはどうなるのかについて見ることができ、より簡単に理解することができました。

サーバーレスを運用環境に適用するには無理があるかもしれませんが、セッションで確認したように、アイデアやプロジェクトの初期段階で構成してみることは、多くのメリットをもたらすことができると期待されます。

ブログ一覧

この記事の読者はこんな記事も読んでいます