by 庄司 里菜 | June 12, 2018

AWS LambdaからのPython&CData ODBC Driverによるkintoneデータ操作

はじめに

概要

CData ODBC Driverを用いて、AWSのサーバレスサービスLambdaからPythonコードを呼び出しkintoneアプリ内のデータを取り扱う手順です。

構成図


使用製品・サービス

AWS Lambda
kintone
CData kintone ODBC Driver for Linux
 ※2017/08/20現在、kinton向けのβ版はこちらからダウンロード可能
  その他のデータソースのODBCドライバは、こちらからダウンロード可能
・pyodbc
・RHEL5.7 (pyodbcライブラリ抽出用)

サンプルコード

https://github.com/kuwazzy/pycdatakintonedemo

参考

CData kintone ODBC Driver製品マニュアル - Pythonからの利用
stack overflow - LambdaからpyODBCの使用


Lambda関数パッケージの準備

CData kintone ODBC Driverの準備

CData SoftwareのWebページにアクセスします。CData kintone ODBC Driverの評価版、および、製品版はこちらからダウンロード可能です。ただし、2017/08/20現在、Linux版はβ版での提供のためこちらからダウンロード可能してください。製品マニュアルはこちらをご覧ください。

CData kintone ODBC Driver for Linux版ビルドからライブラリの抽出

ビルドファイルsetup.x86_64.debを解凍します。解凍するとdata.tarが作成されるので更に解凍します。すると以下の構造のdataディレクトリが作成されます。

data/
├ opt/
| └ cdata/
|   └ cdata-odbc-driver-for-kintone/
|     ├ bin/
|     ├ db/
|     ├ demos/
|     ├ etc/
|     ├ help/
|     └ lib/
|       ├ cdata.odbc.kintone.ini
|       ├ CData.ODBCm.Kintone.DLL
|       ├ libcdatart.x64.so.4
|       └ libkintoneodbc.x64.so
└ usr/
  └ doc/     └ cdata-odbc-driver-for-kintone/

/data/opt/cdata/cdata-odbc-driver-for-kintone/lib 配下の4ファイルを取り出します。

pyodbc、および、依存ライブラリの準備

pyodbc.so ライブラリを準備します。私の環境では、RHEL7.3の/usr/lib64/python2.7/site-packages配下からコピーしました。

また、あわせてpyodbcの依存ライブラリ群を準備します。私の環境では、RHEL7.3の/usr/lib64配下からコピーしました。

追加した依存ライブラリ一覧

libodbc.so
libodbc.so.2
libodbccr.so
libodbccr.so.2
libodbcdrvcfg1S.so
libodbcdrvcfg1S.so.2
libodbcdrvcfg2S.so
libodbcdrvcfg2S.so.2
libodbcinst.so
libodbcinst.so.2
libodbcminiS.so
libodbcminiS.so.2
libodbcmyS.so
libodbcmyS.so.2
libodbcnnS.so
libodbcnnS.so.2
libodbcpsqlS.so
libodbcpsqlS.so.2
libodbctxtS.so
libodbctxtS.so.2
libomapi.so.0
liboplodbcS.so
liboplodbcS.so.2
liboraodbcS.so
liboraodbcS.so.2

Pythonコードの準備

こちらのGitHubから取得してください。


# -*- coding: utf-8 -*-
import pyodbc
import sys

def Main(event, context):
    print('************************************************')
    print('\t\t Kintone Demo')
    print('This demo uses the CData ODBC for Kintone')
    print('************************************************')
    print('option:1,               - List all the tables in the database')
    print('option:2, table:name    - List all the columns for a specific table')
    print('option:3, table:name    - Select data from table')
    print('option:4, sql:statement - Custom SQL Query')
    print('------------------------------------------------')

    connStr =  'Driver={./cdata/libkintoneodbc.x64.so};' + event['conn_str']
    conn = pyodbc.connect(connStr)

    if event['option'] == '1':
        for table in conn.cursor().tables():
            print(table.table_name)
    elif event['option'] == '2':
        tableName = event['table']
        for column in conn.cursor().columns(tableName):
            print(column.column_name)
    elif event['option'] == '3':
        tableName = event['table']
        c = conn.cursor();
        c.execute('SELECT * FROM ' + tableName)
        for row in c.fetchall():
            print(row)
    elif event['option'] == '4':
        sql = event['sql']
        c = conn.cursor();
        c.execute(sql)
        for row in c.fetchall():
            print(row)
    else:
            print('Invalid option')

    conn.close();

    return {
        'status' : 'finish'
    }

