信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

2017

31

10月

vpc内でのRedis使用によって、冪等性を担保したくない?

テクログ

キャー!ちょう冪等性担保したいー!

 

Lambdaの冪等性をvpc外で担保する場合、
Dynamoでやっていることが多いですよね。

なぜLambdaの冪等性を担保しないといけないかというと、最低1回は実行されるけど、複数回実行されることもあるからです。

vpc内でなにかをしたい。外との通信は別にいいかー、じゃあvpc内で担保したいな。
ってなるよね。なるなるー。よくあるー。


となると、DynamoはつかえないのでRedisですね。

はい、こうなりますよ。いかにもサンプル、なので利用はご自身の責任で。

redisはpipでいれてね。

import boto3
import redis

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    print('start!')

    #1分に1回走るとして、その重複を検知するキー
    testkey = 'testdesu_2017-10-26_18-00'

    redis_host = "lambda-redis-test.hostwo.irete.ne"
    ttl = 900#10分強あれば十分すぎる

    try:
        redis_client = redis.StrictRedis(host=redis_host, port=6379, db=0)

        #キーの存在を確認。あるならダブルでやられてるのでダーメ
        key_exists = redis_client.exists(testkey)
        #print(key_exists)

        if key_exists == False:
            logger.info('key:' + testkey + ' is not exists.')
            redis_client.set(testkey, 'executed')
            redis_client.expire(testkey, ttl)

            #ここに独自にやりたい処理を入れるよ

        else:
            #キーがあっても別にエラーではないのでwarn程度
            logger.warn('key:' + testkey + ' is already exists.so do nothing.')

        logger.info('success')
    except Exception as e:
        #その他の例外時
        logger.error(e)
        logger.error('Exception')

    print('end!')

こんな感じです。 いやーRedisっていいなあ。

 

この記事を書いた人

マスオさん

tzwy

所 属:
WEBインテグレーション事業部
出身地:
saitama
仕事内容:
いろいろ検証、作成、障害対応とか品質向上とか