実践!ASP.NET Core の セッション情報を Redis に格納する

オウルです。

今回は、ASP.NET Core アプリケーションで使用するセッション情報を Redis に格納する方法を紹介します。環境は次の2パターンです。

  1. Kubernetes 上に ASP.NET Core App コンテナ + Redis コンテナ
  2. Windows OS の IIS で ASP.NET App をホスト + Redis on Windows

ASP.NET Core は、Windows、Mac、Linux で最新のクラウド ベースの Web アプリケーションをビルドするための、オープン ソースのクロスプラットフォーム .NET Framework ですが、ここ数年の Microsoft のオープンソース(OSS)への取り組みは勢いがあります。記憶に新しいのは2018年に、あのソースコードの共有プラットフォーム GitHub を買収しましたね。

証 バージョン
ASP.NET Core 2.2
Redis 5.x

Redis とは

Redisは、データ構造サーバーを実装するオープンソースソフトウェアプロジェクトである。いわゆるNoSQLデータベースの一つであり、Redis Labs(英語版)がスポンサーとなって開発されている[4]。ネットワーク接続されたインメモリデータベースでかつキー・バリュー型データベース(英語版)であり、オプションとして永続性を持つ。

https://ja.wikipedia.org/wiki/Redis『ウィキペディア(Wikipedia)』より引用

Redis persistence (永続化)

Redis の永続化には次の3種類があります。

RDB

指定された間隔でデータセットの即時スナップショットを実行します。

AOF

サーバーが受信したすべての書き込み操作をログに記録します。

永続化無効

メモリで管理します(揮発性)

また、RDB、AOF の併用も可能となっています。

公式ドキュメントでは RDB と AOF のメリット・デメリットについての説明があります。

redis-cli コマンド

Redis に格納した値を確認するときに便利なコマンドをいくつか紹介します。

Kubernetes 環境

以前の記事 ↓ でローカル環境に Kebernetes を準備する方法を紹介しています。

Visual Studio 2017 Community を使っての ASP.NET Core の Dockerアプリケーションについては ↓ で少し紹介しています。

パッケージインストール

Visual Studio 2017/ツール/NuGetパッケージマネジャー/ソリューションのNuGetパッケージの管理から次の2つをインストールします。

Microsoft.Extensions.Caching.Redis
Microsoft.AspNetCore.DataProtection.Redis
サーバ間でセッションが共有する場合に必要です。

ここでASP.NET Core のセッションについての基本情報です。

ASP.NET Core は、セッション ID を含む Cookie をクライアントに提供することで、セッションの状態を維持します。Cookie は要求ごとにサーバーに送信されます。 アプリは、セッション ID を使用してセッション データをフェッチします。

appsettings.json に追記

Redis の接続情報を追記します。ここでは、先ほどデプロイした Redis の Service オブジェクトの仮想IPアドレス(ClusterIP)を指定してください。Kubernetes 上に Pod としてデプロイするときは名前を指定します(redis.default.svc.cluster.local)が、今回は Visual Studio 2017 のDocker デバック機能で動作させることを前提としているためです。

Startup.cs にコードを追加

Controller にコードを追加

Windows 環境

Windows 版の Redis は ↓ の Microsoft が提供している Git Hub よりダウンロードしてインストールします。インストールが完了すると redis-cli が使用できます。コマンドプロンプトから redis-cli と入力してEnter キーを押下すると接続できます。

Windows 環境下も Kuberbetes 環境下と 1 ~ 3 は同様です。せっかくなので 4 の実装を DI依存関係の挿入)した IDistributedCache を使用する方法に変更します。ユーザ情報などは、HttpContext.Session を使用してください。

ASP.NET MVC のように [Serializable]属性を付与したクラスを Redis にぶち込もうとしたら怒られました。JsonConvert 等でシリアライズする必要があるみたいです。Redis に格納されたセッション情報は redis-cli を使用すると ”type [key]” の結果は ”hash” のため、”hgetall [key]” で確認できます。

クラウドの Redis サービス

Azure

Azure Cache for Redis

AWS

Amazon ElastiCache

GCP

Cloud Memorystore for Redis

まとめ

ASP.NET Core の セッション情報を Redis に格納する方法を紹介しました。ASP.NET Core も Redis も僕はお初なので新鮮でした。今回はRedis コンテナを Kubernetes 上に1つしかデプロイしていませんが、プロダクション環境下では Redis Cluster を採用するのが主流だと思われます(実は Redis Cluster に挑戦しようとしましたが、お初の僕には少しハードルが高く、次回以降に持ち越ししました。。。)

また Kubernetes 上にデプロイした Redis に ASP.NET Core App から現在の時間(DateTime.Now)を格納したのですが・・・あ、UTC だね。。。と Linux に慣れていない僕は、文字コードや改行コードなど基本的なところでもハマりました。でもこればっかりは少しずつインプットしていくしかないですね。因みに UTC から JST の変更はうまくいったので、また別の機会に。

「はじめての ASP.NET Core」シリーズ
  1. 作りながら学習
  2. プロジェクト作成
  3. AI 支援 IntelliCode
  4. NLog
  5. MVC(1)
  6. MVC(2)レイアウト
「【初心者向け】ASP.NET Core Identity」シリーズ
  1. ASP.NET Core Identity の2要素認証と Identity を使わない Cookie 認証 – 概要編
  2. ASP.NET Core Identity 構成編
↓ おさえておこう .Net Core 3.0 のポイント。

おススメ書籍

技術本を読むなら Kindle がおすすめです。こちらの記事をご覧ください。

▼ クラウドエンジニアの入門書
『ラウドエンジニア養成読本[クラウドを武器にするための知識&実例満載!] Software Design plus』

AWS をベースに Azure、GCP の3大パブリッククラウドについて、まとめた本です。クラウドに興味を持ち始めた人、1つのパブリッククラウドは知っているけど、他のパブリッククラウドを知らない人にとっては、比較できる良い本になっています。

▼ Dockerの入門書
『Dockerエキスパート養成読本[活用の基礎と実践ノウハウ満載!]』

Docker の基礎(インストール、Docker Engine、Dockerfile etc)から実践的な活用方法まで知ることができる本になっています。初心者には適度なボリューム(本の厚さ)で、とっかかりとしては良い本になっています。

▼ NoSQLの入門(Redisも紹介)
『7つのデータベース 7つの世界』

NoSQLはAWS、Azure、GCPで多様なサービスが提供されています。分散キャッシュとして使われる Redis も NoSQL の分類となります。特にRDBMS に慣れた人が、NoSQL を知るには良い本です。今やデータベースも、目的に応じて選択、組み合わせ(ハイブリッド)をするようになっています。