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.

  1. 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()
  2. 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?

Leider werden Sie nicht in der Lage, verwenden Sie die Windows-erstellte Rad-Datei auf Lambda. Sie kann in der Lage sein zu verwenden, pg8000, das ist Reines Python, mit der Rotverschiebung auf die Lambda.

InformationsquelleAutor awsQuestion | 2016-04-13

Schreibe einen Kommentar