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の使用を推奨します。
-
UpstashのPipeline APIでサーバーレスRedisを高速化:複数コマンドを1リクエストで実行
Upstashは、ネイティブなRedis APIに加えてREST APIもサポートしており、開発者はサーバーレス関数やエッジ関数から接続の問題を気にせずRedisへアクセスできます。しかし、同じ関数内で複数のRedisコマンドを実行する場合、その回数だけデータベースへの呼び出しが発生してしまうという課題がありました。 そこで、コミュニティメンバーの一人である@MasterGates氏が、Discordチャンネルで素晴らしい提案をしてくれました。それが「Pipeline API」です。 Pipeline APIとは Pipeline APIは、RedisのPIPELINEコマンドをREST A
-
Cloudflare WorkersとRedisで実現するエッジコンピューティング活用術
エッジコンピューティングは、近年もっとも注目されている技術のひとつです。CDNがファイルをユーザーの近くに配置できるようにしたのと同じように、エッジコンピューティングはアプリケーションそのものをユーザーの近くで実行できるようにします。これにより、開発者はグローバルに分散され、高いパフォーマンスを発揮するアプリケーションを構築できるようになります。 Cloudflare Workersとステートレス性の課題 現在この分野をリードしている製品がCloudflare Workersです。コールドスタートのないサーバーレス実行環境を提供し、Cloudflareのグローバルネットワークを活かすことで、ア