コンテンツにスキップ

redis pattern

概要

redis patternモジュールでは、インメモリデータストアであるRedisを構築します。

構築したRedisは、例えばキャッシュやWebアプリケーションのセッション等で利用できます。

想定する適用対象環境

redis patternは、Runtime環境での使用を想定しています。

依存するpattern

redis patternは、事前に以下のpatternが適用されていることを前提としています。

pattern名 利用する情報
network pattern プライベートサブネット
encryption_key pattern CMKのエイリアス

本patternが依存するリソースを他の構築手段で代替する場合は、依存するpatternと入出力リファレンスの内容を参考に、本patternが必要とするリソースを構築してください。

構築されるリソース

このpatternでは、以下のリソースが構築されます。

リソース名 説明
Amazon ElastiCache for Redis インメモリデータストアを構築します

モジュールの理解に向けて

redis patternでは、Amazon ElastiCache for Redisを構築するためのTerraformモジュールを提供します。

Redisは、インメモリのデータストアです。キャッシュやWebアプリケーションのセッション保存などのユースケースで、多く用いられます。

Amazon ElastiCache for Redisは、以下の3つのいずれかの構成をとります。

  • 単一ノードRedisクラスター
  • 単一シャードであり、レプリケーションをサポートするRedisクラスター(クラスターモードが無効)
  • シャードが1〜90であり、レプリケーションをサポートするRedisクラスター(クラスターモードが有効)

各構成の詳細については、次のドキュメントを参照してください。

Redis 用 ElastiCache の用語

いずれの構成も、Amazon ElastiCache for Redisでは「Redisクラスター」と呼ばれます。

どの構成を選択するかは、Redisに求める可用性、使用するデータ量に依存します。

マルチAZに関する注意事項

現時点のEponaでは、自動フェイルオーバー構成のみ有効にできます。
もしもマルチAZ構成が必要となる場合は、Terraform外(AWS CLIやマネジメントコンソール)での変更作業が必要になります。

可用性とスケーラビリティの向上

単一ノードのRedisクラスターの場合、ノードが停止するとデータが失われます。これを避ける場合は、レプリケーション(クラスターモード無効)を行い他のノードにデータをコピーすることで、可用性を高めることができます。

レプリケーショングループを使用する高可用性

また、単一ノードのRedisクラスターの障害を軽減するには、以下のドキュメントを参照してください。

ノードの障害の軽減

クラスターモードが無効な場合

レプリケーション(クラスターモード無効)を使用していてレプリカノードを持つ場合は、プライマリノードの更新がレプリカノードに伝播されています。
このため、プライマリノードに障害があった場合の復旧にレプリカを活用できます。

プライマリノードが復帰するまでのフローについては、以下のドキュメントを参照してください。

障害の軽減 Redisレプリケーション・グループ

また、読み込み操作に関してはレプリカを活用した負荷分散も可能です。
レプリケーション(クラスターモード無効)では読み込みの負荷分散を行うことができますが、書き込みに対するオペレーションおよび保持できるデータ量は単一ノードに制限されます。

クラスターモードが有効な場合

書き込み操作の負荷分散や、単一ノードあたりのデータ量を分散する必要がある場合は、レプリケーション(クラスターモード有効)の利用を検討します。

レプリケーション: Redis (クラスターモードが無効) と Redis (クラスターモードが有効) の比較

クラスターモードを有効にすることで、Redisクラスターの可用性およびスケーラビリティは高まります。
ただし、それに合わせて使用するノードも増えていくことになるためコストが増大します。

要件に合わせて、適切なクラスター構成、インスタンスサイズを選択してください。

エンドポイントを把握する

構築されたAmazon ElastiCache for Redisクラスターに接続するためには、エンドポイントに関する情報が必要になります。このエンドポイントの情報は、Redisクラスターの構築時に決まります。

またRedisクラスターのエンドポイントには複数の種類があり、どのエンドポイントを利用するのかはRedisクラスターの構成ごとに異なります。以下に、Redisクラスターの構成と、利用するエンドポイントの対応を記載します。

