AWS LambdaでPyGreSQLを利用できなかった話

# はじめに

* AWS Lambda関数をPython 3.6で記述したい
* そのPythonで、PyGreSQLを利用してPostgreSQLにアクセスしたい

という目的を果たすために、AWS Lambdaに対応したAMIでEC2インスタンスを起動し、PyGreSQLをソースコードからビルドしてみました。
しかし、PyGreSQLがlibpqに依存しており、libpqを静的リンクしてPyGreSQLをビルドする事ができなかったため、利用できませんでした。

他の方が同じ轍を踏まないように、僕がやったことを記録に残しておこうと思います。

# 手順

[AWS Lambdaの公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)に従い、以下のAMIを利用してEC2インスタンスを立ち上げます。

* amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2

立ち上げたEC2インスタンスに接続してpythonのバージョンを確認してみると、2.7です。

```sh
$ python --version
Python 2.7.12
```

3.6がインストールされていないようなので、とりあえずpython 3.6をインストールしてみましょう。

```sh
$ sudo yum install python36-devel
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main                                                                                                                           | 2.1 kB  00:00:00     
amzn-updates                                                                                                                        | 2.5 kB  00:00:00     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ python36-devel.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: python36-libs(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(x86-64) = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36 = 3.6.2-5.8.amzn1 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python(abi) = 3.6 のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36(alternatives) のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: /usr/bin/python3.6m のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: libpython3.6m.so.1.0()(64bit) のパッケージ: python36-devel-3.6.2-5.8.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ python36.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: python36-setuptools のパッケージ: python36-3.6.2-5.8.amzn1.x86_64
--> 依存性の処理をしています: python36-pip のパッケージ: python36-3.6.2-5.8.amzn1.x86_64
---> パッケージ python36-libs.x86_64 0:3.6.2-5.8.amzn1 を インストール
--> 依存性の処理をしています: libcrypto.so.10(OPENSSL_1.0.2)(64bit) のパッケージ: python36-libs-3.6.2-5.8.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ openssl.x86_64 1:1.0.1k-15.99.amzn1 を 更新
---> パッケージ openssl.x86_64 1:1.0.2k-8.106.amzn1 を アップデート
---> パッケージ python36-pip.noarch 0:9.0.1-1.24.amzn1 を インストール
---> パッケージ python36-setuptools.noarch 0:36.2.7-1.33.amzn1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================
 Package                                  アーキテクチャー            バージョン                                   リポジトリー                       容量
===========================================================================================================================================================
インストール中:
 python36-devel                           x86_64                      3.6.2-5.8.amzn1                              amzn-updates                      1.2 M
依存性関連でのインストールをします:
 python36                                 x86_64                      3.6.2-5.8.amzn1                              amzn-updates                       63 k
 python36-libs                            x86_64                      3.6.2-5.8.amzn1                              amzn-updates                       11 M
 python36-pip                             noarch                      9.0.1-1.24.amzn1                             amzn-main                         2.5 M
 python36-setuptools                      noarch                      36.2.7-1.33.amzn1                            amzn-main                         831 k
依存性関連での更新をします:
 openssl                                  x86_64                      1:1.0.2k-8.106.amzn1                         amzn-updates                      1.8 M

トランザクションの要約
===========================================================================================================================================================
インストール  1 パッケージ (+4 個の依存関係のパッケージ)
更新                       ( 1 個の依存関係のパッケージ)

総ダウンロード容量: 18 M
Is this ok [y/d/N]: y
Downloading packages:
(1/6): python36-3.6.2-5.8.amzn1.x86_64.rpm                                                                                          |  63 kB  00:00:00     
(2/6): openssl-1.0.2k-8.106.amzn1.x86_64.rpm                                                                                        | 1.8 MB  00:00:00     
(3/6): python36-devel-3.6.2-5.8.amzn1.x86_64.rpm                                                                                    | 1.2 MB  00:00:00     
(4/6): python36-setuptools-36.2.7-1.33.amzn1.noarch.rpm                                                                             | 831 kB  00:00:00     
(5/6): python36-pip-9.0.1-1.24.amzn1.noarch.rpm                                                                                     | 2.5 MB  00:00:00     
(6/6): python36-libs-3.6.2-5.8.amzn1.x86_64.rpm                                                                                     |  11 MB  00:00:00     
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                        15 MB/s |  18 MB  00:00:01     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  更新します              : 1:openssl-1.0.2k-8.106.amzn1.x86_64                                                                                        1/7 
  インストール中          : python36-libs-3.6.2-5.8.amzn1.x86_64                                                                                       2/7 
  インストール中          : python36-pip-9.0.1-1.24.amzn1.noarch                                                                                       3/7 
  インストール中          : python36-3.6.2-5.8.amzn1.x86_64                                                                                            4/7 
  インストール中          : python36-setuptools-36.2.7-1.33.amzn1.noarch                                                                               5/7 
  インストール中          : python36-devel-3.6.2-5.8.amzn1.x86_64                                                                                      6/7 
  整理中                  : 1:openssl-1.0.1k-15.99.amzn1.x86_64                                                                                        7/7 
  検証中                  : python36-setuptools-36.2.7-1.33.amzn1.noarch                                                                               1/7 
  検証中                  : python36-libs-3.6.2-5.8.amzn1.x86_64                                                                                       2/7 
  検証中                  : python36-pip-9.0.1-1.24.amzn1.noarch                                                                                       3/7 
  検証中                  : python36-3.6.2-5.8.amzn1.x86_64                                                                                            4/7 
  検証中                  : python36-devel-3.6.2-5.8.amzn1.x86_64                                                                                      5/7 
  検証中                  : 1:openssl-1.0.2k-8.106.amzn1.x86_64                                                                                        6/7 
  検証中                  : 1:openssl-1.0.1k-15.99.amzn1.x86_64                                                                                        7/7 

インストール:
  python36-devel.x86_64 0:3.6.2-5.8.amzn1                                                                                                                  

依存性関連をインストールしました:
  python36.x86_64 0:3.6.2-5.8.amzn1                       python36-libs.x86_64 0:3.6.2-5.8.amzn1          python36-pip.noarch 0:9.0.1-1.24.amzn1         
  python36-setuptools.noarch 0:36.2.7-1.33.amzn1         

依存性を更新しました:
  openssl.x86_64 1:1.0.2k-8.106.amzn1                                                                                                                      

完了しました!
```

PostgreSQL 9.6の "devel" もインストールしましょう。

```sh
$ sudo yum install postgresql96-devel
読み込んだプラグイン:priorities, update-motd, upgrade-helper
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ postgresql96-devel.x86_64 0:9.6.6-1.79.amzn1 を インストール
--> 依存性の処理をしています: postgresql96-libs(x86-64) = 9.6.6-1.79.amzn1 のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: postgresql96(alternatives) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: postgresql96(alternatives) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libpq.so.5()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libpgtypes.so.3()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libecpg_compat.so.3()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> 依存性の処理をしています: libecpg.so.6()(64bit) のパッケージ: postgresql96-devel-9.6.6-1.79.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ postgresql96.x86_64 0:9.6.6-1.79.amzn1 を インストール
---> パッケージ postgresql96-libs.x86_64 0:9.6.6-1.79.amzn1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================
 Package                                   アーキテクチャー              バージョン                              リポジトリー                         容量
===========================================================================================================================================================
インストール中:
 postgresql96-devel                        x86_64                        9.6.6-1.79.amzn1                        amzn-updates                        1.3 M
依存性関連でのインストールをします:
 postgresql96                              x86_64                        9.6.6-1.79.amzn1                        amzn-updates                        5.0 M
 postgresql96-libs                         x86_64                        9.6.6-1.79.amzn1                        amzn-updates                        283 k

トランザクションの要約
===========================================================================================================================================================
インストール  1 パッケージ (+2 個の依存関係のパッケージ)

総ダウンロード容量: 6.6 M
インストール容量: 25 M
Is this ok [y/d/N]: y
Downloading packages:
(1/3): postgresql96-devel-9.6.6-1.79.amzn1.x86_64.rpm                                                                               | 1.3 MB  00:00:00     
(2/3): postgresql96-libs-9.6.6-1.79.amzn1.x86_64.rpm                                                                                | 283 kB  00:00:00     
(3/3): postgresql96-9.6.6-1.79.amzn1.x86_64.rpm                                                                                     | 5.0 MB  00:00:00     
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                       7.1 MB/s | 6.6 MB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : postgresql96-libs-9.6.6-1.79.amzn1.x86_64                                                                                  1/3 
  インストール中          : postgresql96-9.6.6-1.79.amzn1.x86_64                                                                                       2/3 
  インストール中          : postgresql96-devel-9.6.6-1.79.amzn1.x86_64                                                                                 3/3 
  検証中                  : postgresql96-9.6.6-1.79.amzn1.x86_64                                                                                       1/3 
  検証中                  : postgresql96-libs-9.6.6-1.79.amzn1.x86_64                                                                                  2/3 
  検証中                  : postgresql96-devel-9.6.6-1.79.amzn1.x86_64                                                                                 3/3 

インストール:
  postgresql96-devel.x86_64 0:9.6.6-1.79.amzn1                                                                                                             

依存性関連をインストールしました:
  postgresql96.x86_64 0:9.6.6-1.79.amzn1                                    postgresql96-libs.x86_64 0:9.6.6-1.79.amzn1                                   

完了しました!
```

gccも必要だったのでインストール

```sh
$ sudo yum install gcc
読み込んだプラグイン:priorities, update-motd, upgrade-helper
amzn-main                                                                                                                           | 2.1 kB  00:00:00     
amzn-updates                                                                                                                        | 2.5 kB  00:00:00     
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ gcc.noarch 0:4.8.5-1.22.amzn1 を インストール
--> 依存性の処理をしています: gcc48 >= 4.8.5 のパッケージ: gcc-4.8.5-1.22.amzn1.noarch
--> トランザクションの確認を実行しています。
---> パッケージ gcc48.x86_64 0:4.8.5-11.135.amzn1 を インストール
--> 依存性の処理をしています: libgcc48(x86-64) = 4.8.5 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: cpp48(x86-64) = 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgomp(x86-64) >= 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgcc(x86-64) >= 4.8.5-11.135.amzn1 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: glibc-devel(x86-64) >= 2.2.90-12 のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libmpfr.so.4()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libmpc.so.3()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> 依存性の処理をしています: libgomp.so.1()(64bit) のパッケージ: gcc48-4.8.5-11.135.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ cpp48.x86_64 0:4.8.5-11.135.amzn1 を インストール
---> パッケージ glibc-devel.x86_64 0:2.17-196.172.amzn1 を インストール
--> 依存性の処理をしています: glibc-headers = 2.17-196.172.amzn1 のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: glibc(x86-64) = 2.17-196.172.amzn1 のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: glibc-headers のパッケージ: glibc-devel-2.17-196.172.amzn1.x86_64
---> パッケージ libgcc48.x86_64 0:4.8.3-9.111.amzn1 を 更新
---> パッケージ libgcc48.x86_64 0:4.8.5-11.135.amzn1 を アップデート
---> パッケージ libgomp.x86_64 0:6.4.1-1.45.amzn1 を インストール
---> パッケージ libmpc.x86_64 0:1.0.1-3.3.amzn1 を インストール
---> パッケージ mpfr.x86_64 0:3.1.1-4.14.amzn1 を インストール
--> トランザクションの確認を実行しています。
---> パッケージ glibc.x86_64 0:2.17-157.170.amzn1 を 更新
--> 依存性の処理をしています: glibc(x86-64) = 2.17-157.170.amzn1 のパッケージ: glibc-common-2.17-157.170.amzn1.x86_64
---> パッケージ glibc.x86_64 0:2.17-196.172.amzn1 を アップデート
---> パッケージ glibc-headers.x86_64 0:2.17-196.172.amzn1 を インストール
--> 依存性の処理をしています: kernel-headers >= 2.2.1 のパッケージ: glibc-headers-2.17-196.172.amzn1.x86_64
--> 依存性の処理をしています: kernel-headers のパッケージ: glibc-headers-2.17-196.172.amzn1.x86_64
--> トランザクションの確認を実行しています。
---> パッケージ glibc-common.x86_64 0:2.17-157.170.amzn1 を 更新
---> パッケージ glibc-common.x86_64 0:2.17-196.172.amzn1 を アップデート
---> パッケージ kernel-headers.x86_64 0:4.9.85-38.58.amzn1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================
 Package                               アーキテクチャー              バージョン                                  リポジトリー                         容量
===========================================================================================================================================================
インストール中:
 gcc                                   noarch                        4.8.5-1.22.amzn1                            amzn-main                           4.1 k
依存性関連でのインストールをします:
 cpp48                                 x86_64                        4.8.5-11.135.amzn1                          amzn-main                           6.7 M
 gcc48                                 x86_64                        4.8.5-11.135.amzn1                          amzn-main                            18 M
 glibc-devel                           x86_64                        2.17-196.172.amzn1                          amzn-main                           1.1 M
 glibc-headers                         x86_64                        2.17-196.172.amzn1                          amzn-main                           751 k
 kernel-headers                        x86_64                        4.9.85-38.58.amzn1                          amzn-updates                        1.1 M
 libgomp                               x86_64                        6.4.1-1.45.amzn1                            amzn-main                           204 k
 libmpc                                x86_64                        1.0.1-3.3.amzn1                             amzn-main                            53 k
 mpfr                                  x86_64                        3.1.1-4.14.amzn1                            amzn-main                           237 k
依存性関連での更新をします:
 glibc                                 x86_64                        2.17-196.172.amzn1                          amzn-main                           5.8 M
 glibc-common                          x86_64                        2.17-196.172.amzn1                          amzn-main                            28 M
 libgcc48                              x86_64                        4.8.5-11.135.amzn1                          amzn-main                           150 k

トランザクションの要約
===========================================================================================================================================================
インストール  1 パッケージ (+8 個の依存関係のパッケージ)
更新                       ( 3 個の依存関係のパッケージ)

総ダウンロード容量: 62 M
Is this ok [y/d/N]: y
Downloading packages:
(1/12): gcc-4.8.5-1.22.amzn1.noarch.rpm                                                                                             | 4.1 kB  00:00:00     
(2/12): cpp48-4.8.5-11.135.amzn1.x86_64.rpm                                                                                         | 6.7 MB  00:00:00     
(3/12): glibc-2.17-196.172.amzn1.x86_64.rpm                                                                                         | 5.8 MB  00:00:00     
(4/12): gcc48-4.8.5-11.135.amzn1.x86_64.rpm                                                                                         |  18 MB  00:00:01     
(5/12): glibc-devel-2.17-196.172.amzn1.x86_64.rpm                                                                                   | 1.1 MB  00:00:00     
(6/12): glibc-common-2.17-196.172.amzn1.x86_64.rpm                                                                                  |  28 MB  00:00:01     
(7/12): kernel-headers-4.9.85-38.58.amzn1.x86_64.rpm                                                                                | 1.1 MB  00:00:00     
(8/12): glibc-headers-2.17-196.172.amzn1.x86_64.rpm                                                                                 | 751 kB  00:00:00     
(9/12): libgcc48-4.8.5-11.135.amzn1.x86_64.rpm                                                                                      | 150 kB  00:00:00     
(10/12): libgomp-6.4.1-1.45.amzn1.x86_64.rpm                                                                                        | 204 kB  00:00:00     
(11/12): libmpc-1.0.1-3.3.amzn1.x86_64.rpm                                                                                          |  53 kB  00:00:00     
(12/12): mpfr-3.1.1-4.14.amzn1.x86_64.rpm                                                                                           | 237 kB  00:00:00     
-----------------------------------------------------------------------------------------------------------------------------------------------------------
合計                                                                                                                        25 MB/s |  62 MB  00:00:02     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  更新します              : libgcc48-4.8.5-11.135.amzn1.x86_64                                                                                        1/15 
  更新します              : glibc-common-2.17-196.172.amzn1.x86_64                                                                                    2/15 
  更新します              : glibc-2.17-196.172.amzn1.x86_64                                                                                           3/15 
warning: /etc/nsswitch.conf created as /etc/nsswitch.conf.rpmnew
  インストール中          : mpfr-3.1.1-4.14.amzn1.x86_64                                                                                              4/15 
  インストール中          : libmpc-1.0.1-3.3.amzn1.x86_64                                                                                             5/15 
  インストール中          : cpp48-4.8.5-11.135.amzn1.x86_64                                                                                           6/15 
  インストール中          : libgomp-6.4.1-1.45.amzn1.x86_64                                                                                           7/15 
  インストール中          : kernel-headers-4.9.85-38.58.amzn1.x86_64                                                                                  8/15 
  インストール中          : glibc-headers-2.17-196.172.amzn1.x86_64                                                                                   9/15 
  インストール中          : glibc-devel-2.17-196.172.amzn1.x86_64                                                                                    10/15 
  インストール中          : gcc48-4.8.5-11.135.amzn1.x86_64                                                                                          11/15 
  インストール中          : gcc-4.8.5-1.22.amzn1.noarch                                                                                              12/15 
  整理中                  : libgcc48-4.8.3-9.111.amzn1.x86_64                                                                                        13/15 
  整理中                  : glibc-2.17-157.170.amzn1.x86_64                                                                                          14/15 
  整理中                  : glibc-common-2.17-157.170.amzn1.x86_64                                                                                   15/15 
  検証中                  : gcc-4.8.5-1.22.amzn1.noarch                                                                                               1/15 
  検証中                  : glibc-common-2.17-196.172.amzn1.x86_64                                                                                    2/15 
  検証中                  : glibc-2.17-196.172.amzn1.x86_64                                                                                           3/15 
  検証中                  : kernel-headers-4.9.85-38.58.amzn1.x86_64                                                                                  4/15 
  検証中                  : glibc-headers-2.17-196.172.amzn1.x86_64                                                                                   5/15 
  検証中                  : glibc-devel-2.17-196.172.amzn1.x86_64                                                                                     6/15 
  検証中                  : cpp48-4.8.5-11.135.amzn1.x86_64                                                                                           7/15 
  検証中                  : libmpc-1.0.1-3.3.amzn1.x86_64                                                                                             8/15 
  検証中                  : libgcc48-4.8.5-11.135.amzn1.x86_64                                                                                        9/15 
  検証中                  : mpfr-3.1.1-4.14.amzn1.x86_64                                                                                             10/15 
  検証中                  : gcc48-4.8.5-11.135.amzn1.x86_64                                                                                          11/15 
  検証中                  : libgomp-6.4.1-1.45.amzn1.x86_64                                                                                          12/15 
  検証中                  : libgcc48-4.8.3-9.111.amzn1.x86_64                                                                                        13/15 
  検証中                  : glibc-2.17-157.170.amzn1.x86_64                                                                                          14/15 
  検証中                  : glibc-common-2.17-157.170.amzn1.x86_64                                                                                   15/15 

インストール:
  gcc.noarch 0:4.8.5-1.22.amzn1                                                                                                                            

依存性関連をインストールしました:
  cpp48.x86_64 0:4.8.5-11.135.amzn1                  gcc48.x86_64 0:4.8.5-11.135.amzn1                   glibc-devel.x86_64 0:2.17-196.172.amzn1         
  glibc-headers.x86_64 0:2.17-196.172.amzn1          kernel-headers.x86_64 0:4.9.85-38.58.amzn1          libgomp.x86_64 0:6.4.1-1.45.amzn1               
  libmpc.x86_64 0:1.0.1-3.3.amzn1                    mpfr.x86_64 0:3.1.1-4.14.amzn1                     

依存性を更新しました:
  glibc.x86_64 0:2.17-196.172.amzn1               glibc-common.x86_64 0:2.17-196.172.amzn1               libgcc48.x86_64 0:4.8.5-11.135.amzn1              

完了しました!
```

