2016-03-03 25 views
24

AWS Lambda Python(初心者はPython btw)で起動していますが、MySQLの依存関係を含むいくつかの問題があります。私は私のMacの指示hereに従おうとしています。ステップ数3の場合PythonでAWS LambdaでMySQLを使用する際の問題

、私は私のプロジェクトのルートでコマンドを実行するといくつかの問題を取得しています

sudo pip install MySQL-python -t/

エラー:私は、次のラムダ関数(作品を書き終わる

Exception: Traceback (most recent call last): File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/basecommand.py", line 122, in main status = self.run(options, args) File "/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg/pip/commands/install.py", line 311, in run os.path.join(options.target_dir, item) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 292, in move raise Error, "Destination path '%s' already exists" % real_dst Error: Destination path '/MySQL_python-1.2.5-py2.7.egg-info/MySQL_python-1.2.5-py2.7.egg-info' already exists

私のMacでうまくいく):

import MySQLdb 

def lambda_handler(event, context): 
    # Open database connection 
    db = MySQLdb.connect(...) 

    # prepare a cursor object using cursor() method 
    cursor = db.cursor() 

    sql = "SELECT * FROM Users" 

    try: 
     # Execute the SQL command 
     cursor.execute(sql) 
     # Fetch all the rows in a list of lists. 
     results = cursor.fetchall() 
     for row in results: 
     fname = row[0] 
     lname = row[1] 
     age = row[2] 
     sex = row[3] 
     income = row[4] 
     # Now print fetched result 
     print ("lname=%s" %(lname)) 
    except: 
     print "Error: unable to fecth data" 

    # disconnect from server 
    db.close() 

私が行ったことは/Library/Python/2.7/site-pに行くことですsudo pipを使ってMySQL-pythonをインストールしたときにダウンロードされたMySQLdbフォルダ/ファイル(私はここで何か間違っていると確信しています)、そして私のラムダプロジェクトにコピーして圧縮しますコンテンツをlambda_function.pyとともにAWS Lambdaにアップロードします。

それから私は得る:任意のヘルプや提案のための

Unable to import module 'lambda_function': No module named MySQLdb

グレイト!

EDIT

はsudoのピップは、MySQL-pythonの-t/pathToProject仕事をインストールします(コメントで助けに感謝)を行うことができましたが、ラムダ関数をruningてたときに、今、私はこれを取得:

Unable to import module 'lambda_function': /var/task/_mysql.so: invalid ELF header

私はLinuxのボックスで作業するなら、それはうまくいくはずです(人によって示唆されるように)が、OS Xのボックスから動作させることができるかどうかは疑問です。

+0

'python -c" import sys; print(sys.path) "'の出力は何ですか?なぜあなたはシステムPythonを使用していますか? homebrewやmacportsで '/ usr/local'のパスにインストールしていないのですか?もしそうでなければ、あなたはすべきです。 pipは自分の所有者であり、システム所有のファイルを変更しないので、 'sudo'をpipのために使う必要はありません。また、あなたのシステムが依存するpythonから完全に分離されます。それはリポジトリからのものなので、新しいバージョンにもなります。 –

+0

持っていない場合は、http:// brew.shの 'curl'命令でhomebrewをインストールし、' brew install python' 'pip install mysqldb'を実行してください。 'which python'を実行してあなたのPythonが/ usr/local/binにあることを確認します。 - homebrewはあなたの$ PATH変数を設定して正しいPythonを見つけるために'/usr/local/'を調べます。 –

+0

コメントをいただきありがとうございます。ホームブリュを使用してインストールします。あなたは更新され続けるでしょうか(私はPython初心者ですので、私は助けてくれてありがとう) –

答えて

-1

あなたの問題は主に開発パッケージが不足していると考えられます。私は、あなたが以下のものが必要になると思う:

にsudoのyum -y問題は私のUbuntuのインストーラにも同様に起こるのmysql-develのに

+0

相当のOS X? –

+0

http://stackoverflow.com/a/35886213/3479860 –

+0

