Mit psycopg2 mit Lambda-Update Rotverschiebung (Python)
Ich bin versucht, zu aktualisieren Rotverschiebung aus einer Lambda-Funktion mit python. Um dies zu tun, ich bin versucht zu kombinieren-2-code-Fragmente. Beide Fragmente sind funktionsfähig sein, wenn ich Sie laufen getrennt.
-
Aktualisierung Rotverschiebung von PyDev für 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()
-
Empfangen von Inhalten Hochgeladen S3-Bucket (Pre-Built-Vorlage auf 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
Da diese beiden Segmente arbeitete, versuchte ich, Sie zu kombinieren, so dass ich aktualisieren könnte die Rotverschiebung auf das hochladen einer Datei zu 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
Da ich die Verwendung einer externen Bibliothek, die ich brauche, um ein Bereitstellungspaket erstellen. Ich erstellte einen neuen Ordner (lambda_function1) und bewegte mein .py Datei (lambda_function1.py) in diesen Ordner. Ich lief den folgenden Befehl zum installieren psycopg2 in diesem Ordner:
pip install psycopg2 -t \lambda_function1
Erhalte ich die folgende Rückmeldung:
Collecting psycopg2
Using cached psycopg2-2.6.1-cp34-none-win_amd64.whl
Installing collected packages: psycopg2
Successfully installed psycopg2-2.6.1
Ich dann gezippt den Inhalt des Verzeichnisses. Und hochgeladen, die zip auf meine lambda-Funktion. Wenn ich ein Dokument hochladen, um die Eimer, die Funktion überwacht, erhalte ich die folgende Fehlermeldung in meinem cloudwatch-log:
Unable to import module 'lambda_function1': No module named _psycopg
Wenn ich mir in der Bibliothek, das einzige, was den Namen "_psycopg" ist "_psycopg.pyd".
Was dieses problem verursacht? Spielt es eine Rolle, dass die Lambda verwendet Python 2.7 und wenn ich mit 3.4? Spielt es eine Rolle, dass ich den Reißverschluss am Inhalt meiner Datei auf einem Windows-Rechner? Hat jemand in der Lage, erfolgreich eine Verbindung zu einer Rotverschiebung von lambda?
InformationsquelleAutor awsQuestion | 2016-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Damit diese Arbeit, die Sie brauchen, um zu bauen
psycopg2
mit statisch gelinktenlibpq.so
Bibliothek. Überprüfen Sie heraus dieses repo https://github.com/jkehler/awslambda-psycopg2. Es hat schon bauen psycopg2 Paket und Anweisungen, wie Sie es selbst bauen.Zurück zu deinen Fragen:
, Was dieses problem verursacht?
psycopg2
werden muss, bauen eine zusammengestellt mit statisch gelinkten Bibliotheken für Linux.Spielt es eine Rolle, dass die Lambda verwendet Python 2.7 und wenn ich mit 3.4?
Ja, es funktioniert, lambda, unterstützt nur die 2.7-version. Erstellen Sie einfach virtuelle Umgebung und installieren der erforderlichen Pakete dort.
Spielt es eine Rolle, dass ich den Reißverschluss am Inhalt meiner Datei auf einem Windows-Rechner?
Solange alle Bibliotheken, die Sie Zip könnte, lief unter Linux nicht
Hat jemand in der Lage, erfolgreich eine Verbindung zu einer Rotverschiebung von lambda?
ja.
Wenn ich versuche ein update, ähnlich zu Teil 1 der Frage :
import psycopg2
,conn_string = "dbname='............ etc
,conn = psycopg2.connect(conn_string)
,cursor = conn.cursor()
,cursor.execute("Update Query")
Es gibt einen Fehler, wie :DatabaseError: SSL SYSCALL error: Operation timed out
Ich kopierte die psycopg2 Ordner aus dem git und Pasten lambda zip-immer noch folgende Fehlermeldung. Nicht in der Lage zu importieren Modul 'core_handler': No module named psycopg2._psycopg
Update: Lambda-unterstützt jetzt entweder python 2.7 oder python-3.6
Ich gabelte die repo in der Antwort, kompiliert mit Python 3.7 + PostgreSQL 10.7, hier ist es: github.com/pzmosquito/awslambda-psycopg2
InformationsquelleAutor Vor
Ich kam gerade über diesem problem. Ich stolperte über die gleiche github-Projekt das war schon in der anderen Antwort, das erklärt das problem wie folgt:
Durch AWS Lambda fehlen die erforderlichen PostgreSQL-Bibliotheken in der AMI-Variante, die wir brauchten, um zu kompilieren psycopg2 mit der PostgreSQL libpq.also-Bibliothek statisch gelinkt libpq-Bibliothek anstelle des Standard dynamic link.
Dies wurde bereits in der vorherigen Antwort, und ich begann, Folgen Sie den Anweisungen zum bauen selbst eine version von psycopg2 mit einem statisch gelinkten PostgreSQL-Bibliothek. Ich fand eine viel einfachere option, aber. Ich bemerkte, auf dem psycopg2 github-Seite die folgenden:
Erhalten Sie auch eine stand-alone-Paket, nicht erfordern einen compiler oder externe Bibliotheken, durch die Installation der psycopg2-binary-Paket von PyPI:
$ pip install psycopg2-binary
Die Binär-Paket ist eine praktische Wahl für die Entwicklung und Tests, aber in der Produktion ist es beachten Sie, dass das Paket aus den Quellen.
Wenn ich pip installiert psycopg2-binary-Paket enthalten und es in meinem requirements.txt die Datei konnte ich eine Verbindung zu meiner postgresql-Datenbank aus einer lambda-Funktion einwandfrei. Ich bin mit Kelch die ich sehr empfehlen kann. Ich merke, dass psycopg2 empfiehlt nicht mit der binary-version für die Produktion, aber ich sehe einen riesigen Unterschied zwischen der Verwendung der binären version kompilieren und statisch gelinkt es selbst. Jemand bitte korrigieren Sie mich wenn ich bin falsch.
InformationsquelleAutor jshammon