À l'aide de psycopg2 avec Lambda pour mettre à Jour Redshift (Python)

Je suis tenté de mettre à jour Redshift à partir d'une fonction Lambda à l'aide de python. Pour ce faire, j'essaie de combiner les 2 fragments de code. Les deux fragments sont fonctionnels, quand je lance séparément.

  1. La mise à jour de Décalage vers le rouge de PyDev pour 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. Recevoir le Contenu Téléchargé vers un compartiment S3 (Modèle prédéfini Disponible sur 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

Depuis ces deux segments travaillé, j'ai essayé de les combiner entre eux pour que je puisse mettre à jour Redshift lors de l'upload d'un fichier 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

Depuis que je suis en utilisant un à l'extérieur de la bibliothèque, j'ai besoin de créer un package de déploiement. J'ai créé un nouveau dossier (lambda_function1) et s'est rapproché de moi .py fichier (lambda_function1.py) à ce dossier. J'ai exécuté la commande suivante pour installer psycopg2 dans ce dossier:

pip install psycopg2 -t \lambda_function1

- Je recevoir les commentaires suivants:

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

Je puis zippé le contenu du répertoire. Et téléchargé le fichier compressé à ma fonction lambda. Quand j'ai télécharger un document dans le seau de la fonction moniteurs, je reçois l'erreur suivante dans mon cloudwatch journal:

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

Quand je me regarde dans la bibliothèque, la seule chose nommé "_psycopg" est "_psycopg.pyd".

Ce qui est à l'origine de ce problème? Il n'importe que la Lambda utilise Python 2.7 lorsque j'utilise 3.4? Il importe peu que j'ai zippé le contenu de mon fichier sur une machine Windows? Quelqu'un a réussi à se connecter à Redshift de lambda?

Malheureusement, vous ne serez pas en mesure d'utiliser le Windows créées roue fichier Lambda. Vous être en mesure d'utiliser pg8000, qui est un Pur Python, avec Redshift Lambda.

OriginalL'auteur awsQuestion | 2016-04-13