TerraformでRedisを構築してみる

# はじめに

Terraformの勉強を始めたので備忘録を兼ねて行ったことを投稿しようと思います。
以下の３つの投稿内容を実施した上でRedisの構築を行なっています。
[TerraformをインストールしてTerraformでAWS上にEC2作ってみる](https://qiita.com/kakita-yzrh/items/1357a219b4a891a441ff)
[TerraformでIAMを設定してEC2にセッションマネージャー経由で接続してみる](https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6)
[Terraformでセキュリティグループを設定してEC2にhttp接続する](https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad)

# TerraformにRedisの定義を追加
### Redis接続用のセキュリティグループを定義する
今回、Redisへの接続はEC2から行います。
その為、Redisへの接続はEC2に付与されるセキュリティグループからのみ許可するようにします。
```terraform:securitygroup.tf
resource "aws_security_group" "test_redis" {
  name = "tf_test_redis"

  tags = {
    Name = "tf_test_redis"
  }
}

resource "aws_security_group_rule" "redis" {
  type                     = "ingress"
  from_port                = 6379
  to_port                  = 6379
  protocol                 = "tcp"
  source_security_group_id = aws_security_group.test.id
  security_group_id        = aws_security_group.test_redis.id
}
```
`source_security_group_id`に設定されたセキュリティグループIDのみ接続を許可
`aws_security_group.test.id`は以下で作成したセキュリティグループです
https://qiita.com/kakita-yzrh/items/6bdc11f2882c67a949ad#http%E6%8E%A5%E7%B6%9A%E7%94%A8%E3%81%AE%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%E5%AE%9A%E7%BE%A9

### Redisインスタンスを定義する
Redisに関する情報を定義していきます。
```terraform:redis.tf
resource "aws_elasticache_replication_group" "redis" {
  replication_group_id          = "test-redis-group"
  description                   = "test redis group"
  node_type                     = "cache.t4g.micro"
  engine_version                = "7.0"
  port                          = 6379
  parameter_group_name          = "default.redis7.cluster.on"
  automatic_failover_enabled    = true
  # シャード数
  num_node_groups         = 1
  # レプリカノード数
  replicas_per_node_group = 1
  
  security_group_ids = [
    aws_security_group.test_redis.id
  ]

  tags = {
    Name = "tf_test_redis"
  }
}
```

`security_group_ids`に定義したRedis接続用のセキュリティグループIDを設定

`engine_version`を`7.0`に設定していますが、AWS Providerのバージョンが３系だと `terraform plan`を実行するとエラーが出ました。
AWS Providerのバージョンを4系(v4.64.0)にアップデートするとエラーは出なくなりました。

# Terraformで定義したセキュリティグループとRedisを作成
### Terraformのplan applyを実行
terraformのplan applyを実行して、AWS上にリソースを作成します。
```
terraform plan
terraform apply
```

# EC2に接続してRedisに接続する
### セッションマネージャーで作成したEC2に接続する
以下と同様にEC2に接続します。

https://qiita.com/kakita-yzrh/items/980f3209d587e7e349a6#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%A7%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9Fec2%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B

### EC2にredis-cliをインストール
公式の手順にそってredis-cliをインストールします
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/red-ug/GettingStarted.ConnectToCacheNode.html

```
sudo amazon-linux-extras install epel -y
sudo yum install gcc jemalloc-devel openssl-devel tcl tcl-devel -y
sudo wget http://download.redis.io/redis-stable.tar.gz
sudo tar xvzf redis-stable.tar.gz
cd redis-stable
sudo make BUILD_TLS=yes
```

### redis-cliでRedisに接続する
```
src/redis-cli -h primary-endpoint -p 6379
```
`primary-endpoint`は作成したRedisのAWSコンソールに表示されたエンドポイントを設定

# 作成したリソースの削除
terraform　の destroyを実行して、AWS上のリソースを削除します。
```
terraform destroy
```

# さいごに
今回はAWSでは昨年サポートされたRedis7で構築しました。
最新バージョンにあわせてコードの書き方が少し変わることに気づけたので、バージョンを上げる時はコードの書き方が変わる場合もあることを考慮しないといけないことに気づけて良かったです。