Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

概要

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

構成図

image.png

使用製品・サービス

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から取得してください。

pycdatakintonedemo.py
# -*- 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.ini
| ├ CData.ODBCm.Kintone.DLL
| ├ libcdatart.x64.so (libcdatart.x64.so.4をリネーム)
| └ libkintoneodbc.x64.so
└ lib/
  └ libodbc*.so etc (pyodbc依存ライブラリ群)

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

Lambda関数の作成

関数の作成

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

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

Lambda関数の実行

テストイベントの作成

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

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

sample.json
{
  "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'

image.png

テスト実行

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

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

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

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

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

まとめ

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away