ElastiCache(Redis)へRuby on RailsでTLS接続方法のメモ

ElastiCache(Redis)で認証(Redis auth)設定を構成する場合、Redisへの通信暗号化が前提となります。

1. redis-cli での接続確認

redis-cliは、通信暗号化機能が実装されていないため、stunnelを使用した疎通・接続確認が可能です。

Amazon ElastiCache の転送時の暗号化が有効化された Redis ノードへの接続に redis-cli を使用するにはどうすればよいですか? redis-cli を使用して送信中の暗号化を有効にした Redis 用 Amazon ElastiCache ノードへの接続

2. Rails consoleを使用した接続確認

[前提環境] Rails ClientがLinuxへ導入済みであること

$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-linux]
$ gem -v
3.0.3
$ rails -v
Rails 5.2.4.3
$ gem list redis

*** LOCAL GEMS ***
redis (4.2.1)
redis-actionpack (5.2.0)
redis-activesupport (5.2.0)
redis-rack (2.1.3)
redis-rails (5.0.2)
redis-store (1.9.0)
redis-store-testing (0.0.2)

[通常時との差異] Redisオブジェクト作成時のurlを"rediss://"にします。 (url: 'rediss://<パスワード>@:<ポート>/0')

$ rails c
Loading development environment (Rails 5.2.4.3)
irb(main):001:0> redis = Redis.new(url: 'rediss://:This-is-a-sample-token@master.xxxxxxxxx.xxxxx.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://master.xxxxxx.xxxxxx.apne1.cache.amazonaws.com:6379/0>
irb(main):002:0> redis.set "mykeyid0002", "123456789abcdefg" 
=> "OK"
irb(main):003:0> redis.keys => ["mykeyid0002", "keyid1111", "mykeyid0001", "hoge"]

参考情報 Support of encryption when using Redis from Amazon ElastiCache

3. Rails session_store使用時の設定、接続/検証コマンド

Ruby on Railsサンプル簡易アプリをrails newで作成して、session_storeを用いたセッション管理をElastiCacheに格納するため以下session_store.rbを作成。

config/initializers/session_store.rb

<ApplicationName>::Application.config.session_store :redis_store, {
  servers: [
    {
      host: "master.xxxxxx.xxxxxx.apne1.cache.amazonaws.com",      xxx# EndPoint FQDN
      port: 6379,                                                                               # Port
      db: 0, 
      password: "this-is-a-test-token",                                                # Radis auth token (password)
      ssl: true,                                                                                   # ssl enable
      namespace: "session" 
    },
  ],
  expire_after: 90.minutes
}

rails s -b でアプリケーションを起動し、ブラウザからアクセスする。

$ rails s -b 10.0.X.XXX
=> Booting Puma
=> Rails 5.2.4.4 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.6 (ruby 2.6.6-p146), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://10.0.X.XXX:3000
Use Ctrl-C to stop

Rails ConsoleでElastiChacheにセッション情報が格納されているか確認する。

$ rails c
Running via Spring preloader in process 16498
Loading development environment (Rails 5.2.4.4)
irb(main):001:0> redis = Redis.new(url: 'rediss://:This-is-a-sample-token@master.XXXXXX.XXXXX.apne1.cache.amazonaws.com:6379/0')
=> #<Redis client v4.2.1 for redis://master.rXXXXX.XXXXXX.apne1.cache.amazonaws.com:6379/0>

irb(main):002:0> redis.keys
=> ["session:2::11bd96f4315c95ef2b216bcf4e2807a056efdb2143735d41bb3f2c2ae689c247"]           ← Session情報Key

irb(main):003:0> redis.get "session:2::11bd96f4315c95ef2b216bcf4e2807a056efdb2143735d41bb3f2c2ae689c247"    
=> "\u0004\b{\u0006I\"\u0010_csrf_token\u0006:\u0006EFI\"1fRkIT2faQQxor1sqNiRaDCp6l3G2eEsKR2XA8ImG2ZI=\u0006;\u0000F"   
↑ Session情報

# 他クライアントからRailsアプリケーションへアクセス
irb(main):004:0> redis.keys
=> ["session:2::19177af23f6ec49087bf08ca78deda97d7dd7f884d8b77f367df6d7599b4350a", "session:2::11bd96f4315c95ef2b216bcf4e2807a056efdb2143735d41bb3f2c2ae689c247"] 
↑ Session情報Keyが追加された

irb(main):005:0> 

以上