Я пытаюсь обновить Redshift от функции Lambda с помощью python. Для этого я пытаюсь объединить 2 фрагмента кода. Оба фрагмента являются функциональными, когда я запускаю их отдельно.Использование psycopg2 с Lambda для обновления Redshift (Python)
Обновление 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()
Прием контента Загружено на 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 от лямбда?
К сожалению, вы не сможете использовать созданный Windows файл колес на Lambda. Вы можете использовать pg8000, который является Pure Python, с Redshift на лямбда. – bbayles