AWS LambdaでRDBMSに繋ぐのはアンチパターンなんですが、頻度の少ない定期バッチ処理やパフォーマンスを必要としない非同期処理ではそのデメリットを受けません。
LambdaからSQLServerに接続する情報は割と少なく、かつ、最新の情報が少ないと思ったため書いてみました。
ほしいもの
- SQLServerに接続に接続できるLambda環境
この場合、SQLServerはRDSでもそうでなくてもどちらでも構わないとします。
特徴
- Python環境でLambdaを作ります(2系でも3系でもOK)
- Dockerは利用しません
- Microsoft SQLServer 2017まで対応(Microsoft ODBC Driver 17 for SQL Server)
- freetdsは不要です。freetdsで同様な環境を作るのならこちらに記事がありました。
構築に必要な環境
- MacOS High Sierra
- Virtualbox
- Vagrant
- Homebrew
- pyenv
Lambda環境の構築に必要なものを入手します
入手するもの
- Microsoft ODBC Driver
- pyodbc共有ライブラリ
1. Microsoft ODBC Driver
LambdaはAmazonLinux(CentOSベース)で動作するため、必要なライブラリはAmazonLinux上で入手します。
VagrantでAmazon Linuxを起動する
参考サイト:https://techblog.recochoku.jp/5048
- Mac環境下で任意のディレクトリを作成します。
mkdir ~/amznlinux
cd ~/amznlinux
- AmazonLinuxのboxをダウンロードしてVMを起動します。
vagrant init mvbcoding/awslinux
vagrant up
- VMにSSHでログインします。
vagrant ssh
- パッケージを最新にします。
sudo yum update
- Microsoft ODBC Driverを入手します。
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で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/