Использование psycopg2 с Lambda для обновления Redshift (Python)

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

Обновление Redshift от PyDev для Eclipse

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()

Получение контента, загруженного в S3 Bucket (готовый шаблон доступен на 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 

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

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос