4

Я пытаюсь обновить Redshift от функции Lambda с помощью python. Для этого я пытаюсь объединить 2 фрагмента кода. Оба фрагмента являются функциональными, когда я запускаю их отдельно.Использование psycopg2 с Lambda для обновления Redshift (Python)

  1. Обновление RedShift из PyDev Затмения

    import psycopg2 
    
    conn_string = "dbname='name' port='0000' user='name' password='pwd' host='url'" 
    conn = psycopg2.connect(conn_string) 
    
    cursor = conn.cursor() 
    
    cursor.execute("UPDATE table SET attribute='new'") 
    conn.commit() 
    cursor.close() 
    
  2. Прием контента Загружено на S3 Bucket (Pre-Built Шаблон Доступно Lambda)

    from __future__ import print_function 
    
    import json 
    import urllib 
    import boto3 
    
    print('Loading function') 
    
    s3 = boto3.client('s3') 
    
    
    def lambda_handler(event, context): 
        #print("Received event: " + json.dumps(event, indent=2)) 
    
        # Get the object from the event and show its content type 
        bucket = event['Records'][0]['s3']['bucket']['name'] 
        key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 
    
        try: 
         response = s3.get_object(Bucket=bucket, Key=key) 
         print("CONTENT TYPE: " + response['ContentType']) 
         return response['ContentType'] 
    
        except Exception as e: 
         print(e) 
         print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
         raise e 
    

Поскольку оба эти сегменты работали, я попытался их объединить, чтобы обновить Redshift при загрузке файла на s3:

from __future__ import print_function 

import json 
import urllib 
import boto3 
import psycopg2 

print('Loading function') 

s3 = boto3.client('s3') 


def lambda_handler(event, context): 
    #print("Received event: " + json.dumps(event, indent=2)) 

    # Get the object from the event and show its content type 
    bucket = event['Records'][0]['s3']['bucket']['name'] 
    key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8') 

    conn_string = "dbname='name' port='0000' user='name' password='pwd' host='url'" 

    conn = psycopg2.connect(conn_string) 

    cursor = conn.cursor() 

    cursor.execute("UPDATE table SET attribute='new'") 
    conn.commit() 
    cursor.close() 

    try: 
     response = s3.get_object(Bucket=bucket, Key=key) 
     print("CONTENT TYPE: " + response['Body'].read()) 
     return response['Body'].read() 
    except Exception as e: 
     print(e) 
     print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) 
     raise e 

Поскольку я использую внешнюю библиотеку, мне нужно создать пакет развертывания. Я создал новую папку (lambda_function1) и переместил мой .py-файл (lambda_function1.py) в эту папку. Я побежал следующую команду для установки psycopg2 в этой папке:

pip install psycopg2 -t \lambda_function1 

я получаю следующий отзыв:

Collecting psycopg2 
    Using cached psycopg2-2.6.1-cp34-none-win_amd64.whl 
Installing collected packages: psycopg2 
Successfully installed psycopg2-2.6.1 

Я тогда Zipped содержимого каталога. И загрузил этот zip в мою функцию лямбда. Когда я загрузить документ в ведро функциональных мониторов, я получаю следующее сообщение об ошибке в моем журнале cloudwatch:

Unable to import module 'lambda_function1': No module named _psycopg 

Когда я смотрю в библиотеке, единственное, что назвали «_psycopg» является «_psycopg.pyd».

В чем причина этой проблемы? Имеет ли значение, что Lambda использует Python 2.7, когда я использую 3.4? Имеет ли значение, что я закрепил содержимое моего файла на компьютере под управлением Windows? Кто-нибудь смог успешно подключиться к Redshift от лямбда?

+1

К сожалению, вы не сможете использовать созданный Windows файл колес на Lambda. Вы можете использовать pg8000, который является Pure Python, с Redshift на лямбда. – bbayles

ответ

10

Для этого вам необходимо построить psycopg2 со статически связанной библиотекой libpq.so. Проверьте это репо https://github.com/jkehler/awslambda-psycopg2. Он уже создал пакет psycopg2 и инструкции по его созданию самостоятельно.

Вернуться на вопросы:

Что является причиной этой проблемы?

psycopg2 необходимо собрать скомпилированные со статически связанными библиотеками для Linux.

Имеет ли значение, что Lambda использует Python 2.7, когда я использую 3.4?

Да, это так, лямбда поддерживает только версию 2.7. Просто создайте виртуальную среду и установите там все необходимые пакеты.

Имеет ли значение, что я закрепил содержимое моего файла на компьютере под управлением Windows?

Пока все библиотеки, которые вы могли бы на молнию побежали на Linux это не

Кто смог успешно подключиться к RedShift с лямбды?

Да.

+0

Большое спасибо! Я загрузил и извлек zip из git-хаба и вложил его в свой пакет развертывания, и он сразу работал (нет необходимости изменять версию Python). Очень благодарен за вашу помощь! – awsQuestion

+0

При попытке обновления, аналогичной первой части вопроса: 'import psycopg2', ' conn_string = "dbname = '............ и т. Д., ' conn = psycopg2 .Подайте (conn_string) ',' курсор = conn.cursor() ',' cursor.execute ("Обновление запросов") ' Это дает ошибку, как:' DatabaseError: ошибка SYSCALL SSL: Операция приуроченная out' – Sarang

+0

@Vor Я скопировал папку psycopg2 из git и пасты lambda zip, все еще получаю ниже ошибки. Не удалось импортировать модуль 'core_handler': нет модуля с именем psycopg2._psycopg – ifti

Смежные вопросы