À 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.
-
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()
-
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?
OriginalL'auteur awsQuestion | 2016-04-13
Vous devez vous connecter pour publier un commentaire.
Dans l'ordre pour que cela fonctionne, vous avez besoin pour construire
psycopg2
avec statiquementlibpq.so
de la bibliothèque. Découvrez ce repo https://github.com/jkehler/awslambda-psycopg2. Il a déjà construit psycopg2 paquet et les instructions comment construire vous-même.Retour à vos questions:
Ce qui est à l'origine de ce problème?
psycopg2
doit être de construire un compilé avec statiquement bibliothèques pour Linux.Importe-t-il que la Lambda utilise Python 2.7 lorsque j'utilise 3.4?
Oui, c'est fait, lambda ne supporte version 2.7. Il suffit de créer environnement virtuel et d'installer tous les paquets nécessaires.
Importe-t-il que j'ai zippé le contenu de mon fichier sur une machine Windows?
Tant que toutes les bibliothèques que vous avez zippée pouvait couru sur Linux, il n'est pas
Quelqu'un a réussi à se connecter à Redshift de lambda?
oui.
Quand je tente une mise à jour, similaire à la partie 1 de la question :
import psycopg2
,conn_string = "dbname='............ etc
,conn = psycopg2.connect(conn_string)
,cursor = conn.cursor()
,cursor.execute("Update Query")
Il donne une erreur :DatabaseError: SSL SYSCALL error: Operation timed out
J'ai copié le psycopg2 dossier du git et pâtes lambda zip encore en train d'erreur ci-dessous. Impossible d'importer le module 'core_handler': No module named psycopg2._psycopg
Mise à jour: Lambda n'a désormais en charge de python 2.7 et python 3.6
Je bifurquais le repo dans la réponse, compilé avec Python 3.7 + PostgreSQL, 10.7, elle est ici: github.com/pzmosquito/awslambda-psycopg2
OriginalL'auteur Vor
Je viens de tomber sur ce même problème. Je suis tombé sur le même projet github qui a été noté dans l'autre réponse qui explique le problème comme suit:
Grâce à AWS Lambda manque de l'PostgreSQL bibliothèques dans l'AMI de l'image, nous avons besoin de compiler psycopg2 avec PostgreSQL libpq.donc, bibliothèque statiquement bibliothèque libpq au lieu de la valeur par défaut de lien dynamique.
Cela a été indiqué dans la réponse précédente, et j'ai commencé à suivre les instructions pour construire moi-même une version de psycopg2 avec statiquement PostgreSQL bibliothèque. J'ai trouvé une option beaucoup plus facile. J'ai remarqué sur le psycopg2 page github suivantes:
Vous pouvez également obtenir un package autonome, ne nécessitant pas un compilateur ou des bibliothèques externes, par l'installation de la psycopg2-paquet binaire de PyPI:
$ pip install psycopg2-binary
Le paquet binaire est un choix pratique pour le développement et de test, mais en production, il est conseillé d'utiliser le paquet construit à partir des sources.
Quand je pip installé le psycopg2-paquet binaire et de l'inclure dans mon requirements.txt fichier que j'ai été capable de se connecter à ma base de données postgresql à partir d'une fonction lambda parfaitement. Je suis à l'aide de calice que je recommande fortement. Je me rends compte que psycopg2 ne recommande pas l'utilisation de la version binaire pour la production, mais je ne vois pas une énorme différence entre l'utilisation de la version binaire ou la compilation et la liaison statique de vous-même. Quelqu'un s'il vous plaît corrigez-moi si je me trompe sur ce point.
OriginalL'auteur jshammon