構成 書き込みエンドポイント 読み込みエンドポイント
単一ノードRedisクラスター ノードのエンドポイント ノードのエンドポイント
Redisクラスター(クラスターモード無効) PrimaryEndpoint ReaderEndpoint
Redisクラスター(クラスターモード有効) ConfigurationEndpoint ConfigurationEndPoint

redis patternの適用結果として取得できるのは、PrimaryEndpointとConfigurationEndpointの2つです。

ℹ️ これは、Terraform AWS Providerの制限です。

その他のエンドポイントの取得方法に関しては、Amazon ElastiCache for Redisのドキュメントを参考にして取得してください。

接続エンドポイントの検索

取得したエンドポイントは、parameter_store patternを使用した秘匿情報として格納することになるでしょう。

RedisをAUTHトークンで保護する

Redisクラスターは、デフォルトでは認証なしでアクセスできてしまいます。

redis patternではセキュリティを高めるため、AUTHトークンを設定で求めるように実装しており、構築されたRedisクラスターへのアクセスにはAUTHトークンが必要になります。

Redis AUTH コマンドによるユーザーの認証

ℹ️ AUTHトークンを設定するには、Redis 用 ElastiCache 伝送中の暗号化 (TLS)の有効化が要件となります。

ℹ️ AUTHトークンを設定したRedisクラスターへの接続へは、SSL/TLS通信が要求されることに注意してください。

また、構築の際にAUTHトークンをredis patternに指定するのですが、.tfファイルに記載すると秘匿情報が平文でハードコードされることになります。

この状態はセキュリティの面からは好ましくないので、redis pattern適用後にAWS CLIでAUTHトークンを更新することを推奨します。

Redis AUTH コマンドによるユーザーの認証 / AUTH トークンの更新

Redisクラスター構築後、AUTHトークンを変更して、再設定したAUTHトークンを秘匿情報として管理してください。

⚠️ redis patternでは、引数として指定するAUTHトークンは初期値として扱い、更新はサポートしていません。

⚠️ .tfファイル上のAUTHトークンを更新して再度terraform applyしても、その差分は無視されます。

モニタリング

Amazon ElastiCache for Redisでは、Amazon CloudWatchメトリクスを使用したモニタリングが可能です。

CloudWatch メトリクスを使用したモニタリング

収集したメトリクスを使い、モニタリングおよび監視を行えます。

さらにDatadogが使用可能でありAWSとのインテグレーションを実施している場合は、Amazon CloudWatchメトリクスもDatadogで確認できます。

イベント通知

Amazon ElastiCache for Redisクラスター上で発生する重要なイベントは、Amazon SNSにより通知されます。

ElastiCache イベントのモニタリング

この通知をモニタリングすることで、クラスターの状態等を知ることができます。

ℹ️ 現時点のEponaでは、通知先のAmazon SNSを指定することのみをサポートしています。

メンテナンス

Amazon ElastiCache for Redisでは、Redisクラスターのメンテナンスが実施されます。メンテナンスでは、変更の適用が実施されます。

redis patternでは、メンテナンスウィンドウの指定を必須としています。

  • maintenance_window : メンテナンスウィンドウ(ddd:hh24:mi-ddd:hh24:mi:24時間表記、UTC指定)

サービスの内容に応じてメンテナンスウィンドウと変更の適用タイミングの方針を決定し、モジュールの設定に反映してください。

ℹ️ 変更を即座に反映するか、メンテナンスウィンドウで反映するかはapply_immediatelyで制御します。

バックアップ

Amazon ElastiCache for Redisでは、自動スナップショットを取得することでバックアップを実現できます。

Redis 用 ElastiCache でのバックアップと復元

redis patternでは、以下の変数を設定することでRedisクラスターの自動スナップショット取得を有効とします。

  • snapshot_retention_limit : バックアップ保管世代(最大35)
  • snapshot_window : バックアップウィンドウ(HH:MM-HH:MM表記)

これらは必須項目としています。自動スナップショットを無効にしたい場合は両方にnullを指定、またはsnapshot_retention_limit0を指定してください。

