こんにちは、ゲームソリューショングループの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にセッション情報を作成/登録してみたことを記事にしました。
どなたかの参考になると幸いです。