開発者の皆さん、こんにちは。
Python Native APIを利用すると、IRISにあるグローバル変数の参照/更新をPythonから行えたり、メソッドやルーチンをPythonから実行することができます。
この記事では「AWS Lambda の IRIS Python Native API IRIS」の記事を参考に、NativeAPIを利用してPythonからIRISに接続するAWS Lambda関数を作成する流れで必要となる、レイヤー作成と関数用コードの作成例をご紹介します。
※ 事前にAWSのEC2インスタンス(Ubuntu 20.04を選択)にIRISをインストールした環境を用意した状態からの例でご紹介します。
- 「AWS Lambda の IRIS Python Native API IRIS」の記事では、レイヤーとコードをまとめたZipを用意してLambda関数を作成していますがこの記事ではレイヤーとコード用Zipをそれぞれ用意して作成する流れでご紹介します。
- NativeAPIについて詳しくは、「【はじめての InterSystems IRIS】セルフラーニングビデオ:アクセス編:Python の NativeAPI に挑戦」をご参照ください。
- AWS Lambda関数のレイヤー作成、関数作成の流れは、別の記事:「PyODBC経由でIRISに接続するAWS Lambda関数を作成するまでの流れ」 と同様のため、この記事では詳細な作成手順について割愛しています。詳細な流れは記事をご参照ください。
以下の流れでご紹介します。
例で使用しているコード一式はこちらにあります👉https://github.com/Intersystems-jp/iris-native-lambda
1. Native API レイヤー用Zipの作成
Native API用モジュールのレイヤーを以下の手順で作成します。
レイヤー作成用の任意ディレクトリを用意し、その下に python
ディレクトリを用意します。
mkdir python
cd python
wget https://github.com/intersystems/quickstarts-python/raw/master/Solutions/nativeAPI_wheel/irisnative-1.0.0-cp34-abi3-linux_x86_64.whl
unzip irisnative-1.0.0-cp34-abi3-linux_x86_64.whl
cd ..
zip -r9 ../iris_native_lambda.zip *
Shell SessionShell Session
この流れで作成したZipの例:iris_native_lambda.zip
2.サンプルのクラス定義のインポート
Native APIでは、IRIS内のメソッドやルーチンをPythonから実行できるのでサンプルでは Test.Utils に用意したメソッドを実行しています。
Pythonのサンプルスクリプト:index.pyを試す場合は事前にインポートしてください。
インポートは管理ポータルから、またはVSCodeから、またはUtils.clsをIRISをインストールした環境に転送後、ユーティリティからインポートすることができます。
- 管理ポータルからインポートする場合
http://IPアドレス:52773/csp/sys/UtilHome.csp
にアクセスし、システムエクスプローラ→クラス→ネームスペース:USER→インポートボタン をクリックします。
Utils.clsをファイルに指定してインポートを行ってください。
- VSCodeを利用する場合
VSCodeにObjectScriptエクステンションをインストール後、IRISに接続しUtils.cls保存します(Ctrl+S)。
詳細は VSCode を使ってみよう!をご参照ください。
- Utils.clsをIRISをインストールした環境に転送後、ユーティリティからインポートする場合
Utils.cls を /usr/irissys/mgr/user
ディレクトリに配置した状態での実行例です。
IRISにログインします(USERネームスペースにログインしています)。
iris session IRIS
インポート用ユーティリティを利用してインポートを実施します。
do $system.OBJ.Load("/usr/irissys/mgr/user/Utils.cls","ck")
実行例は以下の通りです。
USER>do $system.OBJ.Load("/usr/irissys/mgr/user/Utils.cls","ck")
Load started on 03/27/2023 09:36:21
Loading file /usr/irissys/mgr/user/Utils.cls as udl
Compiling class Test.Utils
Compiling routine Test.Utils.1
Load finished successfully.
USER>
インポートしたクラス:Test.Utilsには以下のクラスメソッドが用意されています。(全メソッド、JSON文字列を戻り値で返すように作成しています)
メソッド名 | 内容 |
Hello() |
IRISのバージョンと実行時の日付時刻を戻り値で返します。 |
CreateDummyTbl() | テスト実行に使用するTest.Personテーブルの作成とサンプルデータ(2レコード)を作成します。 |
GetPerson() | Test.PersonテーブルのSELECTの結果を返します。 |
CreateDummyGlo() | Pythonからグローバル変数の操作例に使用するサンプルグローバル ^KION を作成します。 |
3. 関数の作成とテスト実行
1.Native API レイヤー用Zipの作成 の手順で作成したレイヤー用Zip:iris_native_lambda.zipと、Pythonスクリプトのサンプルコード:index.py と 接続情報を記載するファイル:connection.config をZipにしたファイル:iris_native_code.zipを利用してAWS Lambda関数を作成します。
Lambda 関数作成とテスト実行の流れついては、開発者コミュニティの記事:PyODBC経由でIRISに接続するAWS Lambda関数を作成するまでの流れ:(6) レイヤーの作成以降をご参照ください。
確認:IRISへの接続情報について
サンプルのpythonスクリプト:index.py では、以下いずれかの方法でIRISに接続できるように記述しています。
- 環境変数を使用する場合
index.pyには、lambda関数作成時に設定する環境変数を利用するように記述しています(19~23行目) 。
なお、環境変数は、Lambda関数登録後、画面で追加/変更できます。
- connection.config を使用する
index.py の10行目と12~16行目のコメントを外し19~23行目をコメント化して利用します。接続するIRISの情報に合わせて connection.config を変更してください。
メモ:Lambda関数に設定する環境変数例は以下の通りです。
テスト実行の引数例
※引数に指定するJSONのプロパティに指定が不要な場合は、"none" を設定してください。
- TestlUtilsクラスのHello()メソッドを実行する場合の引数例
以下のような戻り値が返ります。{ "method": "Hello", "function":"none", "args": "none" }
"{\"message\":\"こんにちは!今の時間は:2023年3月27日 10:16:05です\",\"status\":1,\"payload\":\"IRIS for UNIX (Ubuntu Server 20.04 LTS for x86-64) 2022.1.2 (Build 574U) Fri Jan 13 2023 15:03:40 EST\"}"
- Test.Personテーブルの作成とダミーデータの登録する場合の引数例
(TestlUtilsクラスのCreateDummyTbl()メソッドを実行する場合)
{
"method": "CreateDummyTbl",
"function":"none",
"args": "none"
}
以下の戻り値が返ります。
"{\"Message\":\"登録完了\"}"
- Test.PersonテーブルのSELECTの結果を取得する場合の引数例
(Test.UtilsクラスのGetPetPerson()メソッド実行する場合)
{
"method": "GetPerson",
"function":"none",
"args": "none"
}
以下の戻り値が返ります。
"[{\"Name\":\"山田\",\"Email\":\"taro@mail.com\"},{\"Name\":\"斉藤\",\"Email\":\"saito@mail.com\"}]"
- ^KIONグローバル変数を設定する例
(Test.UtilsクラスのCreateDummyGlo()メソッドを実行する場合の引数例)
{
"method": "CreateDummyGlo",
"function":"none",
"args": "none"
}
以下の戻り値が返ります。
"{\"Message\":\"登録完了\"}"
- index.pyのFunctionを動かす例
(^KION全データ取得する get_globaldata()関数を実行する例)
{
"method":"none",
"function":"getglobal",
"args":"none"
}
以下の戻り値が返ります。
"[[\"久留米\", 14, 19], [\"大阪\", 12, 18], [\"奈良\", 10, 18], [\"愛知\", 13, 15], [\"新潟\", 6, 12], [\"東京\", 14, 19], [\"沖縄\", 21, 26]]"
- index.pyのFunctionを動かす例
(^KIONにデータを追加するset_kiondata()関数を実行する場合の引数例)
{
"method":"none",
"function": "setglobal",
"args": {"area":"長野","min":5,"max":10}
}
正しくデータ登録できたかどうかは、get_globaldata()関数を再度実行すると確認できます。
以下、get_globaldata()関数を再実行した場合の戻り値の例です。
"[[\"久留米\", 14, 19], [\"大阪\", 12, 18], [\"奈良\", 10, 18], [\"愛知\", 13, 15], [\"新潟\", 6, 12], [\"東京\", 14, 19], [\"沖縄\", 21, 26], [\"長野\", 5, 10]]"
4. CloudformationのYAML例
実行の流れについては、「[PyODBC経由でIRISに接続するAWS Lambda関数を作成するまでの流れ]の」3. 1,2の流れをCloudformationで行う例と同様です。