⚠️
自動スナップショットには保持期間があり、期限が過ぎたスナップショットは削除されます。
redis patternモジュールを使用して、自動で取得したスナップショットからリストアを行う場合、スナップショットをコピーして使用することを強く推奨します

ただし、現在のredis patternでは、スナップショットからのリストアのみがサポートされています。
スナップショットのコピーは、AWS CLIで行う必要があります。

詳細は、リストアを参照してください。

リストア

redis patternではスナップショットからのリストアが可能です。リストアは、Redisクラスターを再作成することで行います。

⚠️
Amazon ElastiCache for Redisでは、スナップショットおよびAmazon S3からのリストアが可能です。
ただし、現在のredis patternではスナップショットからのリストアのみがサポートされています。

リストア手順は以下のとおりです。

  1. Redisクラスターをデプロイしたterraformコードに、snapshot_nameを追加指定します。変数の値は、リストア先のスナップショット名を入力します

  2. terraformを実行します

Redisクラスターが新規作成されることになるため、Redisのエンドポイント(DNS名)が変更される点にご注意ください。 必要に応じ、Redisを利用するアプリケーションのRedisへの接続設定を修正してください。

アプリケーションがDNSの参照結果をキャッシュする場合は、TTLを適切に設定してください。
Javaの場合の参考情報は、database patternにも記載しています。


⚠️ リストア後の注意点について。

リストアを行った後は、別のスナップショットからリストアする場合を除いてsnapshot_nameに指定した値を変更しないでください。
snapshot_nameを指定してリストア後、この値を変更してTerraformを実行した場合、以下の挙動になります。

  • snapshot_nameの値を削除 → Redisクラスターの再作成(データがない状態で再作成)
  • snapshot_nameに別のスナップショットを指定 → 指定のスナップショットからリストア

またsnapshot_nameに指定したスナップショットが存在しない場合、 Redisクラスターが削除されリストアは失敗します
スナップショットが期限切れなどで削除されたりすると、その後のTerraform実行時に意図せぬRedisクラスター削除となる恐れがあるため注意してください。

ℹ️ リストア後にsnapshot_nameを変更せずにTerraformを実行した場合、リストアされるのは初回だけです。

このため自動バックアップで取得したスナップショットは直接使わずに、事前に手動でコピーして使用してください。

ただし、現在のredis patternでは、スナップショットからのリストアのみがサポートされています。
スナップショットのコピーは、AWS CLIで行う必要があります。

$ aws elasticache copy-snapshot \
    --source-snapshot-name [コピー元スナップショット] \
    --target-snapshot-name [コピー先スナップショット]

バックアップ (AWS CLI) のコピー


サンプルコード

redis patternを使用したサンプルコードを、以下に記載します。

module "redis" {
  source = "git::https://gitlab.com/eponas/epona.git//modules/aws/patterns/redis?ref=v0.2.6"

  replication_group_id          = "example-redis-cluster"
  replication_group_description = "Example Redis Cluster"

  vpc_id = data.terraform_remote_state.production_network.outputs.network.vpc_id

  cluster_mode_enabled = false

  number_cache_clusters = 1

  auth_token = "[your-redis-auth-token]"  # AUTHトークン

  kms_key_id = data.terraform_remote_state.production_encryption_key.outputs.encryption_key.keys["alias/my-encryption-key"].key_arn

  engine_version             = "5.0.6"
  node_type                  = "cache.t3.medium"
  automatic_failover_enabled = false

  maintenance_window         = "wed:16:00-wed:17:00"

  apply_immediately = true

  family = "redis5.0"

  subnets = data.terraform_remote_state.production_network.outputs.network.private_subnets

  snapshot_retention_limit = 35
  snapshot_window          = "18:00-19:00"

  # parameter groupの設定
  parameters = [
    {
      name  = ...
      value = ...
    },
    {
      name  = ...
      value = ...
    }
  ]

  tags = {
    # 任意のタグ
    Environment        = "runtime"
    RuntimeEnvironment = "production"
    ManagedBy          = "epona"
  }
}

関連するpattern

redis patternに関連するpatternを、以下に記載します。

