Лямбда в VPC не может подключиться к сервисам AWS - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть лямбда в VPC, потому что ему нужен доступ к базе данных. Теперь эта лямбда также должна будет иметь возможность использовать видеопотоки Firehose Kinesis (https://aws.amazon.com/kinesis/video-streams/). Моя лямбда-версия построена на Python, и это мой код для создания видео-клиента kinesis:

client = boto3.client('kinesisvideo')
def create_stream(stream_name):
    response = client.create_stream(
        DeviceName='BE',
        StreamName=stream_name,
        MediaType='video/h264',
        DataRetentionInHours=1,
        Tags={
            'string': 'Livestream'
        }
    )
    stream_ARN = response['StreamARN']
    print('Printing ARN: ', stream_ARN)
    return stream_ARN

Сейчаскогда я вызываю create_stream ('TEST'), моя лямбда истекает через 90 секунд:

[DEBUG] 2019-11-05T15:02:47.66Z 2e094ebe-8a92-4a10-ab6c-433cf223cb5b retry needed, retryable exception caught: Connect timeout on endpoint URL: "https://kinesisvideo.eu-west-1.amazonaws.com/createStream"
Traceback (most recent call last):
File "/var/runtime/urllib3/connection.py", line 160, in _new_conn
(self._dns_host, self.port), self.timeout, **extra_kw)
File "/var/runtime/urllib3/util/connection.py", line 80, in create_connection
raise err
File "/var/runtime/urllib3/util/connection.py", line 70, in create_connection
sock.connect(sa)
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/var/runtime/botocore/httpsession.py", line 262, in send
chunked=self._chunked(request.headers),
File "/var/runtime/urllib3/connectionpool.py", line 641, in urlopen
_stacktrace=sys.exc_info()[2])
File "/var/runtime/urllib3/util/retry.py", line 344, in increment
raise six.reraise(type(error), error, _stacktrace)
File "/var/runtime/urllib3/packages/six.py", line 686, in reraise
raise value
File "/var/runtime/urllib3/connectionpool.py", line 603, in urlopen
chunked=chunked)
File "/var/runtime/urllib3/connectionpool.py", line 344, in _make_request
self._validate_conn(conn)
File "/var/runtime/urllib3/connectionpool.py", line 843, in _validate_conn
conn.connect()
File "/var/runtime/urllib3/connection.py", line 316, in connect
conn = self._new_conn()
File "/var/runtime/urllib3/connection.py", line 165, in _new_conn
(self.host, self.timeout))
urllib3.exceptions.ConnectTimeoutError: (<botocore.awsrequest.AWSHTTPSConnection object at 0x7fcf62a7e128>, 'Connection to kinesisvideo.eu-west-1.amazonaws.com timed out. (connect timeout=60)')

Из того, что я понимаю, моя лямбда не может подключиться к https://kinesisvideo.eu -west-1.amazonaws.com / createStream потому что он в VPC. Чтобы проверить это, я создал новую временную лямбду вне моего VPC, и она отлично работала, он мог без проблем подключаться к Kinesis Video Stream.

ИсправитьВ этой проблеме я понимаю, что мне нужно создать конечную точку, чтобы моя лямбда в моем VPC могла получить доступ к сервису AWS, такому как Kinesis Video Streaming. Я пошел на консоль конечной точки VPC и создал новую конечную точку. Я выбрал «com.amazonaws». .eu-west-1.kinesis-streams "и убедился, что использовал ту же VPC, подсети и группу безопасности, что и в моей лямбде. После создания конечной точки я попытался вызвать create_streя сноваК сожалению, я получаю тот же результат, тайм-аут при попытке подключения.

Итак, мой вопрос: возможен ли вообще сервис AWS из VPC? Если да, то как?

ОБНОВЛЕНИЕ

В ответ на ответы я попробовал следующее, но все равно получаю ту же ошибку:

MyЛямбда в VPC имеет SG со всеми исходящими разрешениями. Затем я создал новый SG, входящий из SG VPC, и назначил его конечной точке.

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Да, очень возможно вызывать другие сервисы через лямбду, развернутую в vpc.

Как уже упоминалась конечная точка, которую вы уже настроили. В этом случае проблема, похоже, связана с исходящими портами.

Вы настроили исходящий в группе безопасности, подключенной к вашей лямбде?

0 голосов
/ 06 ноября 2019

Я только присмотрелся к вашему коду. Похоже, что вы используете Amazon Kinesis Video , что отличается от Amazon Kinesis Data Streams .

Из того, что я вижу, конечная точка VPC доступна для данныхпотоков, но нет видео.

Вот почему он не может достичь конечной точки kinesisvideo.eu-west-1.amazonaws.com.

Если это так, то вам нужно запустить NAT Gateway в общедоступной подсети и обновите таблицы маршрутов соответственно. Тогда лямбда-функция сможет достичь Kinesis.

0 голосов
/ 06 ноября 2019

Когда лямбда-функция AWS не подключена к VPC, она имеет полный доступ к Интернету.

Когда лямбда-функция AWS подключена кVPC, он не будет иметь прямой доступ к Интернету. Для предоставления такого доступа вам потребуется:

  • A Шлюз NAT в общедоступной подсети с соответствующими таблицами маршрутов, или
  • A Конечная точка VPC в VPC для требуемой услуги

При использовании конечной точки VPC настройте группы безопасности следующим образом:

  • Создайте группа безопасности для лямбда-функции (Lambda-SG)
    • Предоставить разрешение по умолчанию «Все исходящие»
    • Нет необходимости в правиле входящих
  • Создание группы безопасности для конечной точки VPC (Endpoint-SG)
    • Предоставление Входящий доступ с Lambda-SG

То есть Endpoint-SG специально ссылается на Lambda-SG во входящих правилах. Это позволит лямбда-функции получать доступ к конечной точке VPC.

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