[レポート] 初めてのサーバーレス・イベント駆動アプリケーションを構築してみよう #SVS209 #reinvent

2022.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本記事はAWS re:Invent 2022 のセッションレポートとなります。

概要

AWS のアプリケーション統合の Go-To-Market 責任者である Emily Shea が、サーバーレス Web アプリケーションの構築を開始するための直接の経験と実践的な手順を共有します。 エミリーは、定期的に第二言語を練習するという日常の問題に対する解決策を構築したいと考えていました。 このセッションでは、そのソリューションを AWS Lambda 関数から、Amazon API Gateway、AWS Lambda、Amazon EventBridge、AWS Step Functions、Amazon DynamoDB、Amazon QuickSight、AWS Amplify コンソールなどを使用するフル機能のアプリケーションに進化させるプロセスを共有します。 サーバーレスが新しいアイデアを実験するための優れたツール セットである理由を学び、サーバーレス アプリケーションの拡張性とモジュール性により、小規模から始めて機能をすばやく追加できる方法を聞いてください。

会場の様子

はじめに

  • Lambda 関数を構築したことがない方、サーバーレスで開発したことがない方向けの内容
  • スピーカーの方の日常業務から離れて、私の個人的な経験をお伝えする
  • 技術的なバックグラウンドやコーディングがまったくない状態でサーバーレス アプリケーションを構築する方法
  • 素晴らしいアイデアを実践して、何かを構築できるようにする時間が不足している
  • サーバーレスを使用すると、すべてのアプリケーションに当てはまる基本事項とビルディングブロックにかかる時間が大幅に短縮される
    • それらを AWS に任せることができる
  • ビジネスロジックと、アプリケーションをユニークなものにすることに集中できる
  • アプリケーションをエンドユーザーの手に渡し、迅速に本番に移行できる

  • このセッションで得られる内容
    • 開発をスタートする時に最初に利用するAWSサービス
    • 開発者ツールとテストのためのベスト プラクティス
    • アプリケーションをどのように進化させることができるかについて

迅速な反復を行い、顧客の要件が変化するのに合わせて、アプリケーションを進化させる

サーバーレスおよびイベント駆動型のアーキテクチャを構築することで、あなたのアイデアをより早くアプリケーションに反映させることができる

  • 自己紹介
    • コーディングアカデミーでPython、JavaScriptを少し学んだ
    • 100人か200人のユーザーがいるアプリケーションに取り組んできた
    • その取り組みは、私にとっての学習ツールのような役割をはたした

Step1: アプリのアイデア

  • 私が解決したかった問題
    • 中国語を勉強するための定期的なリマインダーを、再導入する方法
    • 1日1回「OK」と言えるような毎日のスケジュールを作りたかった
    • 語彙のデータベースにアクセスできるようにするためのロジックが必要だった
    • 単語をユーザーに送信できるシステムが必要

  • サーバーレスで構築できるものは非常にたくさんある
  • いくつかの例
    • 2 つのカテゴリにグループ化した
    • ブルー
      • 天気 API をチェックして、何を着るかなどを教えてくれるアプリ
      • 裏庭の鳥を識別するIoTカメラアプリ
      • リマインダーとリーダーボードを備えた家事トラッカー
    • グリーン
      • 私が日常業務で行っている、エンタープライズレベルのサーバーレスアプリケーション
      • 大きな売上を処理するために自動的にスケールするe コマース アプリケーション
      • ローン申請書などの財務書類を処理し、機械学習を使い、手作業でのチェックを自動化
      • Salesforce などの SaaS アプリケーションを統合し、イベントを取り込み、顧客データに情報を付与するためのプラットフォーム
        • 事前に大量のインフラストラクチャをスケールアップする必要なく、膨大な量のピークを処理できる

Step2 AWS サーバーレスサービス

  • サーバーレスの定義
    • サーバーレスとは​​
    • 基盤となるサーバーを管理せずにコードを実行できるようにすること
    • サーバーに触れたり、プロビジョニングしたり、スケーリングしたりしない
    • パッチ適用は不要
    • すべてAWSにオフロードされているものを、プロビジョニングしたりしない
    • スケールアップとスケールダウンにより、アプリケーションの高可用性が自動的に提供される
    • 従量課金モデルで、コードが実行されているときにのみ料金が発生する
    • ピークを処理するためにスケールアウトでき、その後自動的にスケールインされる
    • 過剰にプロビジョニングされず、元に戻って低コストに戻る

  • サーバーレス で利用される様々なAWSサービス
    • Lambda
    • 任意のコードを実行可能
    • イベントによって呼び出されて実行される
      • スケジュールされたイベント
      • 他の AWS サービスからのイベント(トリガーからLambda関数を実行)
    • API ゲートウェイ
    • フロント エンドがバック エンドと通信するための何らかの方法が必要
    • ユーザーがアプリケーションのバックエンドと対話する方法 (API)
    • ストレージ
    • DynamoDB
    • S3
      • ファイルなどをアップロードできるS3
    • インテグレーション(統合)
    • SQS
    • SNS
    • EventBridge
    • Step Functions
    • フロントエンド
    • Amplify
      • 静的コンテンツをホスト
    • 認証
    • Cognito

  • 基本的な最小限の MVP
    • サービス アプリケーションを非常に迅速に構築できる機能セット

Step3 開発のベストプラクティス

  • コードをコンソール上ですぐにテストできる

  • IaC (インフラストラクチャ アズ コード) を使用することを強くお勧めする
  • アプリケーション全体をコードとして定義
  • 変更はすべて保存される
  • アプリケーションの以前のバージョンにロールバックする必要がある場合

  • フレームワークには、素晴らしい選択肢がたくさんある

    • AWS SAM
    • サーバーレス フレームワーク
    • AWS CDK
  • 筆者の好み SAM

  • SAMの例
    • MVP アプリケーションの SAM テンプレート
    • コードを簡素化できる

  • CI/CD
    • サーバーレスでは、自動化された CI/CD を簡単に用意できる
    • リポジトリに加えた変更が、すぐに適用されるのをクラウドで確認できる
  • CI/CD の選択肢
    • Circle CI
    • AWS コード パイプライン
    • GitHub

  • 自動化されたデプロイ・パイプラインの例
    • サーバーレスのデプロイ・フレームワークを使用して、アプリケーションを定義
    • コードがリポジトリにアップロードされると、パイプラインの新しいビルドプロセスが開始される
    • 新しいアプリケーションがクラウドにデプロイされる
    • 新しいアプリケーションを実行し、テストして、確認できる

  • サーバーレスのテスト
    • ローカルで簡単にテストできるとは言えない
    • 複雑な Lambda 関数のコード・ロジックをテストするには、単体テストを行う
    • サービスの統合をテストするには、クラウドでテストを行う

  • クラウドでのテストを高速化
    • SAM アクセラレータは、クラウドでのイテレーション(繰り返し)を高速化
    • sam sync CLI コマンドを使用し、コードの変更点を同期
    • 開発環境で役立つ
  • アプリケーションが成長するにつれて、デプロイ全体を展開するのに時間がかかるようになる
    • テストに数分かかる
  • 支援ツール
    • SAM アクセラレータ

Step4 アプリをビルドする

Phase1 テキストメッセージ

  • サインアップできるようにする
  • ユーザーが自分で購読できるUIを用意

Phase2 購読者、API、静的Webサイト

  • MVPはここ(画面右側)に移動
  • テキストメッセージを、コスト最適化されたEメール(SES)に変更
  • Amplify を追加
    • 静的コンテンツ、HTML と CSS
    • ウェブサイトのフロントエンド
  • API Gateway
    • Lambda 関数
    • 購読
    • 購読解除
    • DynamoDB
  • 「Send daily word」Lambda 関数
    • サブスクライバーのリスト取得
    • リストに送信

  • JavaScript で作成した UI
    • レベル別のサンプルの語彙を表示

  • データベースは、DynamoDBを選択
    • Lambda 関数からデータベース(RDS)への同時接続数について
    • Lambda 関数は、リクエスト数に応じてスケールする
    • スケールした Lambda 関数は、データベース(RDS)の同時接続数を圧迫
    • DynamoDB は Lambda 関数に合わせて、スケール可能
  • RDS (SQL) と DynamoDB (NoSQL) では、データ構造に違いがある
    • RDS (SQL)
    • データを正規化し、複数のテーブルに分割
    • JOIN (結合) と Aggregate (集約) を頻繁に利用
    • データ量の増加と共に、レイテンシーが高くなる傾向がある
    • DynamoDB (NoSQL)
    • アイテム・コレクションを利用
    • スケールした場合でも、低レイテンシーを保つ

