AWS LambdaでSQLServerに接続するための環境を作ってみる

AWS LambdaでRDBMSに繋ぐのは[アンチパターン](https://www.keisuke69.net/entry/2017/06/21/121501)なんですが、頻度の少ない定期バッチ処理やパフォーマンスを必要としない非同期処理ではそのデメリットを受けません。
LambdaからSQLServerに接続する情報は割と少なく、かつ、最新の情報が少ないと思ったため書いてみました。

# ほしいもの

 - SQLServerに接続に接続できるLambda環境

この場合、SQLServerはRDSでもそうでなくてもどちらでも構わないとします。

# 特徴

 - Python環境でLambdaを作ります(2系でも3系でもOK)
 - Dockerは利用しません
 - Microsoft SQLServer 2017まで対応(Microsoft ODBC Driver 17 for SQL Server)
 - freetdsは不要です。freetdsで同様な環境を作るのなら[こちら](https://qiita.com/haruharuharuby/items/4d946d0bb825ad925d93)に記事がありました。

# 構築に必要な環境

 - MacOS High Sierra
 - Virtualbox
 - Vagrant
 - Homebrew
 - pyenv

# Lambda環境の構築に必要なものを入手します

## 入手するもの
 1. Microsoft ODBC Driver
 1. pyodbc共有ライブラリ

### 1. Microsoft ODBC Driver

LambdaはAmazonLinux(CentOSベース)で動作するため、必要なライブラリはAmazonLinux上で入手します。

#### VagrantでAmazon Linuxを起動する
参考サイト：https://techblog.recochoku.jp/5048

* Mac環境下で任意のディレクトリを作成します。

```shell
mkdir ~/amznlinux
cd ~/amznlinux
```

* AmazonLinuxのboxをダウンロードしてVMを起動します。

```sh
vagrant init mvbcoding/awslinux
vagrant up
```

* VMにSSHでログインします。

```sh
vagrant ssh
```

* パッケージを最新にします。

```
sudo yum update
```

* Microsoft ODBC Driverを入手します。

参考サイト： https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

AmazonLinuxの標準パッケージのunixODBCのドライバのバージョンは古く、MicrosoftのODBCドライバのインストールができません。
バージョン2.3以上であればビルドできます。

```
# root
sudo su
curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo

# ユーザーで実行
exit

# ※公式にはありません。
# AmazonLinuxのODBCドライバが古くてmsodbcsqlのインストールに失敗しますので、下記で新しいunixODBCを手に入れてください。

sudo yum install http://mirror.centos.org/centos/7/os/x86_64/Packages/unixODBC-2.3.1-11.el7.x86_64.rpm
sudo yum install http://mirror.centos.org/centos/7/os/x86_64/Packages/unixODBC-devel-2.3.1-11.el7.x86_64.rpm

sudo yum install -y unixODBC unixODBC-devel
sudo ACCEPT_EULA=Y yum install -y msodbcsql17
```

* インストールしたパッケージをすべてMacOSXのホスト側にコピーする

```
# ファイルのコピー先を作成します
mkdir /vagrant/unixODBC
mkdir /vagrant/unixODBC-devel
mkdir /vagrant/msodbcsql

# 取得したパッケージをコピー
rpm -ql unixODBC | xargs -i cp -r -p {} /vagrant/unixODBC
rpm -ql unixODBC-devel | xargs -i cp -r -p {} /vagrant/unixODBC-devel
rpm -ql msodbcsql | xargs -i cp -r -p {} /vagrant/msodbcsql
```

これでAmazonLinuxの役割は終わりです。


### 2. pyodbc共有ライブラリ

参考サイト: https://github.com/Miserlou/lambda-packages/tree/master/lambda_packages/pyodbc

上記の参考サイトから取得してください。必要なのは `pyodbc.so`のみです。(libodbc.so.2は不要)

# Python Lambdaのローカル環境作成

参考サイト: https://www.reddit.com/r/aws/comments/8yanz1/aws_lambda_python_36_pyodbc_and_sql_server_driver/

先程ダウンロードしたファイルを下記のようになるようにLambda環境を構築します。

```
|--(handlerのあるpythonコード)
|--pyodbc.so
|--odbcinst.ini
|--bin (unixODBCで取得したファイル)
|--include (unixODBC-develで取得したファイル)
|--lib (unixODBCで取得したファイル)
|--msodbcsql
   |--etc(msodbcsql17で取得したファイル)
   |--include(msodbcsql17で取得したファイル)
   |--lib64 (msodbcsql17で取得したファイル)
   |--share (msodbcsql17で取得したファイル)
```

[lambda-uploader](https://github.com/rackerlabs/lambda-uploader)でLambdaでデプロイを行います。
pyodbcをrequirements.txtに取り込み、msodbcsql17で取得したライブラリをDriverとして取り込むことで、SQLServerに接続することができます。

※ここのローカル環境の作成の詳細は、また後日書きます。


# 参考

- なぜAWS LambdaとRDBMSの相性が悪いかを簡単に説明する
  https://www.keisuke69.net/entry/2017/06/21/121501
- AWS lambda から MSSQLのRDSインスタンスに接続する(python)
  https://qiita.com/haruharuharuby/items/4d946d0bb825ad925d93
- Vagrantでお手軽にAmazon Linuxの仮想マシンを立てる
  https://techblog.recochoku.jp/5048
- Linux および macOS に Microsoft ODBC Driver for SQL Server をインストールする
  https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017
- AWS Lambda - Python 3.6, pyodbc, and SQL Server driver - ODBC driver
https://www.reddit.com/r/aws/comments/8yanz1/aws_lambda_python_36_pyodbc_and_sql_server_driver/