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

Upstash RedisのREST APIで実現するステートフルなAWS Lambda

AWS Lambdaはサーバーレスコンピューティングの先駆けであり、多くの開発者がサーバーレスこそが開発の未来だと考えています。真の従量課金(ペイ・パー・ユース)モデルを実現し、バックエンドインフラの保守やスケーリングから解放される点は大きな魅力です。しかし一方で課題も存在します。そのひとつが「ステートレス」であるという特性です。状態を保持するには外部のデータストアが必要になりますが、主要なデータストアの多くはコネクションベースで設計されています。以前の記事で解説したように、サーバーレス環境では接続の管理が大きな負担になりがちです。そこで私たちは、Upstash Redisの上に高性能なREST APIを構築しました。本記事では、このREST APIを使用して、AWS LambdaとUpstash RedisによるごくシンプルなステートフルAPI(ページカウンター)を実装します。

ライブデモ:https://3jyz1n07o8.execute-api.us-east-1.amazonaws.com/count

ソースコード:GitHubリポジトリはこちら

プロジェクトのセットアップ

アプリケーションのデプロイにはServerless Frameworkを使用します。

git:(master) ✗ serverless

Serverless: No project detected. Do you want to create a new one? Yes
Serverless: What do you want to make? AWS Node.js
Serverless: What do you want to call this project? aws-lambda-redis-rest
Project successfully created in 'aws-lambda-redis-rest' folder.

コードの実装

まずnpm install node-fetchでfetchをインストールします。次にUpstashコンソールからデータベースを作成し、「REST API」ボタンをクリックしてURLとトークンをコピーします。そしてhandler.jsを以下のように更新してください。

const fetch = require("node-fetch");

module.exports.hello = async (event) => {
  const url =
    "https://us1-last-panther-33620.upstash.io/incr/counter?_token=AACQgMzYyNGM0OGMtZWQ3MC00OTRlLWFmOGEtODc3ZWQxYWQyZGJjZjgyOTlkM2JhNWIxE3OTJlNmE2NGVjNGM=";
  let data = await fetch(url);
  let result = await data.text();
  return { statusCode: 200, body: result };
};

続いて、serverless.ymlにAPIエンドポイントを以下のように追加します。

service: aws-lambda-redis-rest
frameworkVersion: '2'

provider:
 name: aws
 runtime: nodejs12.x
 lambdaHashingVersion: 20201221

functions:
 hello:
   handler: handler.hello
   events:
     - httpApi:
         path: /count
         method: get

実行とデプロイ

関数はローカル環境で以下のコマンドにより実行できます。

serverless invoke local -f hello

デプロイは以下のコマンドで行います。

serverless deploy

デプロイが完了するとURLが出力されるので、ブラウザでアクセスして動作を確認できます。

補足事項

  • 最高のパフォーマンスを得るためには、データベースとAWS Lambda関数を同じリージョンに配置してください。
  • REST APIを利用することで、データベース接続の管理が不要になり、Redisクライアントも一切必要ありません。
  • APIトークンは公開しないでください。誤って漏洩した場合は、データベースのパスワードをリセットすることでトークンを無効化できます。
  • 1つの関数内で複数のコマンドを実行したい場合は、パフォーマンスを最大化するためにパイプラインAPIの使用を推奨します。
  1. UpstashのPipeline APIでサーバーレスRedisを高速化:複数コマンドを1リクエストで実行

    Upstashは、ネイティブなRedis APIに加えてREST APIもサポートしており、開発者はサーバーレス関数やエッジ関数から接続の問題を気にせずRedisへアクセスできます。しかし、同じ関数内で複数のRedisコマンドを実行する場合、その回数だけデータベースへの呼び出しが発生してしまうという課題がありました。 そこで、コミュニティメンバーの一人である@MasterGates氏が、Discordチャンネルで素晴らしい提案をしてくれました。それが「Pipeline API」です。 Pipeline APIとは Pipeline APIは、RedisのPIPELINEコマンドをREST A

  2. Cloudflare WorkersとRedisで実現するエッジコンピューティング活用術

    エッジコンピューティングは、近年もっとも注目されている技術のひとつです。CDNがファイルをユーザーの近くに配置できるようにしたのと同じように、エッジコンピューティングはアプリケーションそのものをユーザーの近くで実行できるようにします。これにより、開発者はグローバルに分散され、高いパフォーマンスを発揮するアプリケーションを構築できるようになります。 Cloudflare Workersとステートレス性の課題 現在この分野をリードしている製品がCloudflare Workersです。コールドスタートのないサーバーレス実行環境を提供し、Cloudflareのグローバルネットワークを活かすことで、ア