AWS
Python3
elasticache
lambda

AWS Lambda から ElastiCache に接続する

やりたいこと

  • AWS Lambda から ElastiCache に接続する
  • boto3 は get/set はできないらしいので他の方法を使う

必要な設定

  • AWS Lambda の実行ロールに ElastiCache へのアクセス権限追加
  • AWS Lambda, ElastiCache を同じVPCにあわせる

redis (クラスターモードが無効) の場合

EC2 にて redis-py をダウンロード

$ pip3 install redis -t ./
  • 生成されるディレクトリを開発環境の index.py と同じディレクトリにコピーする

index.py 作成

index.py
import redis

def handler(event, context):

    r = redis.StrictRedis(host='****.****.0001.apne1.cache.amazonaws.com', port="6379", db=0)

    r.set("key1", "value1")
    print(r.get("key1"))

    return "OK"

または

index.py
import redis

def handler(event, context):

    pool = redis.ConnectionPool(host='****.****.0001.apne1.cache.amazonaws.com', port=6379, db=0)
    r = redis.StrictRedis(connection_pool=pool)

    r.set("key1", "value1")
    print(r.get("key1"))

    return "OK"

以上。

redis (クラスターモードが有効) の場合

EC2 にて redis-py-cluster をダウンロード

$ pip3 install redis-py-cluster -t ./
  • redis-py も依存してるので一緒にダウンロードされる
  • 生成されるディレクトリを開発環境の index.py と同じディレクトリにコピーする

index.py 作成

index.py
from rediscluster import StrictRedisCluster

def handler(event, context):

    startup_nodes = [{"host": "****.****.clustercfg.apne1.cache.amazonaws.com", "port": "6379"}]
    rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True, skip_full_coverage_check=True)

    rc.set("key1", "value")
    print(rc.get("key1"))

    return "OK"

  • クラスターモードが無効の redis には繋がらないのでテスト環境などでは上記実装を切り替える

以上。