これでビルドの準備が完了したので、PyGreSQLをソースコードからビルドします。
（PyGreSQLのソースコードからのビルドについては、[こちらの記事](https://qiita.com/baikichiz/items/3973ef1659998062261b)もご参照ください。）

```sh
$ wget http://pygresql.org/files/PyGreSQL.tar.gz
$ tar xvf PyGreSQL.tar.gz
$ cd PyGreSQL-5.0.4
$ python36 setup.py build
```

`python`コマンドだとpython 2.7の方が起動してしまうので、明示的に`python36`とバージョン付きでpythonを起動することに注意してください。

ビルド成果物のライブラリをコピーします。動作確認用のAWS Lambda関数をpyファイルに記述します。
そして、これらをzipファイルにまとめます。

```sh
mkdir ~/lambda
cp -r build/lib.linux-x86_64-3.6/ ~/lambda
$ cd ~/lambda
$ cat <<EOF >> lambda_function.py
> import pg
> def lambda_handler(event, context):
>     return 'ok'
> EOF
$ zip -r lambda.zip .
```

ここのやり方は「[AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する](https://dev.classmethod.jp/cloud/aws/build-psycopg2-for-aws-lambda-python/)」を参考にさせていただきました。ありがとうございます。

作成したzipファイルをAWS Lambdaコンソールからアップロードし、実行してみます。
zipファイルをアップロードするときは、AWS Lambda関数を「一から作成」で作成した後、以下の図のように「コード エントリ タイプ」のところから「.ZIP ファイルをアップロード」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/122210/994f1442-306a-c879-d2a0-66f218b2cccc.png)


アップロードして実行してみると、こんなエラーが出ました。

```
START RequestId: 6e925418-3541-11e8-84a9-598879beed01 Version: $LATEST
Unable to import module 'lambda_function': libpq.so.5: cannot open shared object file: No such file or directory

END RequestId: 6e925418-3541-11e8-84a9-598879beed01
REPORT RequestId: 6e925418-3541-11e8-84a9-598879beed01	Duration: 0.65 ms	Billed Duration: 100 ms 	Memory Size: 128 MB	Max Memory Used: 27 MB	
```

この方法ではlibpqが動的リンクになっており、ダメのようです。

# その他いろいろ試してみたわかったこと

[PyGreSQL公式ドキュメントのInstallation](http://www.pygresql.org/contents/install.html)には、DistUtilsを使わずにビルドする方法も書かれています。
こちらを試した場合も、上記エラーとなり、駄目でした。

「[AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する](https://dev.classmethod.jp/cloud/aws/build-psycopg2-for-aws-lambda-python/)」を参考に、libpqを静的リンクしてpsycopg2をビルドしてみました。これだと正しく動かすことができました。
psycopg2のビルドを試す過程で気づいたのですが、PyGreSQLのsetup.pyがそもそもlibpqを静的リンクしてビルドすることをサポートしていないようです。setup.cfgに静的リンクに関するコンフィグ記述欄がありません。
自力でsetup.pyをいじって、静的リンクするビルドプロセスを記述できれば解決するのでしょう。しかし、僕はこの辺まだ詳しくないので、今回は諦めました。

# 結論

PyGreSQLは現状、libpqを静的リンクするビルドをサポートしていません。
AWS LambdaでPythonを使ってPostgreSQLにアクセスしたいときは、psycopg2を使うのが手っ取り早いです。
ビルド手順は「[AWS Lambda Pythonからpsycopg2でRDS PostgreSQLに接続する](https://dev.classmethod.jp/cloud/aws/build-psycopg2-for-aws-lambda-python/)」を参考にしましょう。