27497
AWS Lambda上でサイトをクロールし、取得したデータをHerokuのPostgreSQLに保存しようと思っています。  
試行錯誤した結果、下記のエラーでつまづいてしまっております。

### 発生しているエラー

lambda上で実行したところ、下記のエラーが発生しました。

```

    START RequestId: efa28639-4100-11e6-a067-15a65cffa43f Version: $LATEST
    **Unable to import module 'lambda_function': /var/task/psycopg2/_psycopg.so: undefined symbol: ASN1_STRING_length**
    END RequestId: efa28639-4100-11e6-a067-15a65cffa43f
    REPORT RequestId: efa28639-4100-11e6-a067-15a65cffa43f  Duration: 0.28 ms   Billed Duration: 100 ms     Memory Size: 128 MB
    
```

### 作業過程

このエラーが発生するまで、環境等を変更しながら幾つかの作業を行いました。  
(主にpsycopg2周り)  
その過程について、下記記載させていただきます。

  1. macで圧縮ファイルを作成の上、lambdaにアップロードしたところ、psycopg2のエラー  
下記のリンクを参考に圧縮ファイルを作成しましたが、動作しませんでした。

参考：[AWS
LambdaでPythonをSchedule実行させる](http://qiita.com/taka4sato/items/67c62db6b86e14375bbd)

  2. libpqを静的リンクさせる必要があるようなので、lambda実行環境と同じAMIでEC2を起動。  
EC2上でpsycopg2をインストールした上で、圧縮ファイルを作成しようと考えました。

参考：[AWS Lambda Pythonからpsycopg2でRDS
PostgreSQLに接続する](http://dev.classmethod.jp/cloud/aws/build-psycopg2-for-aws-
lambda-python/)

  3. 圧縮ファイルを作成の上、再度lambdaにアップロードしたところ、エラー。
```     FATAL: no pg_hba.conf entry for host "***", user "***", database
"***", SSL off : OperationalError Traceback (most recent call last): File
"/var/task/lambda_function.py", line 22, in main connector =
psycopg2.connect(host="***.compute-1.amazonaws.com",port=5432,dbname="****",user="****",password="****")
File "/var/task/psycopg2/__init__.py", line 164, in connect conn =
_connect(dsn, connection_factory=connection_factory, async=async)
OperationalError: FATAL: no pg_hba.conf entry for host "***", user "***",
database "***", SSL off

    
```

どうやら、postgresqlの接続時に`sslmode='require'`のオプションを記載する必要があるようなので記載。

```     connector = psycopg2.connect(host="***.compute-1.amazonaws.com",

                port=5432,dbname="***",user="***",password="***",
                sslmode='require')`
    
```

参考：[How to connect to a remote PostgreSQL database with
Python](https://stackoverflow.com/questions/28228241/how-to-connect-to-a-
remote-postgresql-database-with-python)

  4. sslmode=requireを記載したところ、再度エラー。
```     OperationalError: sslmode value "require" invalid when SSL support
is not compiled in

    
```

参考：[Psycopg2 Python SSL Support is not compiled
in](https://stackoverflow.com/questions/34684376/psycopg2-python-ssl-support-
is-not-compiled-in)

  5. EC2のインスタンスを再作成し、postgresqlのインストール時に`--with-openssl`をつけた上で、再度実施。  
`--with-openssl`を実施するには、`openssl-devel`をインストールする必要があるようなので合わせて実施。

```     $ sudo yum -y install openssl-devel

    $ ./configure --prefix $PG_DIR --without-readline --without-zlib --with-openssl
    
```

再度参考：[AWS Lambda Pythonからpsycopg2でRDS
PostgreSQLに接続する](http://dev.classmethod.jp/cloud/aws/build-psycopg2-for-aws-
lambda-python/)

  6. 再度圧縮ファイルを作成の上、lambda上で実施したところ、上記のエラーが発生しました。

### EC2の環境について

python:2.7.10  
postgresql: 9.5.3 (`psql --version`では表示されず。)  
psycopg:2-2.6.1  
openssl:OpenSSL 1.0.1k-fips 8 Jan 2015

何かお気付きのところがございましたら、ご教授頂けますと幸いです。  
よろしくお願いします。
CC BY-SA 4.0
2016-07-03T11:39:23.240
27298
2021-03-08T02:00:54.497
2021-03-08T02:00:54.497
3060
12734
question
python postgresql heroku amazon-ec2 aws-lambda
AWS Lambda から Heroku の PostgreSQL に接続できない
openssl の共有ライブラリが見つからないようです。  
lambda_function.py と同じ zip ファイル内にライブラリを一式同梱する必要があるのではないでしょうか。  
libpq を静的リンクしたのと同じように、openssl のライブラリも静的リンクできませんでしょうか。  
あるいは、ld のオプションや環境変数 LD_LIBRARY_PATH を調整することにより、openssl の必要なものだけ引き抜いて psycopg2
に含めるようにできるかもしれません。

(参考) [linuxでの共有ライブラリのリンクについて](https://ja.stackoverflow.com/questions/16944/)
CC BY-SA 3.0
2016-07-10T07:42:36.063
27497
2016-07-10T07:42:36.063
2017-04-13T12:52:38.920
-1
4603
27298
answer