ElastiCache for MemcachedをLaravelに設定してみた!

2020.11.26

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

こんにちは、コンサル部@大阪オフィスのTodaです。

ここ最近AWS資格を勉強するために色々なAWSサービスを試しています。
今回はAmazon ElastiCache Memcachedを作成してLaravelのセッション保存先に利用してみたいと思います。

構成イメージ

プライベートサブネットに新規ElastiCache(Memcached)を作成してEC2インスタンス内のLaravelで利用できる状態にします。

構成イメージ

やりたいこと

  • ElastiCache( Memcached )の新規作成をする。
  • Laravelのセッション保存先として利用する。

前提条件

  • EC2インスタンスにはLaravel バージョン6が動作可能の状態から始めます。
  • VPCの構成はVPC,サブネットが準備されている状態から始めます。

実際やってみる

ElastiCache用のセキュリティグループ作成

ElastiCacheへのアクセス制限するためセキュリティグループを作成します。
Memcachedを使うためTCP 11211を許可するように設定します。
接続可能な範囲はEC2(Laravel)が関連付けされているセキュリティグループを指定します。

セキュリティグループ作成

セキュリティグループ作成-設定

パラメータグループの設定作成

ElastiCacheに設定する内容をまとめたパラメータグループを作成します。
初めからデフォルト設定が用意されていますが、独自の設定を試す場合は新規作成いたします。
今回は Memcached1.6 を指定します。

パラメータグループの作成

パラメータグループの作成

サブネットグループの作成

ElastiCacheは指定されたサブネット内に構築されるようになっています。
サブネットグループは複数のサブネットを事前に指定します。
今回はプライベートサブネット2点を設定します。

サブネットグループの作成

サブネットグループの設定

ElastiCacheの作成

ElastiCacheの画面から作成をクリックします。

ElastiCacheの作成

ElastiCacheにはクラスターエンジンとして Memcached と Redis が選択できます。
今回は Memcached を指定します。

ElastiCacheの設定1

Memcachedの設定ではエンジンバージョンを1.6.6を指定します。
パラメータは作成した設定を利用し、ノードのタイプはcache.t2.microを選択します。

ElastiCacheの設定2

Memcachedの詳細設定にはサブネットグループとセキュリティグループがございます。
事前に作成した設定を選択します。

ElastiCacheの設定3

設定が終わりましたら作成をクリックする事でElastiCacheが作成されます。
ステータスがavailableになると利用が可能になります。
Laravelで利用する場合、設定エンドポイントの内容が必要になりますのでメモをします。

ElastiCacheの内容

以降の作業はLaravelが導入されているインスタンス内の作業になります。

PHPモジュールの追加

Laravelには標準でMemcachedに関する設定項目が準備されています。
私の環境の場合、モジュール不足のエラーが表示されたため対象のPHP拡張モジュールを追加導入いたします。

sudo yum install php-pecl-memcached

Laravelの変更内容を確認

Laravelのconfig/cache.phpの内容を確認したところ下記環境変数を変更することで対応できることがわかりました。
CACHE_DRIVER:memcachedに変更
MEMCACHED_HOST:ElastiCacheの設定エンドポイントを指定

return [

    /*
    |--------------------------------------------------------------------------
    | Default Cache Store
    |--------------------------------------------------------------------------
    |
    | This option controls the default cache connection that gets used while
    | using this caching library. This connection is used when another is
    | not explicitly specified when executing a given caching function.
    |
    | Supported: "apc", "array", "database", "file",
    |            "memcached", "redis", "dynamodb"
    |
    */

    'default' => env('CACHE_DRIVER', 'file'),

    'stores' => [
        'file' => [
            'driver' => 'file',
            'path' => storage_path('framework/cache/data'),
        ],

        'memcached' => [
            'driver' => 'memcached',
            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
            'sasl' => [
                env('MEMCACHED_USERNAME'),
                env('MEMCACHED_PASSWORD'),
            ],
            'options' => [
                // Memcached::OPT_CONNECT_TIMEOUT => 2000,
            ],
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 100,
                ],
            ],
        ],

Laravelの設定変更

Laravelディレクトリ直下にある.envファイル開き、環境変数を変更します。

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:XXXXXXXXXXXXXXXXXXX
APP_DEBUG=true
APP_URL=http://localhost

# 下記変更 
SESSION_DRIVER=memcached 
MEMCACHED_HOST=XXXXXXXXXXXXXXXXXXXX.cache.amazonaws.com
MEMCACHED_PORT=11211

変更後の確認

Laravelには簡易にログインフォームを作成する機能がございます。
アカウントを作成してログインをおこない、セッションに保存する処理でElastiCacheが利用されていることを確認します。

セッションの保存内容を確認

ElastiCache Memcachedは内容を簡易に確認する機能がございません。
telnetやmemcached-toolを利用して内容を確認いたします。
memcached-toolはmemcachedをyumでインストールすると付属するツールになります。
memcached-toolのdump機能を利用して内容を出力してみます。

memcached-tool XXXXXXXXXXXXXXXXXXXX.cache.amazonaws.com:11211 dump
Dumping memcache contents
  Number of buckets: 1
  Number of items  : 1
Dumping bucket 1 - 1 total items
add laravel_cache:XXXXXXXXXXXXXXXXXXX 0 1606318847 246
a:4:{s:6:"_token";s:40:"XXXXXXXXXXXXXXXXXXX";s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}s:9:"_previous";a:1:{s:3:"url";s:26:"http://XX.XX.XX.XX/home";}s:50:"login_web_xxxxxxxxxxxxx";i:1;}

セッションが保存されている事を確認いたしました。

さいごに

ElastiCache MemcachedをLaravelで利用してみました。
ElastiCache Memcachedにセッションを保存する事で「ステートレス化」に少し近づいた状態になります。
最終は複数インスタンス構成で信頼性の高い構成ができればと考えております。