申し訳ありません。私のMacではこのことは一度もありませんでしたが、私のMacにMySQLdb pipモジュールを正常にインストールしました。既にMacにmysqlがインストールされていますか?そうでなければ、http://dev.mysql.com/downloads/mysql/5.1.html#macosx-dmg – rahimbah

-3

をインストールすることは、MySQLクライアントコネクタドライバ上で保留されているので、本当の問題です。だから、解決策はMySQL-pythonを幸せにする(クライアントライブラリを利用するために)MySQL-client-devパッケージをインストールすることです。 MAC

# try this first 
fink install mysql-unified-dev 

# or this if above fail. 
brew install mysql 
# you must add this to your user profile startup if you use brew 
export PATH=$PATH:/usr/local/mysql/bin 

については

# Ubuntu only(or setup vm for ubuntu inside your mac) 
# Three dependencies for MySQL python recompilation 
sudo apt-get install python-dev libssl-dev 

#Now the mysql client-dev 
sudo apt-get install libmysqlclient-dev 

# If you like mariadb client 
sudo apt-get install libmariadbclient-dev 

あなたはここに同様の答えを得ることができます:PIPをインストールしようと次にMac OS X - EnvironmentError: mysql_config not found

を。

"sudo pip"を使用する人はお勧めできません。あなたは、あなたのpython開発のためにVirtualenvとvirtualwrapperをセットアップして、sudoなしでpipすることができます。また、新しい展開を分離してテストする方が簡単です。 (ただし、mysqlclient-devライブラリの問題は修正されていません)

0

Amazon Linuxインスタンスを使用してPythonパッケージをビルドし、それらをラムダ展開パッケージに含める必要があります。方法についてはthis excellent articleをご覧ください。この記事で言及されているパッケージは必要なパッケージとは異なりますが、同様に、私のlambdas用にpsycopg2とpymssqlを構築するのに役立ちました。

+0

面白い!私は休暇から戻ってすぐにそれを試してみるでしょう。ありがとうございます –

6

ラムダのようなユースケースでは、PyMySQLのような純粋なPythonの実装を使用すると、もっと幸せになるでしょう。

これは、Python Database API仕様に続くMySQLdbの代替品です。トリガされたラムダイベントのようなほとんどの場合、それはまさに速いでしょう。

私は多くのプロダクションでそれを使用しました。

+0

私のsqlalchemyモデルのPyMySQLでMySQLdbを置き換えたとき、 'ImportError:No module MySQLdb'というエラーが出ます。 – Hussain

+0

@ systemjack:あなたのlamdaにpymysqlをどのように組み込んでいるか教えてください。 – Nipun

+0

@Hussain私たちはsqlalchemyを使用しないので、pymysqlを使用する方法についてはわかりません。基本的な使い方を示すリンクがいくつかあります:http://docs.aws.amazon.com/lambda/latest/dg/vpc-rds-deployment-pkg.html、http://docs.aws.amazon.com/lambda/最新の/ dg/lambda-python-how-to-create-deployment-package.html ... pipを使用して-tオプション付きのプロジェクトディレクトリ/配備パッケージにインストールする必要があります。 – systemjack

0

lambda-dockerを使用すると、同様のLinux環境にアクセスすることなく、ラムダ機能をセットアップしてテストすることができます。

ラムダをセットアップするには、lambda-dockerビルドイメージを使用して分離ドッカーコンテナを実行し、コンテナにpip install <package>コマンドを実行します。その後、コンテナをエクスポートし、インストールされたパッケージをusr/libの下に置き、AWSラムダパッケージに配置します。

ラムダをラムダ - ドッカー画像で実行することで、互換性をテストすることができます。機能する場合は、自信を持ってAWS Lambdaにアップロードしてアップロードしてください。

docker run -d -v "$PWD":/var/task lambci/lambda:build-python2.7 tail -f /dev/null 

docker ps 

docker exec 0c55aae443e6 pip install pandas 

docker exec 0c55aae443e6 pip install sqlalchemy 

docker exec 0c55aae443e6 pip freeze 

docker exec 0c55aae443e6 python -c "import site; print(site.getsitepackages())" 

docker container export -o lambda_ready_container 0c55aae443e6 
関連する問題