記事
· 2023年4月4日 7m read

PythonからNativeAPIを利用してIRISに接続する AWS Lambda関数を作成するまでの流れ

開発者の皆さん、こんにちは。

Python Native APIを利用すると、IRISにあるグローバル変数の参照/更新をPythonから行えたり、メソッドやルーチンをPythonから実行することができます。

この記事では「AWS Lambda の IRIS Python Native API IRIS」の記事を参考に、NativeAPIを利用してPythonからIRISに接続するAWS Lambda関数を作成する流れで必要となる、レイヤー作成と関数用コードの作成例をご紹介します。

※ 事前にAWSのEC2インスタンス(Ubuntu 20.04を選択)にIRISをインストールした環境を用意した状態からの例でご紹介します。

以下の流れでご紹介します。

  1. Native API レイヤー用Zipの作成
  2. サンプルのクラス定義のインポート
  3. 関数の作成とテスト実行
  4. CloudformationのYAML例

 

例で使用しているコード一式はこちらにあります👉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 *

この流れで作成した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関数登録後、画面で追加/変更できます。

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例

例:cloudformation.yml

実行の流れについては、「[PyODBC経由でIRISに接続するAWS Lambda関数を作成するまでの流れ]の」3. 1,2の流れをCloudformationで行う例と同様です。

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください