Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

AWS LambdaとRedis Enterprise Cloudで実現するサーバーレス開発の徹底解説

本記事では、AWS LambdaとRedis Enterprise Cloudを連携させる方法を詳しく解説します。サンプルとして映画データベースアプリケーションを題材に、Node.js製とPython製の2つのLambda関数を構築・デプロイする流れを学べます。これらの関数はRedisデータベースとやり取りし、データの挿入・更新・削除・検索(クエリ)を行います。アプリケーションでは、高度な検索機能を提供するRediSearch APIを採用しています。

サーバーレス(AWS Lambda)は、マイクロサービスアーキテクチャへの移行トレンドとも相性が抜群です。開発者はビジネス上の「サービス」を小さな単位に分割し、好きなプログラミング言語で実装できるようになります。まずは動画をご覧いただき、その後、AWS Lambdaの概要から、Redis Enterprise CloudとLambdaを使ったアプリケーション構築の手順まで、順を追って見ていきましょう。

AWS Lambdaの基本をおさらい

AWS Lambdaに馴染みのない方のために、サーバーレスコンピューティングランタイム(FaaS:Function-as-a-Serviceとも呼ばれます)としての基本を簡単に説明します。(すでにLambdaに精通している方は次のセクションへ進んでください。)

AWS Lambdaは、特定のイベントに応答して関数をオンデマンドで実行できるサービスです。そのため、イベント駆動アーキテクチャ(EDA)のアプリケーション構築に最適です。Lambda関数はAWSによって完全マネージドであり、さまざまなプログラミング言語で作成できます。さらに嬉しい点は、開発者がアプリケーションのライフサイクルを深く理解していなくても利用できることです。

Lambdaの呼び出し方法は複数あります。AWSコンソールからの直接実行、SNS・SQS・Kinesisなど他のAWSサービスからのイベントによるトリガー、CloudWatchやS3イベント経由の起動などです。今回のサンプル映画データベースアプリでは、HTTP RESTエンドポイント経由でLambda関数を呼び出します。これはAWS API Gatewayを使用して実現します(Lambda関数の呼び出しについて詳しくは公式ドキュメントをご参照ください)。

LambdaのHTTP実行プロセス

具体的には、HTTPリクエストはAPI Gatewayにルーティングされ、ボディ・ヘッダー・パラメータが解析された後、そのペイロードとともにLambda関数がトリガーされます。

AWS LambdaとRedis Enterprise Cloudで実現するサーバーレス開発の徹底解説

開発者はRESTエンドポイントを公開するコードを書き、デプロイ時にAWS API Gateway内で公開するよう設定するだけです(詳細は後述のサンプルアプリケーションのセクションで解説します)。

サーバーレスアプリケーションにおけるステートとデータ管理

AWS Lambdaはステートレスな環境です。しかし多くのアプリケーションでは、サービス間や呼び出し間で状態を共有したいケースがあります。そんなときに役立つのがRedisです。シンプルな状態管理にはElastiCacheを使うこともできますが、永続性・リッチなデータ構造・高性能・クエリモデルが必要なアプリケーションも少なくありません。Redis Enterprise Cloudなら、AWS上(Google CloudやMicrosoft Azureもサポート)でフルマネージドのサービスとしてこれらすべてを提供します。

Redis映画データベース サンプルアプリケーション

それでは、サンプル映画データベースアプリケーションを見ながら、Redis Enterprise CloudとAWS Lambdaを使ってアプリを構築するための重要なステップを確認していきましょう。

このアプリケーションは、RediSearchのチュートリアルで公開されているデータセット(Redisハッシュで構成される映画カタログ)を使用しています。下図のように、フロントエンドはVue.jsで構築されており、以下の目的でRESTエンドポイントを呼び出します。

  • 映画の一覧表示・並べ替え・フィルタリング
  • 映画情報の編集、コメントの追加・削除
  • 全文検索およびファセット検索による映画検索
AWS LambdaとRedis Enterprise Cloudで実現するサーバーレス開発の徹底解説AWS LambdaとRedis Enterprise Cloudで実現するサーバーレス開発の徹底解説

前述のとおり、このアプリケーションはAWS API Gateway、AWS Lambda、そしてデータストアとしてRedis Enterprise Cloudを活用しています。さらにPython側のサービスでは、Redisデータベースのパスワードの保存と暗号化にAWS Key Management Service(KMS)を使用しています。

デモアプリケーションのインストールと実行

始める前に、以下の前提条件を整えておく必要があります。

  • AWSアカウントと認証情報、CLIのインストール済み環境
  • RediSearchモジュールが有効化されたRedis Enterprise Cloudのアカウントとデータベース
  • Git
  • Node.js
  • Python
  • Redisコマンドラインインターフェース(redis-cli)

準備が整ったら、サンプルアプリケーションのインストールと実行の手順を見ていきましょう。

ステップ1:Redis Enterprise Cloudのデータベース情報を取得する

まだRedis Enterprise Cloudでデータベースを作成していない場合は、「Get Started with Redis Modules」ガイドの手順に従って作成してください。

Redis Enterprise Cloudに接続すると、Webコンソールでデータベースの接続情報を確認できます。必ずデータベースに「RediSearch 2」モジュールを追加しておきましょう。

AWS LambdaとRedis Enterprise Cloudで実現するサーバーレス開発の徹底解説

Lambda関数をRedisデータベースに接続するには、以下の情報が必要です。

  • REDIS_HOST: redis-18541.xxx.xxxx.xxx.cloud.redis.com
  • REDIS_PORT: 18541
  • REDIS_PASSWORD:(画面に表示されているパスワード)

ステップ2:GitHubからプロジェクトを取得する

リポジトリをローカル環境にクローンし、プロジェクトディレクトリへ移動します。

> git clone https://github.com/redis-developer/aws-redis-cloud-demo.git

> cd aws-redis-cloud-demo

プロジェクトのディレクトリ構成は以下のとおりです。

aws-redis-cloud-demo
├── README.md
├── front-end                   => Vue.jsプロジェクト
│   ├── .env.development        => 開発モード用のLambda URL設定
│   ├── .env.production         => 本番モード用のLambda URL設定
│   ├── ...
│   └── vue.config.js
│   └── ...
├── movie-comments-microservice => Python製コメントサービス
│   ├── .chalice
│   │   └── config.json         => Lambda & サービス設定
│   ├── app.py
│   ├── chalicelib              => アプリケーションコードとライブラリ
│   │   └── ….
│   ├── readme.md
│   └── requirements.txt
└── movies-list-microservice    => Node.js製映画サービス
    ├── import_movies.redis     => データセットファイル
    ├── ...
    ├── serverless.yml          => Lambda & サービス設定
    ├── src
    │   └── ...
    └── ...

ステップ3:映画データセットをアプリケーションにインポートする

ファイルaws-redis-cloud-demo/movies-list-microservice/import_movies.redisには、映画をデータベースに挿入するためのRedisコマンドがすべて含まれています。使用されるコマンドは以下のとおりです。

  • HSET:各映画ごとのデータ登録
  • FT.CREATE:RediSearchインデックスの作成

データセットをインポートするには、ターミナルを開いて以下のコマンドを実行します。

> export REDISCLI_AUTH=<YOUR_DB_PASSWORD>
> redis-cli -h redis-18541.xxx.xxxx.xxx.cloud.redis.com \
        -p 18541 < movies-list-microservice/import_movies.redis

ステップ4:Redis Enterprise Cloudインスタンスを使うようアプリを設定する

アプリケーションをテストする前に、Node.jsサービスとPythonサービスを自分のRedis Enterprise Cloudデータベースインスタンス向けに設定します。以下のファイルを開いてください。

  • ./movies-list-microservice/serverless.yml
  • ./movie-comments-microservice/.chalice/config.json

そして、Redisのホスト名・ポート・パスワード(REDIS_HOST、REDIS_PORT、REDIS_PASSWORD)を設定します。

ステップ5:映画マイクロサービス(Node.js)をビルドして実行する

以下の手順に従ってプロジェクトをビルド・実行します(詳細はプロジェクトのReadmeファイルにも記載されています)。

  1. Serverless Frameworkをインストールする
> npm install -g serverless

2. movies-list-microserviceディレクトリへ移動します。

> cd movies-list-microservice

3. 依存パッケージをインストールします。

> npm install

4. Lambda関数をローカルで実行します。

> npm start

5. ブラウザでRESTサービスにアクセスしてテストします:https://localhost:3000/api/movies/1

6. 以下のコマンドでサービスをAWSにデプロイします。

> serverless deploy
................................
Serverless: Stack update finished...
Service Information
service: movies-list-microservice
stage: api
region: us-east-1
stack: movies-list-microservice-api
resources: 33
api keys:
  None
endpoints:
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/search
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/group_by/{field}
  GET - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id}
  POST - https://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/{id}
functions:
  listMovies: movies-list-microservice-api-listMovies
  searchMovies: movies-list-microservice-api-searchMovies
  getMovie: movies-list-microservice-api-getMovie
  saveMovie: movies-list-microservice-api-saveMovie
layers:
  None

7. ブラウザでhttps://<xxx>.execute-api.<reg>.amazonaws.com/api/movies/1にアクセスしてAPIをテストします。

注意:エラーが発生した場合は、AWS CloudWatchの関数ログを確認して原因を調査してください。

コードをもう少し詳しく見てみる:

  • package.jsonには、このNode.jsプロジェクトで使われる依存関係が定義されています。プロジェクトはシンプルで、主に以下のライブラリを使用します。
    • redisライブラリとredis-redisearchライブラリ:Redisへの接続とRediSearchコマンドの実行に使用
    • aws-lambdaライブラリ:NodeアプリケーションをAWS環境にデプロイするために必要なLambda関数の呼び出しに使用
  • serverless.ymlファイルは、HTTPアクションと呼び出されるJavaScript関数(handler.tsで定義)のマッピングを定義するとともに、環境変数(このデモでは主にRedis接続文字列)を保持しています。
  • handler.tsファイルは、AWS Gatewayから届くイベントを受け取り、アプリケーションライブラリSearchServiceを呼び出すクラスです。RedisデータベースへのすべてのアクセスはこのSearchServiceが担います。
  • SearchService.tsには、Redisデータベースとやり取りするための全メソッドが含まれており、client.ft_search()client.aggregate()client.hmset()などのRedisおよびRediSearch APIを使用しています(RedisおよびRediSearchのコマンドについては、Redis UniversityやGitHubの「Getting Started with RediSearch 2.0」チュートリアルで学べます)。

ステップ6:コメントマイクロサービス(Python)をビルドして実行する

以下の手順でプロジェクトをビルド・実行します(詳細はReadmeファイルをご参照ください)。

  1. Pythonプロジェクトへ移動し、仮想環境を作成します。
> cd movie-comments-microservice

> python3 -m venv chalice-env

> source chalice-env/bin/activate

2. 依存パッケージをインストールします。

> pip install -r requirements.txt

3. AWS環境をセットアップします。以下のコマンドを実行し、IDとシークレットキーを設定してください。

> aws configure

AWS Access Key ID [None]: ****************ABCD
AWS Secret Access Key [None]: ****************abCd
Default region name [None]: us-west-2
Default output format [None]:

4. 以下のコマンドでサービスをAWSにデプロイします。

> chalice deploy

Reusing existing deployment package.
Updating policy for IAM role: movie-comments-microservice-dev
Creating lambda function: movie-comments-microservice-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:us-east-1:11111111111:function:movie-comments-microservice-dev
  - Rest API URL: https://XXXXXXX.execute-api.us-east-1.amazonaws.com/api/

コードをもう少し詳しく見てみる:

  • requirements.txtには、このPythonプロジェクトの依存関係が定義されています。主なライブラリは以下のとおりです。
    • Chalice:Pythonでサーバーレスアプリケーションを作成するためのAWSフレームワーク
    • redisおよびredisearch:RedisへのアクセスとRediSearch APIの利用
  • config.jsonファイルはサーバーレスアプリケーションの定義に使用され、環境変数(このアプリではRedisデータベースの接続情報)を記述します。
  • app.pyファイルはアプリケーションのエントリポイントで、各種ルートを使ってRESTエンドポイントを定義します。CommentServiceなど複数の依存モジュールをインポートしており、Redisとのやり取りはCommentServiceが担当します。複数ファイルを使用する場合は、必ずchalicelibフォルダ内に配置する必要があります。
  • comment_service.pyには、コメントの作成・照会・削除に関するRedisとの全インタラクションが含まれています。コメント機能で注目すべきはsearch()メソッドです。search_client.search()呼び出しにより、作成日順にソートされた映画のコメントを取得できます。

なお、オプションとして、RedisデータベースのパスワードをAWS Key Management Serviceに保存することも可能です。設定手順についてはプロジェクトのドキュメントをご参照ください。

ステップ7:フロントエンドアプリケーションを実行する

  1. front-endディレクトリへ移動し、依存パッケージをインストールします。
> cd front-end

> npm install

2. .env.developmentファイルを編集し、映画サービスとコメントサービスのURLを設定します。

VUE_APP_MOVIES_SERVICE=https://<xxx>.execute-api.<reg>.amazonaws.com/api
VUE_APP_COMMENTS_SERVICE=https://<xxx>..execute-api.<reg>.amazonaws.com/api

3. アプリケーションを起動します。

> npm run serve

4. ブラウザでhttps://localhost:8084を開きます。

これでアプリケーション内を操作し、映画の更新・検索、コメントの追加・削除ができるようになりました。

オプションとして、S3とCloudFrontを使ってVueアプリケーションをAWS環境にデプロイし、ユーザーに公開することもできます。詳細はプロジェクトのドキュメントをご覧ください。

まとめ

AWS LambdaとRedis Enterprise Cloudを組み合わせることで、サービスのデプロイが格段にシンプルになります。RediSearch搭載のRedis Enterprise Cloudを使えば、値ベースでの柔軟なデータ検索が容易になり、Redisをサービスのメインデータベースとして活用できます。

Redis Enterprise CloudはRedis互換であるため、既存のRedis環境(OSS版でもマネージドサービスでも)からの移行も簡単です。接続パラメータ(データベースのエンドポイントなど)を変更するだけで済みます。ライブマイグレーションの方法は複数あり、例えば以下のような選択肢があります。

  • ブルー/グリーンデプロイメント
  • Active-Passive Geo-Distributionを使ったAmazon ElastiCacheとRedis Enterprise Cloudの同期
  • オープンソースツールRIOTを使ったデータ移行

RediSearchに加えて、Redis Enterprise Cloudではグラフ、JSON、時系列、Bloomフィルターなど、有望なデータモデルも利用できます。さらに、高可用性・スケーラビリティ・永続化・セキュリティ・Active-Active Geo-Distributionといった、本番環境で不可欠な多彩なデータベース機能も提供しています。

さらに詳しく知りたい方は、AWS re:Inventのホームページをチェックし、以下のチュートリアルやブログ記事もぜひご一読ください。

  • Get Started with Redis Modules on AWS(AWSでRedisモジュールを始める)
  • 6 Key Features to Consider When Choosing a DBaaS Provider(DBaaSプロバイダー選択時に考慮すべき6つのポイント)
  • How Redis Enterprise Cloud Meets the Needs of Maturing Enterprise Customers on AWS(Redis Enterprise CloudがAWS上で成熟したエンタープライズ顧客のニーズに応える方法)
  1. Flutter、Serverless Framework、Upstash(Redis)で構築するフルスタックサーバーレスアプリ 第2部

    チュートリアルシリーズ第2部へようこそ。第1部では、UpstashとServerless Framework、Redisを使ってREST APIを構築する方法を解説しました。 この第2部では、そのREST APIのエンドポイントを利用するモバイルアプリケーションをFlutterで構築していきます。 それでは始めましょう 🙃 事前準備 まず、お使いのコンピュータにFlutterがインストールされ、正常に動作している必要があります。 Flutter IDEで新しいFlutterプロジェクトを作成し、任意の名前を付けてください。 依存パッケージの追加 プロジェクトのルートディレクトリにあるpu

  2. Flutter、サーバーレスフレームワーク、Upstash(REDIS)を備えたフルスタックサーバーレスアプリ-パート1

    この投稿では、データを保存するためのFlutter、Serverless Framework、Upstash、Redisを使用してサーバーレスモバイルアプリケーションを構築します。 Upstashとは? Upstashは、Redis用のサーバーレスデータベースです。 Upstashを使用すると、リクエストごとに支払います。これは、データベースが使用されていないときに課金されないことを意味します。 Upstashはデータベースを構成および管理します。これは、DynamoDBやFaunaなどの他のデータベースの強力な代替手段であり、などの利点があります。 低レイテンシ REDISAPIと同