Lambda использует python 3.6 и boto3 в тайм-аутах VPC при подключении к Redshift - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь использовать boto3 в python3.6 для подключения к моему кластеру Redshift с помощью API get_cluster_credentials.В следующем коде истекает 100% времени, когда лямбда-функция добавляется в VPC.Он запускается без проблем, когда Lambda не добавляется в VPC.

Я не могу понять, использует ли get_cluster_credentials публичный или частный IP для доступа к Redshift.Я также не могу понять, есть ли способ заставить его использовать один или другой.

import json
import boto3

def lambda_handler(event, context):
    redshiftClient = boto3.client('redshift', region_name='us-east-1')
    cluster_creds = redshiftClient.get_cluster_credentials( DbUser='awsuser',
                                                            DbName='dev',
                                                            ClusterIdentifier='redshift-cluster-1',
                                                            AutoCreate=False)
    print(cluster_creds)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

Моя конфигурация очень проста.NACL пропускает все (0.0.0.0/0) через все порты и протоколы.Мой SG делает то же самое.

У меня определен 1 интернет-шлюз: igw-0d1e6dcbfdea792b2

У меня есть 1 подсеть и 1 таблица маршрутизации в VPC.В таблице маршрутизации есть одно правило для отображения 0.0.0.0/0 -> igw-0d1e6dcbfdea792b2.

Я могу подключиться извне AWS к кластеру, используя SQL Workbench / J без проблем.

Я просмотрел много сообщений, тем и документов, но не могу понять, что происходит:

Время ожидания AWS Lambda при подключении к RedShift

Подключение LambdaRedshift в разных зонах доступности

https://github.com/awslabs/aws-lambda-redshift-loader/issues/86

Доступ к Redshift из Lambda - предотвращение группы безопасности 0.0.0.0/0

https://aws.amazon.com/blogs/big-data/a-zero-administration-amazon-redshift-database-loader/

Подключение AWS Lambda к Redshift - Время ожидания через 60 секунд

Пожалуйста, помогите.

Большое спасибо.

1 Ответ

0 голосов
/ 07 февраля 2019

Что касается вашего другого вопроса , когда лямбда-функция AWS добавляется к VPC, она не получает общедоступный IP-адрес.Поэтому, если функция желает получить доступ к Интернету (в данном случае совершить вызов get_cluster_credentials()), вам следует:

  • Добавить NAT Gateway в общедоступной подсети
  • Присоединение функции Lambda к Частной подсети
  • Настройка маршрутизации в частной подсети для использования шлюза NAT для 0.0.0.0/0

Itне будет работать, если у вас есть только одна подсеть, так как функция Lambda не сможет получить доступ к шлюзу NAT.

Мне также удалось вручную назначить Elastic IP-адрес для Lambda.ENI функции (вместо использования шлюза NAT), но он не будет масштабироваться, поскольку Lambda может развертывать дополнительные контейнеры и, следовательно, дополнительные ENI.Этого может быть достаточно, если функция выполняется редко и никогда одновременно.

...