ASP.NETのセッション管理にAmazon DynamoDBを使ってみる

# 0. 前書き
ASP.NETのセッション管理のバリエーションを自分の中で増やしているシリーズをしています。３回目は、Amazon Web ServicesのDynamoDBを利用するパターンです。前々回「[ASP.NETのセッション管理方法を整理する](http://qiita.com/84zume/items/dce5c9b496665183f1a9)」で、ASP.NETのセッション管理方法についてまとめました。今回も、Custom定義のバリエーションの１つとして試した手順をまとめます。内容は、前回の[Azure Redis Cache編](http://qiita.com/84zume/items/dfd9180a835b742eb4a3)と同じ流れで書いていこうと思います。

**バージョン情報**

|name|ver.|
|:--|:---:|
|ASP.NET MVC|4.5.2|
|AWSSDK.Core|3.1.0|
|AWSSDK.DynamoDBv2|3.1.0|
|AWS.SessionProvider|3.1.0.2|

# 1. Amazon DynamoDBとは
Amazon DynamoDBとは、Amazon Web Services（AWS）が提供しているマネージド型のNoSQLサービスです。解説しているSlideShareがありましたので、詳しくはこちらを参照してください⇒「[Amazon DynamoDB（初心者向け 超速マスター編）](http://www.slideshare.net/shimy_net/amazon-dynamodb-23315068)」

# 2. 実際に使ってみる
Amazon DynamoDBを有効化し、アプリケーションで利用するまでを手順を追って説明していきます。

## 2-1. Amazon DynamoDBを新規に作成する
AWSのポータルにて、Amazon DynamoDBサービスの利用開始をします。
こちらから新規作成。（私は初めて作成するので以下の画面が表示されました）
https://console.aws.amazon.com/dynamodb/

「Create table」をクリックして、テーブル作成画面に移動します。

![dynamo1.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/4cd1126b-d9a6-e26f-516c-5bff09f91635.jpeg)

下の画面で、次の２項目を設定します。

|項目|設定値 |
|:--|:--|
|テーブル名|ASP.NET_SessionState|
|プライマリーキー|SessionId（文字列）|

入力したら、画面右下の「作成」をクリック。

![dynamo2.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/85f2597e-98e7-767f-2082-f5ef61decb24.jpeg)

しばらくする（数分）と、デプロイが終了して、DynamoDBが利用可能な状態になります。
今後の作業で以下の値が必要になりますので、ポータルを開いているうちに控えておいてください。

* Region：DynamoDBを稼働している場所。東京リージョンなら、「ap-northeast-1」です。
* Access key：ポータルの認証情報画面から取得できるアクセスキー。
* Secret key：アクセスキーとペアになっているシークレットアクセスキー。

## 2-2. ASP.NET MVCのアプリケーションを作成する
Visual Studioにて、新規のASP.NET MVCアプリケーションを作成します。

## 2-3. AWS.SessionProviderをインストールする
Amazon DynamoDB用のセッションプロバイダーを先ほど作成したアプリケーションにインストールします。
nugetを利用して、dllのダウンロード・参照追加、ツールのダウンロード、依存するモジュール（AWSSDK.CoreやAWS.SessionProvider）のダウンロードをしてもらいます。
プロジェクトを右クリックして、「NuGetのパッケージ管理」を選ぶとGUIでパッケージのインストールができます。
「AWS.SessionProvider」で絞り込み。

![nuget.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/6a28b21c-9204-9c58-a7d1-303508727ece.jpeg)

## 2-4. Profile Credentialsを作成する
AWSのサービスにアクセスするために、Profile Credentialsを作成します。
さきほどnugetで取得したツールの中に、Profile Credentialsを作成するためのPowerShellが内包されています。
PowerShellのコンソールを開いて、次のコマンドを実行。

```ps1
>> cd <solution-dir>/packages/AWSSDK-X.X.X.X/tools //バージョン番号は取得したもの
>> .\account-management.ps1                        //ツールを実行
1) Add/Update new profile credentials
2) List registered profiles
3) Remove profile credentials
4) Exit

Choose an option: 1                               //新規作成
Profile name: : XXXXXXXXXXXXXXXXXXXXXX            //任意のプロファイル名を指定 
Access key: : YYYYYYYYYYYYYYYYYYYYYY              //アクセスキーを入力
Secret key: : ZZZZZZZZZZZZZZZZZZZZZZ              //シークレットアクセスキー入力
1) Add/Update new profile credentials
2) List registered profiles
3) Remove profile credentials
4) Exit

Choose an option: 4
>>
```

ちなみに、ツール実行時に「AWSSDK.Core.dllが見つかりません」みたいなエラーが出た場合は、当該ps1ファイルの4行目の記述をフルパスに変更すると良いです。（$dllpath = "..\lib\net35\AWSSDK.Core.dll"）

## 2-5. Web.configに定義を追加する
2-1と2-4で取得した定義をWeb.configに反映します。
AWSProfileNameにさきほど作成した「プロファイル名」記述。

```xml:web.config
<system.web>
  ...
  <sessionState mode="Custom" customProvider="DynamoDBSessionStoreProvider">
    <providers>
      <add name="DynamoDBSessionStoreProvider"
            type="Amazon.SessionProvider.DynamoDBSessionStateStore"
            AWSProfileName="XXXXXXXXXXXXXXXXXXXXXX"
            Region="ap-northeast-1"
        />
    </providers>
  </sessionState>
</system.web>
```

## 2-5. 動作確認用のコードを書く
前回と全く同じですが、動作確認用のコードは、Indexページにアクセスした時刻をSessionに記録し、
AboutページでSessionから復元する、といった動きにします。「time」をキーにSessionにデータを格納します。

```csharp:HomeController.cs
public class HomeController : Controller
{
    public ActionResult Index()
    {
        Session["time"] = DateTime.Now;
        return View();
    }

    public ActionResult About()
    {
        ViewBag.Oldtime = Session["time"];
        ViewBag.Now = DateTime.Now;
        return View();
    }
}
```

結果を、Aboutページで表示します。

```html:About.cshtml
@{
    ViewBag.Title = "About";
}
<h2>@ViewBag.Title.</h2>

<p>
    Indexページを開いた日時 @ViewBag.Oldtime
</p>
<p>
    このページを開いた日時 @ViewBag.Now
</p>
```

# 3. 実行結果
時間が保存されてAboutページで復元されました！
![result.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/eed1a5b1-2ebe-7343-4b1e-79d3bad13e96.jpeg)


本当にAmazon DynamoDBが利用されているかは、今回はAWSのコンソールから確認してみます。

![result2.JPG](https://qiita-image-store.s3.amazonaws.com/0/34410/6ce48c16-eac9-5b09-958a-28fea87b936f.jpeg)

セッションIDをキーにデータが保管されているのが分かりますね、
ちなみに上の結果は、2つのブラウザからアクセスしたあとにスクリーンショットをとりました。
そのためセッション情報が2つ格納されていることが分かります。

# 4. おわりに
前回と同じ感想ですが…可用性の高いセッションサーバが簡単にできて便利ですね。
あとnugetで依存モジュールを全部取得してくれるのは便利です。

# 5. 参考
今回はAWSのドキュメントを参考にして実施しました。
[Managing ASP.NET Session State with Amazon DynamoDB](http://docs.aws.amazon.com/AWSSdkDocsNET/V3/DeveloperGuide/net-dg-dynamodb-session.html)