AWS Lambda and Redis

12,601

You need to have Redis in same VPC as Lambda. Check your security group settings. And then if you have EC2 access, install redis-cli and try to connect Redis. If this get connected your Lambda Redis will also get connected. As said earlier, you need to have your lambda in same VPC. The following is boilerplate code demonstrating connecting to Lambda:

console.log('before client initialization')
const redisOptions = {
  host: 'xxxx.xxx.xxx.xxx.xxx.amazonaws.com',
  port: 6379,
}

var client =  redis.createClient(redisOptions);
console.log('after client initialization');

client.on('connect', function(result) {
  console.log('connected');
}
Share:
12,601
kharandziuk
Author by

kharandziuk

Updated on July 29, 2022

Comments

  • kharandziuk
    kharandziuk over 1 year

    I'm trying to write an AWS Lambda function which uses redis(on amazon elasticcache). The problem – I can't connect to redis. I use code like this

    'use strict'
    
    function handler (data, context, cb) {
      const redis = require("redis")
      console.log('before client initialization')
      const client = redis.createClient({
        url: 'redis://propper-url-cache.some.0001.euw1.cache.amazonaws.com:6379',
        retry_strategy: function(options) {
          console.log(options)
          if (options.total_retry_time > 1000) {
            throw new Error('can`t connect to redis')
          }
        }
      })
      console.log('after client initialization')
    
      client.on("error", function (err) {
        console.log('in error')
        cb({error: err})
      });
    
      client.get("counter", function (err, counter) {
        console.log('counter', counter)
        if(_.isNull(counter)) {
          counter = 0
        }
        client.set('counter', counter + 1, function(err) {
          console.log(err)
          cb(null, {counter: counter})
        })
      });
    }
    
    exports.handler = handler
    

    as a result I see something like this in logs:

    
    15:33:41
    START RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6 Version: $LATEST
    
    15:33:42
    2016-09-20T13:33:42.632Z    d8024ec2-7f36-11e6-996c-1bfcb60572c6    before client initialization
    
    15:33:42
    2016-09-20T13:33:42.813Z    d8024ec2-7f36-11e6-996c-1bfcb60572c6    after client initialization
    
    15:33:44
    END RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6
    
    15:33:44
    REPORT RequestId: d8024ec2-7f36-11e6-996c-1bfcb60572c6  Duration: 3002.67 ms    Billed Duration: 3000 ms Memory Size: 128 MB    Max Memory Used: 19 MB
    
    15:33:44
    2016-09-20T13:33:44.620Z d8024ec2-7f36-11e6-996c-1bfcb60572c6 Task timed out after 3.00 seconds
    

    when I change redis url for something which definitely makes no sense I have an additional row:

    2016-09-20T13:29:42.953Z    48fcb071-7f36-11e6-bc52-c5ac58c12843    { attempt: 1, error: { [Error: Redis connection to some-url.euw1.cache.amazonaws.com:6379 failed - getaddrinfo ENOTFOUND some-url.euw1.cache.amazonaws.com some-url.euw1.cache.amazonaws.com:6379] code: 'ENOTFOUND', errno: 'ENOTFOUND', syscall: 'getaddrinfo', hostna
    

    Any ideas?

  • Anup Tilak
    Anup Tilak almost 7 years
    client.quit() is very important after executing any redis command. If you don't call quit(), your lambda will timeout the execution.