Phase3 ユーザーログインとプロフィール

  • UIを用意し、ユーザーがログインしてサブスクライブできる
    • ユーザー名とパスワードでログイン
    • Cognito を使い、ユーザー認証
    • ユーザー自身のページ(プロフィール)
    • 2つの Lambda 関数を追加
      • ユーザーデータ取得
      • ユーザーデータ更新
  • 語彙クイズを用意して、結果を追跡できるようにする

  • リストを管理し、登録/登録解除
  • プロフィール設定

Step5 アプリを拡張する

  • アプリケーションを拡張する方法
    • 戦略やアプローチについてお伝えしたい

  • メールで送信されたメッセージ
    • tweet bot を使用して Twitter に公開する
  • アプリケーションのコア機能を簡単に拡張できるように変更する方法を検討する

  • 既存の Lambda 関数
    • 数行のコードを追加し、ツイートを送信する
  • Mono Lambda になりつつあった
    • 1つの Lambda 関数に多くの機能が詰め込まれた、詰め込み過ぎの Lambda 関数
  • 簡単に変更を加えることができない
    • Lambda 関数を分割して、タスク毎に専用の Lambda 関数を用意する

  • 元々の Lambda 関数のタスク
    • DynamoDBから単語のリストを取得し、今日の単語を選択する
    • メールを送信する
  • 変更後の Lambda 関数
    • 今日の単語を選択する
    • EventBridge の event bus にイベントを送信する
  • EventBridge の event bus
    • コンシューマがルールをサブスクライブ
    • Lambda 関数が簡素化される
  • 潜在的な将来の機能に簡単に対応できる

  • イベントの本文を確認
    • イベントスキーマ
    • ソース:vocab-app
    • 詳細タイプ:今日の単語セット
    • 詳細本文:イベントを互いに区別できる一意の識別子

  • Twitter ボットのツイート

  • 単語の音声
    • polly:テキスト読み上げサービス

  • Workflow Studio
    • ドラッグ アンド ドロップで利用できるビジュアル エディタ
    • 2021年にGA

  • 最初に作成したワークフロー
    • 複数の単語でループ
    • AWS SDK 統合で、サービスのAPIを呼び出し
    • rate limit を超えないようウェイト

  • アプリケーションの費用について質問を受ける
  • 内訳
    • 100人以上のアクティブな購読者
    • 4500件の API Gateway リクエスト
    • 4800件の Lambda 実行
    • 1万件の CloudFront リクエスト
    • 3200件の S3 リクエスト

  • 答えは、82セント
    • Route 53 ホストゾーン の費用が占める割合が大きい
    • 無料枠の恩恵を受けている

まとめ

  • 最初のサーバーレスアプリケーション構築の Tips
    • 開発ツール
      • IaC フレームワークを利用したデプロイ
      • 自動デプロイ・パイプラインをセットアップする
      • Cloudでのテスト
    • アプリケーションのデザイン
      • データベースのアクセスパターンを計画する
      • サービスのオーケストレートのためにワークフローを利用する
      • アプリを拡張するため、イベントを出力する

  • サーバーレスのイベント・ドリブン・アーキテクチャ
    • アイデアをアプリに高速に反映

  • スキルビルダー
  • ランプアップガイド
  • サーバーレスバッジ
    • 新しい AWS サーバーレス デジタル学習バッジ
      • スキルビルダー80% 以上のスコアを獲得すると、デジタル バッジを獲得