はじめに

猫好きエンジニアの福田です。
そろそろ冬毛になる季節ですね。早く冬毛のモフモフで猫吸いしたい今日この頃です。

さて、皆さんは ElastiCache for Redis はお使いでしょうか。
AWSのElastiCache for Redisで「転送時の暗号化」を有効化する際、正しく設定をしなければRailsからRedisにアクセスできなくなってしまいます。
この記事では、実際にハマってしまった点を紹介しつつ有効化時に何をどう設定すれば良いかをまとめてみました。

この記事で伝えたいこと

  • 転送時の暗号化を有効する際に
    • RailsからRedisへの接続設定の変更が必要になるという事
    • redis-cliからの接続方法も変更になるという事

ハマった点

  • CDKで転送時の暗号化(transitEncryptionEnabled: true)を有効後、Rails/Sidekiqで以下エラーが発生してしまった
# Rails
I, [2022-07-04T10:09:47.164240 #1]  INFO -- : [91c88a0f-439f-4fbf-9850-76e8b6b51e4d] Rendering 500 with exception: Error connecting to Redis on master.${REDIS_NAME}.tppbel.apne1.cache.amazonaws.com:6379 (SocketError)
# Sidekiq
2022-07-04T09:02:10.506Z pid=1 tid=3kd WARN: Redis::CannotConnectError: Error connecting to Redis on master.${REDIS_NAME}.tppbel.apne1.cache.amazonaws.com:6379 (SocketError)
2022-07-04T09:02:10.506Z pid=1 tid=3kd WARN: /usr/local/bundle/gems/redis-4.6.0/lib/redis/client.rb:398:in `rescue in establish_connection'

(参考)CDKで有効化する

以下のように transitEncryptionEnabledtrueにすれば転送時の暗号化が有効になります。

# 例
this.replicationGroup = new elasticache.CfnReplicationGroup(this.scope, replicationGroupName, {
  replicationGroupId: replicationGroupName,
  replicationGroupDescription: replicationGroupName,
  engine: 'redis',
  // ...
  atRestEncryptionEnabled: true,
  transitEncryptionEnabled: true,  // <----- 転送時の暗号化を有効化

解決方法

Rails / Sidekiq

RailsでRedis URLを設定している箇所を以下のように変更する(sを一つ追加する)

変更前:redis://...
変更後:rediss://...

redis-cli

redis-cliから接続時は --tls オプションをつける

参考

ElastiCache(Redis)では「転送時の暗号化」以外にも「暗号化」と付く設定があります。
それは「保管中の暗号化」(atRestEncryptionEnabled)です。これはディスク上のデータを暗号化することでデータのセキュリティを強化する機能です。
この「保管中の暗号化」を有効化しても特にRailsの設定変更は必要ありませんでした。

まとめ

当時エラーを調査してもすぐに解決方法が見つからなかった(気がする)ので備忘として残しました。
要件でよく暗号化系を有効化することがありますが、AWSだけでなくアプリ側の設定変更が必要か不要かを事前に確認した上で有効化すべきと改めて感じました。
この記事がどなたかの参考になれば幸いです。