pattern名 説明
parameter_store pattern このpatternを使用して構築されたAmazon ElastiCache for Redisのエンドポイントや認証トークンを、秘匿情報として格納します
public_traffic_container_service pattern コンテナ環境で動作するアプリケーションから、インメモリデータストアとしてAmazon ElastiCache for Redisを利用します

入出力リファレンス

Requirements

Name Version
terraform ~> 0.14.10
aws >= 3.37.0, < 4.0.0

Inputs

Name Description Type Default Required
apply_immediately 変更をすぐに適用する場合、trueを指定する(クラスターが再起動されることがある) bool n/a yes
auth_token 認証トークン(パスワード) string n/a yes
automatic_failover_enabled 自動フェイルオーバーを有効にする場合、trueを指定する。マルチAZ前提 bool n/a yes
engine_version ElastiCache for Redisのエンジンバージョン string n/a yes
family ElastiCache for Redisのパラメーターグループを作成する際のテンプレートとなる、パラメーターグループファミリー string n/a yes
kms_key_id KMSキー string n/a yes
maintenance_window メンテナンスウィンドウをddd:hh24:mi-ddd:hh24:mi(UTC)形式で指定する。例:sun:05:00-sun:09:00 https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/maintenance-window.html string n/a yes
node_type ElastiCache for Redisで使用するノードタイプ string n/a yes
replication_group_description ElastiCache for Redisのレプリケーショングループの説明 string n/a yes
replication_group_id ElastiCache for RedisのレプリケーショングループID string n/a yes
snapshot_retention_limit バックアップ保管期間。0〜35(日)の範囲で指定すること。 number n/a yes
snapshot_window 日次スナップショットを取得する時間をhh24:mi-hh24:mi(UTC)形式で指定する。例:05:00-09:00 https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/backups-automatic.html string n/a yes
subnets ElastiCache for Redisの配置先となるサブネットID list(string) n/a yes
vpc_id 作成するリソースを配置するVPC ID string n/a yes
at_rest_encryption_enabled 保管時の暗号化を有効にする場合、trueを設定する bool true no
availability_zones クラスターモードが有効の場合、ElastiCacheクラスターを配置するAZを指定する。number_cache_clustersの数と同じにする必要がある list(string) null no
cluster_mode_enabled クラスターモードを有効にする場合、trueを設定する bool false no
cluster_mode_num_node_groups クラスターモード有効時の、ノードグループ数 number 0 no
cluster_mode_replicas_per_node_group クラスターモード有効時の、クラスター内のノード数 number 0 no
notification_topic_arn 通知用のSNS ARN string null no
number_cache_clusters ElastiCache for Redisのクラスター自体の数。クラスターモードの無効の場合は必須で、マルチAZを有効にする場合は少なくとも2とする必要がある number 1 no
parameters パラメーターグループに指定する、パラメーターのリスト(name, value) list(map(string)) [] no
port ElastiCache for Redisが使用するポート number 6379 no
security_groups ElastiCache for Redisに適用する、セキュリティグループ list(string) [] no
snapshot_name スナップショット名 string null no
source_security_group_ids Redisに設定するセキュリティグループのインバウンドに指定するSecurity Group IDリスト list(string) [] no
tags ElastiCache for Redisに関するリソースに付与するタグ map(string) {} no
transit_encryption_enabled データ転送における暗号化を有効にする場合、trueを設定する bool true no

Outputs

Name Description
elasticache_redis_configuration_endpoint_address クラスターモード有効時のエンドポイント(ConfigurationEndpoint)のアドレス
elasticache_redis_port ElastiCache for Redisへの接続ポート
elasticache_redis_primary_endpoint_address クラスターモード無効時の読み書きを行うエンドポイント(PrimaryEndPoint)のアドレス
elasticache_redis_replication_group_id ElastiCache for RedisのレプリケーショングループのID

※ このドキュメントはクリエイティブコモンズ(Creative Commons) 4.0 の「表示—継承」に準拠しています。

※ このドキュメントに記載されている会社名、製品名は、各社の登録商標または商標です。

© 2021 TIS Inc.