Почему моя лямбда не может говорить с эластичной болью? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть кластер Redis ElastiCache, который имеет полное доменное имя для основного узла в формате: master.clustername.x.euw1.cache.amazonaws.com. У меня также есть запись Route53 с CNAME, указывающей на это полное доменное имя.

У меня есть лямбда-ядро .net в том же VPC, что и кластер, с доступом к кластеру через группы безопасности. Лямбда связывается с кластером, используя библиотеку Redis, разработанную Stack Overflow ( Github-репо здесь для справки ).

Если я дам лямбда-имени хоста полное доменное имя для кластера Redis (которое начинается с master), я могу подключиться, сохранить данные и прочитать их.

Если я дам лямбде CNAME (и этот CNAME даст тот же IP-адрес, что и полное доменное имя, когда я пингую его с локального компьютера, а также если я использую Dns.GetHostEntry в лямбде), он не будет не удается подключиться, и я получаю следующее сообщение об ошибке:

One or more errors occurred. (It was not possible to connect to the redis server(s); to create a disconnected multiplexer, disable AbortOnConnectFail. SocketFailure on PING): AggregateException
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at lambda_method(Closure , Stream , Stream , LambdaContextInternal )

at StackExchange.Redis.ConnectionMultiplexer.ConnectImpl(Func`1 multiplexerFactory, TextWriter log) in c:\code\StackExchange.Redis\StackExchange.Redis\StackExchange\Redis\ConnectionMultiplexer.cs:line 890
at lambda.Redis.RedisClientBuilder.Build(String redisHost, String redisPort, Int32 redisDbId) in C:\BuildAgent\work\91d24911506461d0\src\Lambda\Redis\RedisClientBuilder.cs:line 9
at lambda.Ioc.ServiceBuilder.GetRedisClient() in C:\BuildAgent\work\91d24911506461d0\src\Lambda\IoC\ServiceBuilder.cs:line 18
at lambda.Ioc.ServiceBuilder.GetServices() in C:\BuildAgent\work\91d24911506461d0\src\Lambda\IoC\ServiceBuilder.cs:line 11
at Handlers.OrderHandler.Run(SNSEvent request, ILambdaContext context) in C:\BuildAgent\work\91d24911506461d0\src\Lambda\Handlers\OrderHandler.cs:line 26

Кто-нибудь видел что-нибудь похожее на это?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Оказалось, что из-за того, что я использовал сертификат SSL в кластере эластичного кэша, а сертификат SSL был привязан к конечной точке master., в то время как я пытался подключиться к CNAME, проверка сертификата не удалась.

Итак, я запросил запись Route53 в коде, чтобы получить конечную точку master, и она заработала.

0 голосов
/ 04 сентября 2018

Возможный обходной путь, чтобы изолировать проблемы от вашей клиентской библиотеки - следуйте инструкциям AWS и перепишите свою лямбду в код, подобный приведенному ниже (пример на Python).

from __future__ import print_function
import time
import uuid
import sys
import socket
import elasticache_auto_discovery
from pymemcache.client.hash import HashClient

#elasticache settings
elasticache_config_endpoint = "your-elasticache-cluster-endpoint:port"
nodes = elasticache_auto_discovery.discover(elasticache_config_endpoint)
nodes = map(lambda x: (x[1], int(x[2])), nodes)
memcache_client = HashClient(nodes)

def handler(event, context):
    """
    This function puts into memcache and get from it.
    Memcache is hosted using elasticache
    """

    #Create a random UUID... this will the sample element we add to the cache.
    uuid_inserted = uuid.uuid4().hex
    #Put the UUID to the cache.
    memcache_client.set('uuid', uuid_inserted)
    #Get item (UUID) from the cache.
    uuid_obtained = memcache_client.get('uuid')
    if uuid_obtained.decode("utf-8") == uuid_inserted:
        # this print should go to the CloudWatch Logs and Lambda console.
        print ("Success: Fetched value %s from memcache" %(uuid_inserted))
    else:
        raise Exception("Value is not the same as we put :(. Expected %s got %s" %(uuid_inserted, uuid_obtained))

    return "Fetched value from memcache: " + uuid_obtained.decode("utf-8")

Ссылка: https://docs.aws.amazon.com/lambda/latest/dg/vpc-ec-deployment-pkg.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...