EC2(Go)からElastiCache for Redisにセッション情報を作成/登録してみた

2023.04.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、ゲームソリューショングループのsoraです。
今回は、EC2(Go)からElastiCache for Redisにセッション情報を作成/登録してみたことを書いていきます。

構成図を書くほどでもないですが以下です。

AWSサービスの作成(Terraform)

セッション情報を作成して登録するEC2サーバ・それに紐づくNW関連は既存のものを使用します。(以下のブログで作成したものです。)
EC2はGoの実行環境も準備できているものとします。

ElastiCache for Redis周りをTerraformを使って作成します。
クラスタモードは無効化、認証はなしとします。

main.tf

terraform {
    #AWSプロバイダーのバージョン指定
    required_providers {
        aws = {
            source  = "hashicorp/aws"
            version = "~> 4.51.0"
        }
    }
}
# AWSプロバイダーの定義
provider aws {
    region = "ap-northeast-1"
}

# 既存のVPC
variable vpc_id {
    type = string
    # 使用するVPCのID
    default = "<VPC ID>"
}

# サブネットの作成
resource aws_subnet redis_subnet {
    vpc_id = var.vpc_id
    # Redisを配置するプライベートサブネットのCIDRブロック
    cidr_block = "<Redis Private Subnet CIDR block>"
}
# セキュリティグループの作成
resource aws_security_group redis_sg {
    name_prefix = "redis-sg"
    ingress {
        from_port   = 6379
        to_port     = 6379
        protocol    = "tcp"
        # EC2を配置しているパブリックサブネットのCIDRブロック
        cidr_blocks = ["<EC2 CIDR block>"]
    }
}

# Redisの作成
resource aws_elasticache_subnet_group redis_subnet_group {
    name       = "redis-subnet-group"
    subnet_ids = [aws_subnet.redis_subnet.id]
}
resource aws_elasticache_cluster redis_cluster {
    cluster_id           = "redis-cluster"
    engine               = "redis"
    engine_version       = "7.0"
    node_type            = "cache.t4g.micro"
    num_cache_nodes      = 1
    subnet_group_name    = aws_elasticache_subnet_group.redis_subnet_group.name
    security_group_ids   = [aws_security_group.redis_sg.id]
}


作成したTerraformのコードを実行して構築します。

$ terraform init
$ terraform apply

ElastiCache for Redisが作成できています。
画像2枚目にあるエンドポイントは、接続時に使用します。

セッション情報の作成・登録

redis-cliのインストール

セッション情報を確認する際にEC2からElastiCache for Redisを操作するため、EC2にredis-cliをインストールします。
こちらのブログを参考に実行します。

# パッケージインストール
$ sudo yum -y install openssl-devel gcc
# redisのソースコード取得・解凍
$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
# コンパイル
$ cd redis-stable
$ make redis-cli BUILD_TLS=yes
# パスを通す
$ sudo install -m 755 src/redis-cli /usr/local/bin/

セッション情報の確認(空であること)

redis-cliでElastiCache for Redisに登録されているセッション情報を確認します。
「redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com」の部分は、作成したElastiCache for Redisのエンドポイントを入れてください。

$ redis-cli -h redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com
redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com:6379> keys *
(empty array)

セッション情報をまだ登録していないため、空になっています。

セッション情報の作成/登録(Go)

EC2でセッション情報を作成して、ElastiCache for Redisに登録します。
セッションIDは、英数字16桁でランダムな値を生成しています。

redis-session.go

package main

import (
	"context"
	"fmt"
	"math/rand"
	"time"
	"github.com/go-redis/redis/v8"
)

var redisClient *redis.Client

func main() {
	// Redisクライアントの初期化
	redisClient = redis.NewClient(&redis.Options{
		// Redisサーバーのエンドポイント
		Addr:"<Redis Endpoint>",
		// Redisサーバーのパスワード(今回は認証なし)
		Password:"",
		// Redisデータベースの選択
		DB:0,
	})

	// セッション情報の作成
	sessionID := generateSessionID()
	sessionData := "sample data"

	// Redisにセッション情報を保存する
	if err := redisClient.Set(context.Background(), sessionID, sessionData, 0).Err(); err != nil {
		panic(err)
	}

	fmt.Printf("Session created successfully: %s\n", sessionID)
}

// セッションIDをランダムに生成する関数
func generateSessionID() string {
	rand.Seed(time.Now().UnixNano())
	const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
	const length = 16
	b := make([]byte, length)
	for i := range b {
		b[i] = charset[rand.Intn(len(charset))]
	}
	return string(b)
}

作成したGoのコードをビルドして実行します。

$ go mod init redis-session.go
$ GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o redis-session
$ ./redis-session
Session created successfully: l5jwwktknF7mgQFt

正常に作成/登録できたみたいなので、ElastiCache for Redis側で確認します。

セッション情報の確認(登録されたセッション情報が存在すること)

redis-cliでElastiCache for Redisに登録されているセッション情報を確認します。

$ redis-cli -h redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com
redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com:6379> keys *
1) "l5jwwktknF7mgQFt"

先ほどは空でしたが、登録したセッションIDが確認できました。
最後に削除もしてみます。

redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com:6379> del l5jwwktknF7mgQFt
(integer) 1
redis-cluster.xxxxxx.xxxx.apne1.cache.amazonaws.com:6379> keys *
(empty array)

登録したセッションIDが削除されて、空になっていることが確認できました。

最後に

今回は、EC2(Go)からElastiCache for Redisにセッション情報を作成/登録してみたことを記事にしました。
どなたかの参考になると幸いです。