ElastiCache(Memcached)をPython3.7から操作する。

こんにちは。s.kです。今回はPython 3.6を使ってAmazon ElastiCache(Memcached)への通信を行い、一通りの動作を試したいと思います。 *今回はLambdaからElastiCacheへの通信を行います。

目次

概要

"action"、"cache_key"、"cache_value"三つの引数を渡し、Memcachedを操作するLambdaをPythonで作成します。

標準ライブラリ以外も必要となるため今回はzipアップロードとなります。

また今回使用するバージョンはこの通りです。

  • Python v3.6
  • ElastiCache Memcached v1.5.16
  • elasticache_auto_discovery v1.0.0
  • pymemcache v2.2.2

事前準備

Python用のMemcachedクライアントであるpymemcacheと、ノードをよしなにしてくれる"elasticache_auto_discovery"を下記サイトからダウンロードします。
pymemcache(v2.2.2)
githubhttps://github.com/pinterest/pymemcache
pypihttps://pypi.org/project/pymemcache/

elasticache_auto_discovery(v1.0.0)
githubhttps://github.com/djmitche/elasticache-auto-discovery
次にlambda_function.pyファイルを作成します。

# coding=utf-8

import os
import elasticache_auto_discovery
from pymemcache.client.hash import HashClient

endpoint = os.environ.get['ENDPOINT']

def lambda_handler(event, context):
    
    # ElastiCache settings
    nodes = elasticache_auto_discovery.discover(endpoint)
    nodes = map(lambda x: (x[1], int(x[2])), nodes)
    memcache_client = HashClient(nodes)
    
    if 'set' in event['action']:
        result = memcache_client.set(event['cache_key'], event['cache_value'])
    
    elif 'get' in event['action']:
        result = memcache_client.get(event['cache_key'])
        result = "no exist" if result is None else result.decode()
    
    elif 'delete' in event['action']:
        result = memcache_client.delete(event['cache_key'])
    
    print(result)
    return result

これらを以下の構成で圧縮します。

elasticache.zip
├─elasticache_auto_discovery
| └─__init__.py
├─pymemcache
| ├─client/
| ├─test/
| ├─__init__.py
| ├─exceptions.py
| ├─fallback.py
| ├─pool.py
| └─serde.py
└─lambda_function.py

 

AWS構築

最初にElastiCacheとLambdaで使用するセキュリティグループを作成します。 今回は互いのセキュリティグループをリソースに指定して許可する形にする為、お互いに相手側のセキュリティグループIDを設定する。
・Lambda用セキュリティグループ
インバウンド [設定なし]
アウトバウンド [カスタム TCP ルール:TCP:11211:ElastiCache用セキュリティグループID]
Lambda用セキュリティグループ

Lambda用セキュリティグループ

・ElastiCache用セキュリティグループ
インバウンド [カスタム TCP ルール:TCP:11211:Lambda用セキュリティグループID

アウトバウンド [すべてのトラフィック:すべて:すべて:0.0.0.0/0]

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

ElastiCache用セキュリティグループ
次にElastiCacheを作成します。 クラスターエンジンはMemcachedを選択し、バージョンは最新の1.5.16(19/10/23時点)を選択します。
ノードタイプの容量ノード数が大まかな保存できる容量となる。

クラスターの作成

詳細設定は以下の様に設定する。

詳細設定

設定後に作成を押下する。無事に作成されればElastiCacheは完了です。

最後にLambdaを作成します。 ランタイムは"Python 3.7"を選択して作成します。

Lambdaを作成
コードエントリタイプで".zipファイルをアップロード"を選択し、事前準備で作成したelasticache.zipをアップロードします。 環境変数はキー名を"ENDPOINT"、値をElastiCacheのエンドポイントを設定する。

ElastiCacheのエンドポイントを設定

ネットワークは事前に作成したセキュリティグループを設定する。

セキュリティグループを設定

最後に登録、取得、削除のテストイベントを作成する。
テストイベントを作成
テストイベントを作成

テストイベントを作成

動作確認

setテストイベントを実行する。

setテストイベントを実行

ElastiCacheで項目数が増えたことを確認する。

setテストイベントを実行

getテストイベントを実行する。

getテストイベント

deleteテストイベントを実行する。

deleteテストイベント

ElastiCacheで項目数が減ったことを確認する。

ElastiCache

再度getテストイベントを実行し、取得できないことを確認する。 getテストイベント

 

以上がPython3.7によるElastiCacheの操作となります。

 

 

 

アプリケーション開発バナー