注意点は、ODBCのライブラリをDSNでなく直指定している点です。こちらのページを参考にしました。

 connStr =  'Driver={./cdata/libkintoneodbc.x64.so};' + event['conn_str']

関数パッケージの作成

上記手順で準備したファイル群を下記のディレクトリ構造で準備します。
.
├ pycdatakintonedemo.py  (Lambdaから呼び出されるPythonコード)
├ pyodbc.so  (pyodbcライブラリ)
├ cdata/    (CDataライブラリ)
| ├ cdata.odbc.kintone.
| ├ CData.ODBCm.Kintone.DLL
| ├ libcdatart.x64.so (libcdatart.x64.so.4をリネーム)
| └ libkintoneodbc.x64.so
└ lib/
  └ libodbc*.so etc (pyodbc依存ライブラリ群)

本ファイル群をzip化します。※親ディレクトリは含めないでください


Lambda関数の作成

関数の作成

AWSLambdaのダッシュボード画面にて「関数の作成」ボタンをクリックします。
ステップ1の設計図の選択画面にて「一から作成」ボタンをクリックします。
ステップ2のトリガーの設定画面では今回は設定しないので「次へ」ボタンをクリックします。
ステップ3の関数の設定画面にて関数名(任意)、説明(任意)を入力し、ランタイムは「Python2.7」を選択します。
Lambda関数のコードでは、コードエントリタイプを「.ZIPファイルをアップロード」を選択して、「関数パッケージの作成」の手順で作成したZIPファイルをアップロードします。
Lambda関数ハンドラおよびロールでは、GitHubからダウンロードしたPythonコードの拡張子を除いたファイル名(サンプル:pycdatakintonedemo)とハンドラ名(サンプル:Main)をドットで繋いだ名前を設定します。
詳細設定にて、タイムアウトの時間を適切な値(例:1分)に設定します。

ここまで設定し終わったら最下部の「次へ」ボタンをクリックして、確認画面で問題がなければ「関数の作成」ボタンをクリックします。
関数が作成されたことを確認します。

Lambda関数の実行

テストイベントの作成

「アクション」から「テストイベントの設定」を選択します。

サンプルイベントテンプレートはHelloWorldのままで、4つのパラメータの値を設定します。

{
  "conn_str": "Url=https://***.cybozu.com;User=***;Password=***;",
  "option": "1",
  "table": "table_name",
  "sql": "SELECT * FROM table_name"
}

「conn_str」はkintoneへの接続文字列です。最低限、Url、User、Passwordの3つが必要となります。 「option」は以下の4通りです。2,3の場合は「table」も指定してください。4の場合は「sql」も指定してください。

・ option:1, - List all the tables in the database'
・ option:2, table:name - List all the columns for a specific table'
・ option:3, table:name - Select data from table'
・ option:4, sql:statement - Custom SQL Query'


テスト実行

それでは「テスト」ボタンをクリックして実行してみます。

実行結果に「成功」と表示されればOKです。「詳細」をクリックしてログ出力内の「ここをクリック」してCloudWatch内のログをみてみましょう。エラーが発生した場合はログの内容を確認してください。

ログストリームを選択して、メッセージ内容をみてみるとkintone内のアプリの一覧が出力されていることを確認できます。

続いて、テストイベントを開き、「option」に「3」(テーブルデータの表示)をセットして「table」にkintone内に存在するアプリ名(例:CDataJapanSKU)をセットして、「保存してテスト」をクリックします。

CloudWatch内のログをもう一度開いてみると、kintoneアプリ内のデータ(例:CDataJapanSKU内の商品データ)が表示されていることを確認できます。

まとめ

CData ODBC Driverを用いたAWS LambdaからのPythonによるkintone連携の手順でした。CData ODBC Driverはkintoneの他にも90を超えるSaas、アプリケーション、データベースに接続可能です。各種ODBCドライバはこちらのWebページからダウンロードしてご試用ください。



 
 
ダウンロード