備忘録　ElastiCacheのRedisキャッシュとSidekiqの設定手順

## 自己紹介
はじめまして、はる（[@lemonade_37](https://twitter.com/lemonade_37)）と申します。
駆け出しエンジニアとして働き始めて約3ヶ月が経過しました🐣


## 概要
Sidekiqを使ってバックグラウンド処理を実装し、
本番環境のRedisでElastiCacheを使っていましたが、
一旦ElastiCacheを削除する運びとなったので、設定項目について備忘録を残します。
経緯については下記記事を参照ください🙇‍♀️
  
〜使わなくなった経緯〜

https://qiita.com/lemonade_37/items/aaaf063c523bd238413d

〜ローカルでの実装手順〜

https://qiita.com/lemonade_37/items/296bc211cf3e781c5600


### 環境
- Docker
- Ruby 3.2.3
- Rails 7.1.3

:::note warn
手探りで実装したものの備忘録のため、紹介した方法よりも良い設定方法があるかもしれませんので、その際は教えて頂けると嬉しいです🙇
:::


## 全体像
このようなインフラ構成です。
ElastiCache以外のインフラ環境はすでに構築されている前提とします。

![73b3f23d6bab57afb2d161730a86bc72.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/db5ae5d7-f512-8f34-69c2-f81622e244e0.png)

## AWS側の設定
### ElastiCache用のセキュリティグループを作成
1. EC2にアクセスし、セキュリティグループから`セキュリティグループを作成`を選択。
    　　
1. 以下のように設定し、作成する。
    ```
    セキュリティグループ名：任意
    説明：任意
    VPC：そのセキュリティグループを適用するVPCを選択する
    インバウンドルール：
      タイプ：カスタムTCP
      プロトコル：TCP
      ポート範囲：6379
      ソース：デフォルト
    アウトバウンドルール：なし
    ```
    ![ap-northeast-1.console.aws.amazon.com_ec2_home_region=ap-northeast-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/ed782ce5-d610-eca6-c8d7-14ecde406ef2.jpeg)
    ![14f9e5ecb671b2d4a9fc380d0febd23c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/5d5f8cd2-a60e-aca6-9cf3-e6dd326ab8ab.png)



### ElastiCacheのRedisキャッシュを作成
1. ElastiCacheにアクセスし、`使用を開始`のセレクトボックスで`Redis`を選択。
![1d9fed8c987bf557ef7a1e23a3746012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/f0697891-3393-51c4-1cfa-cb5a78198bdf.png)
　　
1. 1ページ目の設定は以下の通り。
    ```
    設定：
      デプロイオプション：独自のキャッシュを設計
      作成方法：クラスターキャッシュ
    クラスターモード：無効
    クラスター情報：
      名前：任意
      説明：任意
    ロケーション：
      ロケーション：AWSクラウド
      マルチAZ：有効化
      自動フェイルオーバー:有効化（デフォルト）
    クラスター設定：
      エンジンバージョン：7.1
      ポート：6379
      パラメータグループ：default.redis7
      ノードのタイプ：cache.t2.micro（一番小さくて安い）
      レプリケーション数：2
    サブネットグループの設定：
      サブネットグループ：新しいサブネットグループを作成
      名前：任意
      説明：任意
      VPC ID：クラスターを実行するVPCを選択
    アベイラビリティゾーンの配置：デフォルト
    ```
    
    ![ap-northeast-1.console.aws.amazon.com_elasticache_home_region=ap-northeast-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/9a2412b4-a726-ddbc-7dc7-ba9e34fbaaa7.jpeg)
    ![ap-northeast-1.console.aws.amazon.com_elasticache_home_region=ap-northeast-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/7b9e090d-d3cd-ecc3-aec3-149bb1716b67.jpeg)
　　
1. 2ページ目の設定で、最初に作成したセキュリティグループを選択。他の項目は以下の通り。（ほとんどデフォルト）
![ap-northeast-1.console.aws.amazon.com_elasticache_home_region=ap-northeast-1 (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/20edb3f4-5853-a392-8db4-59ce501b4c3c.jpeg)
![ap-northeast-1.console.aws.amazon.com_elasticache_home_region=ap-northeast-1 (2).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/2b8aade5-a4fb-0286-0df5-ada810e00ebe.jpeg)


## アプリ側の設定
1. config/initializers/sidekiq.rbを以下のように修正
    ```ruby:sidekiq.rb
    Sidekiq.configure_server do |config|
      config.redis = { url: ENV["SIDEKIQ_ENDPOINT"] }
    end
    
    Sidekiq.configure_client do |config|
      config.redis = { url: ENV["SIDEKIQ_ENDPOINT"] }
    end
    ```
    　　
1. 本番環境の.envファイルに下記を追加
    ```env:.env
    SIDEKIQ_ENDPOINT=redis://プライマリエンドポイント
    ```
    エンドポイントは、下記からコピーできる。
    ![f17e225b7c81d29b6b988397faca6cff.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3471604/3308e943-3cee-b739-6ead-970104e39664.jpeg)

:::note info
プライマリエンドポイントと、リーダーエンドポイントがあるが、それぞれ読み取り用、書き取り用。
Sidekiqで使用する場合においてはプライマリエンドポイントのみで良さそう。
:::

　
## 参考記事
- [RedisとElastiCacheを分かりやすくまとめてみた](https://qiita.com/gold-kou/items/966d9a0332f4e110c4f8#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F)
- [Amazon ElastiCache](https://qiita.com/leomaro7/items/f031cfdd7d12d5d5ccc5#3%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
- [Sidekiqを本番環境のEC2バックグラウンドで起動](https://qiita.com/topdownreading/items/d7b75c0674ed0f1d2e5e)
- [Amazon ElastiCache for Redisのエンドポイントを確認してみる](https://qiita.com/charon/items/53790d8826e32561535d)
- [【Amazon ElastiCache】 Rails設定](https://qiita.com/dev-sota/items/adcdaa2644be81775cf6)
- [ElastiCache(redis) を EC2 上の Rails に接続](https://qiita.com/mt2/items/af916608dfb8c4fc72c8#:~:text=%E3%82%A4%E3%83%B3%E3%83%90%E3%82%A6%E3%83%B3%E3%83%89%E3%81%AB%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B(Redis%E3%81%8B%E3%82%89EC2%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E8%A8%B1%E5%8F%AF%E3%81%99%E3%82%8B%E8%A8%AD%E5%AE%9A%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B))