#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 и общедоступные подсети
- 1 для частных подсетей
-
конфигурация 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