Подключение Lambda к Elasticache с помощью бессерверной платформы

#amazon-web-services #redis #aws-lambda #serverless-framework

#amazon-веб-сервисы #redis #aws-lambda #бессерверная платформа

Вопрос:

Я пытаюсь получить доступ к кластеру AWS Elasticache из лямбда-функции, используя бессерверную платформу (версия 0.5.6), не теряя доступа к Dynamodb. Я безуспешно пытался использовать эту суть. Внутри функции Lambda первое, что я делаю, это подключаюсь к экземпляру Redis, но я продолжаю получать тайм-ауты, я дважды проверил выходные переменные CloudFormation и их видимость внутри функции и роли / политики Lambda для VPC, но все равно ничего… Я не нашел ни одного руководства о том, как создавать виртуальные частные серверы и группы безопасности с помощью CloudFormation и Serverless для создания общедоступных и частных подсетей, NAT и интернет-шлюзов, как предлагается здесь . Кто-нибудь может помочь?

Ответ №1:

Вам нужно будет поместить функцию Lambda внутри VPC, в котором находится кластер ElastiCache. Конечно, как только вы это сделаете, функция Lambda получит доступ только к ресурсам, которые существуют внутри VPC, поэтому у нее больше не будет доступа к DynamoDB. Решение этой проблемы заключается в добавлении шлюза NAT к VPC, который позволит функции Lambda получать доступ к ресурсам за пределами VPC.

Я бы подумал, что настройка шлюза VPC и NAT выйдет за рамки бессерверной среды, но я не эксперт в этой среде. Я бы посоветовал изучить возможность настройки этого вручную через консоль AWS или сделать это с помощью чего-то вроде CloudFormation, а затем просто указать в конфигурации вашей бессерверной платформы VPC, который ей необходимо использовать.

Комментарии:

1. Спасибо за ответ, я уже знаю, как делать что-то вручную, но я нашел эту суть для бессерверной платформы, и это показалось мне полезным, я хочу, чтобы это работало с бессерверной платформой и формированием облака.

Ответ №2:

Хотя это не задокументировано должным образом, вы можете настроить VPC непосредственно в файле конфигурации без сервера (см. Ссылку)

Версия 0.5

 # s-function.json

{
 "name": "hello",
 "runtime": "nodejs4.3",
 "handler": "handler.hello”,
 "endpoints": [],
 "events": [],
 "vpc": {
    "securityGroupIds": ["sg-123456"],
    "subnetIds": [
      "subnet-abc1",
      "subnet-abc2",
      "subnet-abc3",
    ]
  }
}
  

Версия 1.0

 # serverless.yaml

service: aws-hello
provider: aws
  runtime: nodejs4.3
  vpc:
    securityGroupIds:
      — "sg-123456"
    subnetIds:
      — "subnet-abc1"
      — "subnet-abc1"
      — "subnet-abc1"
functions:
   foo:                           # inherits the VPC config
     handler: src/handler.foo
   bar:                           # overwrites the VPC config
     handler: src/handler.bar
     vpc:
       securityGroupIds:
         — "sg-999999"
       subnetIds:
         — "subnet-zzz9"
  

Ответ №3:

Добавление краткого описания того, как я это настроил:

  • создайте новый VPC

  • создайте 3 частные подсети и 2 общедоступные подсети

    • для резервирования создается несколько подсетей
  • создайте группу безопасности

    • с входящим трафиком для
      • порт эластичного кэша
    • с исходящим трафиком для
      • все порты для доступа в Интернет
  • создайте новый IGW

    • присоедините этот IGW с помощью VPC
  • создайте новый NAT

    • выберите общедоступный лямбда-код
    • общедоступный тип подключения
  • нам нужны 2 таблицы маршрутов

    • 1 для частных подсетей
      • это будет иметь NAT и частные подсети
    • другой для общедоступной подсети с доступом в Интернет
      • это будет иметь IGW и общедоступные подсети
  • конфигурация lambda

    • прикрепите политики IAM к функциям lambda: AWSLambdaVPCAccessExecutionRole
    • присоедините частные подсети к lambda
    • выберите группу безопасности для lambda

ссылки:

https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/

https://docs.aws.amazon.com/lambda/latest/dg/services-elasticache-tutorial.html