クリアフィルター
記事
Hiroshi Sato · 2020年6月30日
1. 初めに
IRISでは、複数ノードでクラスターを構成し、ワークロードのスケールアウト、データボリュームのスケールアウトやトランザクション処理と分析処理を異なるノードで処理するマルチワークロードを実現しています。しかし、クラスターを構成するための設定は、ノード数が増えるにつれ煩雑になり、それらを人手の作業に全て委ねると設定ミス等を招きやすいといえます。また、クラスタの構成を処理負荷の増加に基づいて拡張する、または逆に縮小する、あるいは、データ冗長性を追加するためにミラーリングの構成を追加するなど構成変更は、想定するより多いかもしれません。しかもクラスタ毎に同様の設定を毎回行うとなると、人手による作業では、煩雑性だけでなく俊敏性に欠けると言わざるを得ません。
そこで、IRISには、クラスター構成作業を自動化する新しいツールICM(InterSystems Cloud Manager)が用意されました。
ここでは、ICMを使用したクラウド上でのIRIS構成の自動化の手順について説明します。
2. 事前に準備するもの
以下の作業を行うためには、InterSystemsが用意している2つのDocker Imageを事前に取得する必要があります。
ICMイメージ
IRISイメージ
これらのDockerイメージを取得するには、InterSystemsが運営しているWRC Directというシステムにログインする必要があります。
WRC Directシステムにログインするアカウントは、InterSystems製品のパートナー様やInterSystemsの製品を直接ご購入いただいたエンドユーザー様は取得可能です。
そのアカウントをお持ちでない方は、お手数ですがインターシステムズのカスタマーサポートセンターまでお問い合わせください。
WRC Directにログイン後、InterSystemsタブからSoftware Distributionを選択します。
表示される複数のメニューからContainersを選択します。
InterSystems IRISとInterSystems Cloud Managerを選び、ダウンロードボタンを押します。
IRISとICMのバージョンは合わせてください。
特に条件等なければ、その時点の最新バージョンを選んでください。
アーキテクチャーの所でx64とARMがあるので、間違えないようにしましょう。
3. Dockerイメージの登録
クラウドからicmで指定するDockerイメージを取得できる様にインターネットからアクセスできるレポジトリが必要です。
一番簡便な方法は、Docker Hubに登録することです。
3.1 Docker Hubへの登録
以下はDocker Hubに登録するサンプルです。
イメージの名前は、違う名前でタグ付してください。(hsato0719/icm:2020.1.0.215.0)
docker hubにログインするためには、Dockerのアカウント(ID)が必要です。
アカウントは無償で作成可能です。
WRC Directからダウンロードしたアーカイブファイルを使用して以下のコマンド発行
$ docker load -i icm-2020.1.0.215.0-docker.tar.gz$ docker load -i iris-2020.1.0.215.0-docker.tar.gz$ docker tag intersystems/icm:2020.1.0.215.0 hsato0719/icm:2020.1.0.215.0$ docker tag intersystems/iris:2020.1.0.215.0 hsato0719/iris:2020.1.0.215.0$ docker loginLogin with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.Username: satohiroshi0719Password: Login Succeeded$ docker push hsato0719/icm:2020.1.0.215.0$ docker push hsato0719/iris:2020.1.0.215.0
4. ライセンスキー、クレデンシャル情報のセットアップ
4.1 icm dockerの起動
以下を実行するまえにシステムにDockerがインストールされているか確認してください。(Docker for Windows, Docker fof Mac)
$ docker run --name icm -v /Users/hsato:/myhome -it --cap-add SYS_TIME hsato0719/icm:2020.1.0.215.0
-v で設定しているディレクトリーは、ホストシステム(WindowsやMac)とDockerの間でファイルを交換したい場合に設定します。
4.2 クレデンシャル情報の生成
以下のコマンドを実行します。
$ ICM/bin/keygenSSH.sh$ ICM/bin/keygenTLS.sh
4.3 ライセンスキーのコピー
ライセンスキーはUNIXフォーマット(Windowsフォーマットだとicm runの時にコピーが永遠に終わらない状態になる)で作成してください。
評価用ライセンスは、 サポート契約のあるエンドユーザー、パートナー様であれば、製品評価ポータル(https://evaluation.InterSystems.com)から取得できます。(WRC Directアカウントでログイン)
以下のコマンドを実行します。
$ cd /Samples$ mkdir license$ cd license$ cp /myhome/license/ubuntu-sharding-iris.key .
(/myhome/licenseにubuntu-sharding-iris.keyを事前に置きます。)
5. defaults.jsonとdefinitions.jsonの編集
ICMの設定の中心となるdefaults.jsonとdefinitions.jsonの編集を行います。
defaults.jsonの内容は、サポートしているすべてのクラウドで共通な部分とクラウド固有な部分があります。
5.1 defaults.json
以下のサンプルは、AWS用の設定です。
/Samples # cat AWS/defaults.json{ "Provider": "AWS", "Label": "Sato", "Tag": "TEST", "DataVolumeSize": "10", "SSHUser": "ubuntu", "SSHPublicKey": "/Samples/ssh/insecure-ssh2.pub", "SSHPrivateKey": "/Samples/ssh/insecure", "DockerImage": "hsato0719/iris:2020.1.0.215.0", "DockerUsername": "", "DockerPassword": "", "TLSKeyDir": "/Samples/tls/", "LicenseDir": "/Samples/license/", "Region": "ap-northeast-1", "Zone": "ap-northeast-1a", "DockerVersion": "5:19.03.5~3-0~ubuntu-bionic", "AMI": "ami-0278fe6949f6b1a06", "InstanceType": "m4.large", "Credentials": "/Samples/AWS/sample.credentials", "Mirror": "false", "UserCPF": "/Samples/cpf/iris.cpf"}
Label,Tagは適当にご自分専用の名前を使用してください。
DataVolumeSizeも用途に応じてサイズを調整してください。
SSHUserはAWSのubuntuの場合、ubuntuで固定です。
SSHPublicKeyとSSHPrivateKeyは4.2で生成したキーファイルをそのまま使用します。
DockerImageは3.1でDocker Hubに登録したタグ名を指定します。
InstanceTypeは用途に応じてタイプを選択してください。
それ以外は、そのままの値でOKです。
以下のサンプルは、Azure用の設定です。
/Samples # cat Azure/defaults.json{ "Provider": "Azure", "Label": "Hiroshi", "Tag": "TEST", "DataVolumeSize": "50", "SSHUser": "ubuntu", "SSHPublicKey": "/Samples/ssh/insecure-ssh2.pub", "SSHPrivateKey": "/Samples/ssh/insecure", "DockerImage": "hsato0719/iris:2020.1.0.215.0", "DockerUsername": "", "DockerPassword": "", "TLSKeyDir": "/Samples/tls/", "LicenseDir": "/Samples/license/", "Location": "Japaneast", "Zone": "1", "PublisherName": "Shardtest", "Offer": "UbuntuServer", "Sku": "18.04-LTS", "Version": "18.04.201909030", "DockerVersion": "18.06.1~ce~3-0~ubuntu", "Size": "Standard_DS3_v2", "AccountTier": "Premium", "AccountReplicationType": "LRS", "SubscriptionId": "xxxxxxxx", "ClientId": "xxxxxxxxxxx", "ClientSecret": "xxxxxxxxxxx", "TenantId": "xxxxxxxxxxxxx", "Mirror": "false", "UserCPF": "/Samples/cpf/iris.cpf"}
変更する部分は、AWS用とほぼ同様です。LabelとTagは適当に変更してください。
以下の設定は、6.2のクラウド個別設定の所を参照してください。
SubscriptionId
ClientId
ClientSecret
TenantId
Definitions.jonは基本的にクラウド固有の情報はありません。
以下の設定では、2ノードのシャードデータクラスターを構成しています。
5.2 definitions.json
/Samples # cat Azure/definitions.json[ { "Role": "DATA", "Count": "2", "LicenseKey": "ubuntu-sharding-iris.key" }]
6. クラウド個別設定
6.1 sample.credentials (for AWS)
AWSコンソールから右上のマイアカウント(自分の登録したメールアドレス)の所をクリック
表示されるメニューからマイセキュリティ資格情報をクリック
アクセスキー (アクセスキー ID とシークレットアクセスキー)の左側の三角をクリック
新しいアクセスキーの生成ボタンを押す
ダウンロードcsvファイルを選んでクリック
生成されたファイルを以下の形式に変換(XXXXの部分はそのまま)し、sample.credentialsという名前にする
[default]aws_access_key_id = XXXXaws_secret_access_key = XXXX
そのsamle.credentialsをicm docker内の/Samples/AWSにコピーする
$ cd /Samples/AWS$ cp /myhome/sample.credentials .
そのdefaults.jsonとdefinitions.jsonをicm docker内の/Samples/AWSにコピーする
$ cd /Samples/AWS$ cp /myhome/defaults.json .$ cp /myhome/definitions.json .
6.2 Azure
subscriptionid Azureホームから移動の所のサブスクリプションをクリック
サブスクリプションID
tenant-id AzureホームからAzureサービスのAzure Active Directoryをクリック
既定のディレクトリーの所のテナントID
左のメニューからアプリの登録を選び、+新規登録を押す
アプリケーションの名前 入力
サポートされているアカウントの種類
この組織ディレクトリのみに含まれるアカウント
リダイレクトURLWeb https://intersystems.com
登録ボタンを押す
表示されるアプリケーションIDがクライアントID左のメニューから証明書とシークレットを選択
新しいクライアントシークレットを押す
左のメニューからAPIのアクセス許可をクリック
+ 右のペインからアクセス許可の追加ボタンを押す右側からAzure Service Managementをクリック
Access Azure Service Management as organization userを選択
アクセス許可の追加ボタンを押す
Azure トップからサブスクリプションを選択
左側のメニューからアクセス制御IAMをクリック
ロールの割り当てを追加するの追加ボタンを押す
役割 所有者
アクセスの割り当て先 Azure ADのユーザー、グループ、サービスプリンシパル
選択 先ほど作ったアプリケーションの名前
保存ボタンを押す
そのdefaults.jsonとdefinitions.jsonをicm docker内の/Samples/AZureにコピーする
$ cd /Samples/AZure$ cp /myhome/defaults.json .$ cp /myhome/definitions.json .
7. プロビジョニング
6.で設定した構成情報に基づいて、クラウド上で必要なリソースの割り当てや基本的な設定等を実施します。
icm provisionコマンドでそれを実行します。
以下、Azureでの例を示します。
$ cd /Samples/AWS/Samples/Azure # icm provisionStarting init of Sato-ICM......completed init of Sato-ICMStarting plan of Sato-ICM......completed plan of Sato-ICMStarting refresh of Sato-ICM......completed refresh of Sato-ICMStarting apply of Sato-ICM...Elapsed time for apply on Sato-ICM: 15s...Elapsed time for apply on Sato-ICM: 30s......completed apply of Sato-ICMStarting init of Sato-DATA-ICM......completed init of Sato-DATA-ICMStarting plan of Sato-DATA-ICM......completed plan of Sato-DATA-ICMStarting refresh of Sato-DATA-ICM......completed refresh of Sato-DATA-ICMStarting apply of Sato-DATA-ICM...Elapsed time for apply on Sato-DATA-ICM: 15s...Elapsed time for apply on Sato-DATA-ICM: 30s...Elapsed time for apply on Sato-DATA-ICM: 45s...Elapsed time for apply on Sato-DATA-ICM: 60s...Elapsed time for apply on Sato-DATA-ICM: 75s...Elapsed time for apply on Sato-DATA-ICM: 90s...Elapsed time for apply on Sato-DATA-ICM: 105s...Elapsed time for apply on Sato-DATA-ICM: 120s......completed apply of Sato-DATA-ICMCopying files to Sato-DATA-ICM-0002...Copying files to Sato-DATA-ICM-0001......copied files to Sato-DATA-ICM-0001Configuring Sato-DATA-ICM-0001......copied files to Sato-DATA-ICM-0002Configuring Sato-DATA-ICM-0002......configured Sato-DATA-ICM-0001Copying more files to Sato-DATA-ICM-0001......configured Sato-DATA-ICM-0002Copying more files to Sato-DATA-ICM-0002......copied more files to Sato-DATA-ICM-0001Mounting volumes on Sato-DATA-ICM-0001......copied more files to Sato-DATA-ICM-0002Mounting volumes on Sato-DATA-ICM-0002......mounted volumes on Sato-DATA-ICM-0001Installing Docker on Sato-DATA-ICM-0001......mounted volumes on Sato-DATA-ICM-0002Installing Docker on Sato-DATA-ICM-0002...Elapsed time for provision on Sato-DATA-ICM-0001: 15s...Elapsed time for provision on Sato-DATA-ICM-0002: 15s...Elapsed time for provision on Sato-DATA-ICM-0001: 30s...Elapsed time for provision on Sato-DATA-ICM-0002: 30s...Elapsed time for provision on Sato-DATA-ICM-0001: 45s...Elapsed time for provision on Sato-DATA-ICM-0002: 45s...Elapsed time for provision on Sato-DATA-ICM-0001: 60s...Elapsed time for provision on Sato-DATA-ICM-0002: 60s......installed Docker on Sato-DATA-ICM-0001Determining host OS of Sato-DATA-ICM-0001......installed Docker on Sato-DATA-ICM-0002Determining host OS of Sato-DATA-ICM-0002......determined host OS of Sato-DATA-ICM-0001Determining local IP address of Sato-DATA-ICM-0001......determined host OS of Sato-DATA-ICM-0002Determining local IP address of Sato-DATA-ICM-0002......determined local IP address of Sato-DATA-ICM-0001...determined local IP address of Sato-DATA-ICM-0002Installing Weave Net on Sato-DATA-ICM-0001...Installing Weave Net on Sato-DATA-ICM-0002...Elapsed time for weave on Sato-DATA-ICM-0001: 15s...Elapsed time for weave on Sato-DATA-ICM-0002: 15s......installed Weave Net on Sato-DATA-ICM-0002Collecting Weave info for Sato-DATA-ICM-0002......installed Weave Net on Sato-DATA-ICM-0001Collecting Weave info for Sato-DATA-ICM-0001......collected Weave info for Sato-DATA-ICM-0002...collected Weave info for Sato-DATA-ICM-0001Machine IP Address DNS Name Provider Region Zone------- ---------- -------- -------- ------ ----Sato-DATA-ICM-0001 52.185.190.176 satodataicm1.japaneast.cloudapp.azure.co Azure Japaneast 1 Sato-DATA-ICM-0002 52.185.190.169 satodataicm2.japaneast.cloudapp.azure.co Azure Japaneast 1 To destroy: icm unprovision -stateDir state [-cleanUp] [-force]
8. Deploy
7.でプロビジョニングされた構成で、実際のシステムをデプロイしてみます。
/Samples/Azure # icm runEnter desired InterSystems IRIS password: --- 構成するIRISのシステムパスワードを聞かれるので、ここで入力し、設定します。Enter password again: --- 同じパスワードを入力します。Pulling image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0001 ...Pulling image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0002 ...Elapsed time for pull on Sato-DATA-ICM-0001: 15s...Elapsed time for pull on Sato-DATA-ICM-0002: 15s......pulled image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0002...pulled image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0001Stopping container iris on Sato-DATA-ICM-0001...Stopping container iris on Sato-DATA-ICM-0002......completed stop of container iris on Sato-DATA-ICM-0001...completed stop of container iris on Sato-DATA-ICM-0002Removing container iris on Sato-DATA-ICM-0001...Removing container iris on Sato-DATA-ICM-0002......removed container iris on Sato-DATA-ICM-0001...removed container iris on Sato-DATA-ICM-0002Inspecting docker image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0001...Inspecting docker image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0002......inspected docker image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0001...inspected docker image hsato0719/iris:2020.1.0.215.0 on Sato-DATA-ICM-0002Creating container iris on Sato-DATA-ICM-0001...Creating container iris on Sato-DATA-ICM-0002......created container iris on Sato-DATA-ICM-0001...created container iris on Sato-DATA-ICM-0002Copying license directory /Samples/license/ to Sato-DATA-ICM-0001...Copying CPF deltas to Sato-DATA-ICM-0002......copied license directory /Samples/license/ to Sato-DATA-ICM-0001Copying CPF deltas to Sato-DATA-ICM-0001......copied CPF deltas to Sato-DATA-ICM-0002...copied CPF deltas to Sato-DATA-ICM-0001Starting container iris on Sato-DATA-ICM-0001...Starting container iris on Sato-DATA-ICM-0002......completed start of container iris on Sato-DATA-ICM-0001...completed start of container iris on Sato-DATA-ICM-0002Waiting for InterSystems IRIS to start on Sato-DATA-ICM-0001...Waiting for InterSystems IRIS to start on Sato-DATA-ICM-0002...Elapsed time for wait_started on Sato-DATA-ICM-0001: 15s...Elapsed time for wait_started on Sato-DATA-ICM-0002: 15s......InterSystems IRIS started on Sato-DATA-ICM-0001Elapsed time for wait_started on Sato-DATA-ICM-0002: 30s......InterSystems IRIS started on Sato-DATA-ICM-0002Getting ICM state from Sato-DATA-ICM-0001...Getting ICM state from Sato-DATA-ICM-0002......got ICM state from Sato-DATA-ICM-0001...got ICM state from Sato-DATA-ICM-0002Configuring Web Gateway on Sato-DATA-ICM-0001...Configuring Web Gateway on Sato-DATA-ICM-0002......configured Web Gateway on Sato-DATA-ICM-0002...configured Web Gateway on Sato-DATA-ICM-0001Configuring ODBC on Sato-DATA-ICM-0001...Configuring ODBC on Sato-DATA-ICM-0002......configured ODBC on Sato-DATA-ICM-0002...configured ODBC on Sato-DATA-ICM-0001Configuring JDBC on Sato-DATA-ICM-0001...Configuring JDBC on Sato-DATA-ICM-0002......configured JDBC on Sato-DATA-ICM-0001...configured JDBC on Sato-DATA-ICM-0002Configuring ECP on Sato-DATA-ICM-0002...Configuring ECP on Sato-DATA-ICM-0001......configured ECP on Sato-DATA-ICM-0002...configured ECP on Sato-DATA-ICM-0001Changing WebGateway password on Sato-DATA-ICM-0001...Changing WebGateway password on Sato-DATA-ICM-0002......changed WebGateway password on Sato-DATA-ICM-0002...changed WebGateway password on Sato-DATA-ICM-0001Validating license on Sato-DATA-ICM-0001...Acquiring license on Sato-DATA-ICM-0002......acquired license on Sato-DATA-ICM-0002...validated license on Sato-DATA-ICM-0001Acquiring license on Sato-DATA-ICM-0001......acquired license on Sato-DATA-ICM-0001Enable sharding on Sato-DATA-ICM-0001...Enable sharding on Sato-DATA-ICM-0002......enabled sharding on Sato-DATA-ICM-0002...enabled sharding on Sato-DATA-ICM-0001Initializing shard Sato-DATA-ICM-0001......initialized shard Sato-DATA-ICM-0001Attaching shard Sato-DATA-ICM-0002 as data node.......attached shard Sato-DATA-ICM-0002 as data nodeSetting shard options on Sato-DATA-ICM-0002......set shard options on Sato-DATA-ICM-0002Setting shard options on Sato-DATA-ICM-0001......set shard options on Sato-DATA-ICM-0001Verifying shards on Sato-DATA-ICM-0001......verified shards on Sato-DATA-ICM-0001Setting ICM state on Sato-DATA-ICM-0001...Setting ICM state on Sato-DATA-ICM-0002......set ICM state on Sato-DATA-ICM-0001...set ICM state on Sato-DATA-ICM-0002-> Management Portal available at: http://satodataicm1.japaneast.cloudapp.azure.com:52773/csp/sys/UtilHome.csp
最後のurlをブラウザで指定して管理ポータルにログインできます。ユーザー名: _systemパスワード: icm deployで指定したパスワード
9. test
icmを使った動作確認のためのサンプルを以下に示します。
$ icm ps -container iris$ icm exec -command "df -k" -machine Sato-DATA-ICM-0001$ icm session -interactive -machine Sato-DATA-ICM-0001 -namespace USER$ icm scp -localPath local-path [-remotePath remote-path]$ icm sql -command "create table order (orderid varchar(20), primary key (orderid), shard)" -role DATA$ icm sql -command "create table lineitem (product varchar(20), orderid varchar(20), quantity integer, shard)" -role DATA$ icm sql -command "create table product (name varchar(20), price number(7,2))" -role DATA$ icm sql -command "create table product (name varchar(20), price number(7,2))" -role DATA$ icm sql -command "insert into product values ('hammer',9.95)" -role DATA$ icm sql -command "insert into product values ('nail',0.02)" -role DATA$ icm sql -command "insert into product values ('pliers',8.95)" -role DATA$ icm sql -command "insert into product values ('screw',0.05)" -role DATA$ icm sql -command "insert into product values ('screwdriver',7.95)" -role DATA$ icm sql -command "insert into product values ('saw',12.95)" -role DATA$ icm sql -command "insert into order values ('A-001')" -role DATA$ icm sql -command "insert into order values ('A-002')" -role DATA$ icm sql -command "insert into order values ('B-001')" -role DATA$ icm sql -command "insert into order values ('B-002')" -role DATA$ icm sql -command "insert into order values ('B-003')" -role DATA$ icm sql -command "insert into order values ('B-004')" -role DATA$ icm sql -command "insert into order values ('B-005')" -role DATA$ icm sql -command "insert into lineitem values ('hammer','A-001',1)" -role DATA$ icm sql -command "insert into lineitem values ('nail','A-001',1000)" -role DATA$ icm sql -command "insert into lineitem values ('pliers','A-002',1)" -role DATA$ icm sql -command "insert into lineitem values ('screwdriver','B-001',1)" -role DATA$ icm sql -command "insert into lineitem values ('screw','B-001',500)" -role DATA$ icm sql -command "insert into lineitem values ('screwdriver','B-002',2)" -role DATA$ icm sql -command "insert into lineitem values ('pliers','B-002',1)" -role DATA$ icm sql -command "insert into lineitem values ('screw','B-002',1500)" -role DATA$ icm sql -command "insert into lineitem values ('saw','B-003',1)" -role DATA$ icm sql -command "insert into lineitem values ('saw','B-004',1)" -role DATA$ icm sql -command "insert into lineitem values ('pliers','B-004',1)" -role DATA$ icm sql -command "insert into lineitem values ('pliers','B-005',2)" -role DATA$ icm sql -command "select avg(quantity) from lineitem" -role DATA$ icm sql -command "select %id, * from order" -role DATA$ icm sql -command "select %id, * from lineitem" -role DATA$ icm sql -command "select order.orderid, product, quantity from order, lineitem where order.orderid=lineitem.orderid order by 1" -role DATA$ icm sql -command "select orderid, sum(price*quantity) from lineitem, product where lineitem.product=product.name group by orderid" -role DATA$ icm sql -command "select orderid, sum(price*quantity) from lineitem, product where lineitem.product=product.name group by orderid" -machine Sato-DATA-TEST-0001$ icm sql -command "select orderid, sum(price*quantity) from lineitem, product where lineitem.product=product.name group by orderid" -machine Sato-DATA-TEST-0002
10. cleanUp
これを忘れるとクラウド課金し続けるので注意
icm unprovision -cleanUp -force
記事
Toshihiko Minamoto · 2023年6月14日
# オンラインコース「[Hands-On with InterSystems API Manager for Developers](https://learning.intersystems.com/course/view.php?id=1747)」のフィードバック
Docker コンテナと REST API の基本的な知識で、InterSystems API Manager による API とマイクロサービスの制御に挑戦したいと思い、 ホストにローカルの IRIS インスタンス(Windows OS)を使用し、Linux VM で IAM (ゲスト)を実行するこのオンラインコースを実行してみました。
まず InterSystems API Manger(IAM)を紹介してから、ローカル環境をセットアップするための手順を説明し、最後にコースの各章の内容を確認しましょう。
# はじめに
今日では、API トラフィックの管理、監視、および保護が UI ポータルに集約される 簡単なデプロイのメリットを生かして、API を管理することが非常に重要となっています。
InterSystems API Manger(IAM)は、IRIS アプリケーションが消費し公開する API とマイクロサービスを制御します。 下流と上流のシステムの間の API ゲートウェイであり、どの API がどれくらいの頻度で誰に呼び出されたのかを視覚的に追跡する方法も備わっています。
IAM を使用するメリット:
* HTTP ベースの API の監視
* トラフィックの制御
* セキュリティメカニズムによる API の保護
* 新しいオンボーディング開発者にとっての使いやすさ
# IAM のセットアップ
IAM のセットアップを開始する前にインストールしたもの
* Windows(IRIS インスタンスをインストール)
* Linux VM(Docker をインストール)
InterSystems IRIS インスタンスで IAM を使用できるようにします。
1. IRIS インスタンスの管理ポータルを開き、IAM を有効にします。
1. 1. 管理ポータルで、[システム管理]>[セキュリティ]>[ユーザー]を選択し、IAM ユーザーを選択します。
2. [パスワード]ラジオボタンをオンにします。
3. IAM ユーザーのパスワードを入力し、確認します。
4. [ユーザーを有効化済み]チェックボックスをオンにします。
5. [保存]を選択します。
2. IAM Web アプリケーションを有効にします(IRIS ライセンスに「API Management」が指定されていることを確認してください)。
1. 1. 管理ポータルで、[システム管理]>[セキュリティ]>[アプリケーション]>[Web アプリケーション]を選択し、"**/api/iam**" を選択します。
2. [アプリケーションを有効にする]チェックボックスをオンにします。
3. [保存]を選択します。
IAM インストールファイルをダウンロードして解凍します。
1. Linux 環境内の WRC から IAM インストールキットをダウンロードします。
2. tar ファイルを解凍します(**iam-image.tar** は IAM Docker イメージであるため、解凍しないでください)。


IAM のセットアップと起動
このステップでは、**ROOT** ユーザーを使用しました。Linux ユーザーで sudo を使用すると、「Cannot load the Manager Potal properly(Manager Portal を正しく読み込めません)」というエラーが発生するか、セットアップスクリプトが環境変数値を docker-compose.yaml ファイルに渡せなかったためです。 後者の場合、"**sudo -E**" を使って環境変数を渡すと回避できました。
1. IAM アーカイブを解凍したディクショナリで "**docker load -i iam_image.tar**" コマンドを実行してターミナルを開きます。
2. 現在のディレクトリで "**source ./scripts/iam-setup.sh**" を実行するか、scripts フォルダで "**source ./iam-setup.sh**" を実行します。
1. の正確な IAM イメージ名とリポジトリ名を入力します。例: intersystems/iam:3.0.2.0-2(このステップは必須です。これを実行しない場合、"docker compose" を行ったときにリポジトリの認証に失敗したというエラーメッセージが表示されます。)
2. ホストマシンの正確な IP アドレスを入力します(IPV4 の仕様は Windows の設定で確認できます。localhost や 127.0.0.1 を入力しないでください)。
3. Windows OS の IRIS インスタンスのポート番号を入力します(例: 52773)。
4. IAM ユーザーのパスワードを 2 回入力します。
3. scripts ディレクトリ内で、"**iam-test.sh**" を実行して、接続をテストしてください。
4. scripts ディレクトリ内で、"**docker compose up -d**" を実行して IAM を起動します。
5. 次のアドレスにアクセスし、Linux の IAM ポータルを起動します:
VM を使ってホストアドレスを ping できない場合は、Windows ファイアウォールの詳細設定にある[受信の規則]を確認してください。 [**ファイルとプリンタの共有(エコー要求 - ICMPv4-In)プロファイル: プライベート、パブリック**]を有効にします。

IAM のテスト
インストールキットの scripts ディレクトリ内に **iam-test.sh** というスクリプトがあります。
".**/iam-test.sh**" と入力して実行し、IAM と IRIS インスタンス間の接続のテストを開始します。
**注意**: テスト結果に「**サービスを作成中にエラーが発生しました。 HTTP ステータスコード:000 またはサービス作成中のエラー。 HTTP ステータスコード:409**」が表示された場合は、Docker のステータスを確認してください。健全であるにも関わらず、動作しない場合は、コンテナをシャットダウンし、もう一度 docker compose を実行してください。私の経験では、VM を一時停止すると、これが発生することがあります。

詳細については、こちらの IAM セットアップドキュメントをご覧ください: [https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=CIAM3.0\_install#CIAM3.0\_install_setupIAM](https://docs.intersystems.com/components/csp/docbook/DocBook.UI.Page.cls?KEY=CIAM3.0_install#CIAM3.0_install_setupIAM)
ハンズオン演習:
# コースの各章
この演習の後に 3 つの章を完了したので、その内容を共有したいと思います。
* サービスのセットアップ
* ルートのセットアップ
* コンシューマーとプラグインの設定
IAM を使用し始める前、この演習では GET メソッドを使って REST リクエストを行うことが求められていました。この HTTP リクエストはクライアントサーバーからのもので、IRIS インスタンスにビルドされた Web アプリケーションを直接エンドポイントとしてポイントしています。
次のステップでは、API リクエストが転送されるサービスと着信リクエストを分析して最適な API に割り当てるルートのセットアップ方法が説明されていました。
サービスとルーターのセットアップ
サービスとは?
サービスは、API Manager を InterSystems IRIS に接続するように構成されます。そのため通常は、InterSystems IRIS 内の REST サービスまたは Web アプリケーションごとに、サービスは 1 つです。 たとえば、ベースパスが /rest/coffeemakerapp の Web アプリケーションがある場合、この URL に対し、API Manager 内で 1 つのサービスを構成します。 サービスは通常、ルートの前に定義されます。
ルートとは?
ルートは、**クライアントアプリケーション**が InterSystems API Manger に対して呼び出すものを定義します。 インターフェースを使用すると、定義されたサービスからそれに対応するルートが簡単に作成されるようになっているため、通常は、ルートの前にサービスを定義します。 ルートは一般に、InterSystems IRIS 内のパスを単純化したものです。 次の例では、 /test、/coffeemakers、/coffeemaker、および /newcoffeemaker のルートを作成します。 ルートが具体的であるほど、メトリックの表示と特定のルートへのプラグインの追加において、API Manager 内で API をより細かく制御できます。

サービスを作成する:
1. IAM 管理ポータルに移動し、[サービス]タブを選択します。
2. [新しいサービス]をクリックして名前を付けます。
3. [URL を使用して追加]を選択します。
4. Web アプリケーションに指定した正確な URL パスを[ベース URL]に指定し、インスタンスの IP アドレスが正しいことを再確認します(localhost または 127.0.0.1 を使用しないでください)。

ルートを作成する:
1. サービスの要約まで下にスクロールし、[ルートを追加]をクリックしアンス。
2. [名前]、[プロトコル」、[パス]を指定します。
3. [サービス]フィールドに、サービスの詳細が自動的に生成されます。
4. この演習では、[詳細]フィールドの[パスをストリップ]をオフにするように求められました。オンである場合、InterSystems IRIS にリクエストを送信する際に、InterSystems IRIS エンドポイントに接続するために重要となるパスが削除されてしまいます。

サービスとルートが作成されたら、Postman などの REST クライアントを使用して、直接 IAM にリクエストを送信し、「200 ok」のレスポンスを受信することができます。例: GET (/test は作成されたルートです。)
注意: 私の場合、HTTP リクエストの URL は Linux VM の IP アドレスと一致していますが、この IP アドレスは[設定]> [ネットワーク]で確認するか、ターミナルで "ifconfig" コマンドを実行して調べてください。

IAM 管理ポータルを開いてリクエストを確認すると、すべての coffeemakers が REST クライアントから IAM に正しく記録されているのがわかります。
HTTP リクエストを直接 IRIS Web アプリケーションに送信するのではなく、基本的な CRUD リクエストであっても、IAM を使用すると、視覚的な表現によって API を制御し、エンドポイントのセキュリティを維持することができます。

プラグインの使用
IAM を使用するメリットの 1 つに、スロットリングに役立つレート制限プラグイン、ACL プラグイン、OAuth2.0 プラグインなど、多数のプラグインの存在が挙げられます。 個人的なケースとして、basic-auth の有効化とコンシューマーの作成における体験を紹介します。
basic-auth プラグインを有効にする
1. IAM 管理ポータルに移動し、[プラグイン]タブを選択します。
2. [新しいプラグイン]>[基本認証]>[作成]をクリックします。

Basic Auth に必要な IRIS ユーザーを作成する
1. IRIS 管理ポータルを開きます。
2. [システム管理]>[セキュリティ]>[ユーザー]>[新規ユーザーの作成]に移動します。
3. ユーザーの名前とパスワードを設定します。
4. 他は空のままにして、[保存]をクリックします。私の場合は "CoffeeManager" というユーザーを作成しました。

コンシューマーを作成して、資格情報をセットアップする
1. IAM 管理ポータルに移動し、[コンシューマー]タブを選択します。
2. [新しいコンシューマー]をクリックし、[ユーザー名]に「CoffeeManger」(私の場合)と入力して、[作成]をクリックします。
3. CoffeeManager 情報ページ >[資格情報]>[新しい Basic Auth 資格情報]に移動します。
4. IRIS インスタンスで作成したユーザー資格情報を使用し、保存します。


これで、basic-auth プラグインを機能させるための要件がすべて揃いました。
前のステップで作成した "CoffeeManager" の資格情報で Basic Auth を使って、HTTP リクエストを送信します。

CoffeeManager 情報ページ >[アクティビティ]に移動すると、リクエストが成功したことが記録されていることを確認できます。

# まとめ
まとめると、InterSystems API Manager(IAM)とは何か、またそのメリットを最初に紹介しました。 続いて、Linux VM で IAM をセットアップする方法と基本機能を実装して IAM を使用する方法を示し、サービスとルートの作成、プラグインとコンシューマーの有効化を行いました。
ご質問やコメントがございましたら、お気軽にご連絡ください。
IAM をお楽しみください!
記事
Toshihiko Minamoto · 2021年4月5日
## はじめに
Webで行われるサーバーとクライアント間のほとんどの通信は、リクエストとレスポンスの構造に基づいており、 クライアントがサーバーにリクエストを送信すると、サーバーがそのリクエストに対するレスポンスを送信します。 WebSocketプロトコルは、サーバーとクライアント間の双方向通信チャンネルを提供するプロトコルで、サーバーがリクエストを受信しなくても、クライアントにメッセージを送信することができます。 WebSocketプロトコルと、InterSystems IRISでの実装についての詳細は、以下のリンクをご覧ください。
* [WebSocketプロトコル](https://tools.ietf.org/html/rfc6455)
* [InterSystems IRISでのWebSocketsに関するドキュメント](https://docs.intersystems.com/irislatestj/csp/docbook/DocBook.UI.Page.cls?KEY=GCGI_websockets)
このチュートリアルは、「[非同期WebSocket -- クイックチュートリアル](https://community.intersystems.com/post/asynchronous-websockets-quick-tutorial)」を、Caché 2016.2以上とInterSystems IRIS 2018.1以上向けに更新したものです。
#### *非同期動作と同期動作*
InterSystems IRISでは、WebSocket接続を同期的または非同期的に実装することができます。 クライアントとサーバー間のWebSocket接続がどのように動作するかは、%CSP.WebSocketクラスの「SharedConnection」プロパティによって決まります。
* SharedConnection=1: 非同期動作
* SharedConnection=0: 同期動作
クライアントとInterSystems IRISインスタンスがホスティングされているサーバーとの間のWebSocket接続には、IRISインスタンスとWebゲートウェイとの間のコネクションが含まれます。 WebSocketの同期動作では、そのコネクションはプライベートチャンネルが使用されますが、 非同期動作では、複数のWebSocketクライアントで、IRISインスタンスとWebゲートウェイとの間のコネクションが共有されます。 WebSocketの非同期動作は、各クライアントを処理するWebゲートウェイとIRISインスタンス間のコネクションを排他的に行う必要がないため、同一のサーバーに多数のクライアントが接続する場合に、そのメリットを発揮します。
このチュートリアルでは、WebSocketの非同期動作を行います。 したがって、開いているすべてのチャットウィンドウは、Webゲートウェイと、WebSocketサーバークラスをホストするIRISインスタンス間のコネクションを共有することになります。
## チャットアプリケーションの概要
WebSocketの「hello world」は、ユーザーがそのアプリケーションにログインしているすべてのユーザーにブロードキャストされるメッセージを送信できるチャットアプリケーションです。 このチュートリアルでは、チャットアプリケーションには次のコンポーネントが含まれます。
* サーバー: %CSP.WebSocketを継承したクラスに実装されています。
* クライアント: CSPページで実装されています。
このチャットアプリケーションの実装では、次の内容を実現します。
* ユーザーは、開いているすべてのチャットウィンドウにメッセージをブロードキャストできます。
* オンラインユーザーは、開いているすべてのチャットウィンドウの「オンラインユーザー」リストに表示されます。
* ユーザーは、「alias」キーワードで始まるメッセージを作成することで、ユーザー名を変更できます。このメッセージはブロードキャストされませんが、「オンラインユーザー」リストの内容を更新します。
* ユーザーがチャットウィンドウを閉じると、「オンラインユーザー」リストから削除されます。
チャットアプリケーションのソースコードについては、こちらの[GitHubリポジトリ](https://github.com/intersystems/InterSystems-WebSockets)をご覧ください。
## クライアント
チャットアプリケーションのクライアント側は、チャットウィンドウのスタイル定義、WebSocket接続の宣言、サーバー間との通信を処理するWebSocketのイベントとメソッド、およびサーバーに送信されるメッセージをパッケージ化し、受信メッセージを処理するヘルパー関数を含むCSPページによって実装されます。
まず、アプリケーションが、JavaScript WebSocketライブラリを使用して、WebSocket接続をどのように初期化するのか確認しましょう。
```javascript
ws = new WebSocket(((window.location.protocol === "https:")? "wss:":"ws:")
+ "//"+ window.location.host + "/csp/user/Chat.Server.cls");
```
`new` は、WebSocketクラスの新しいインスタンスを作成します。 これにより、「wss」(WebSocket通信チャンネルにTLSを使用することを示します)または「ws」プロトコルを使って、サーバーにWebSocket接続が開きます。 サーバーは、`Chat.Server` クラスを定義するウェブサーバーのポート番号とインスタンスのホスト名で指定されてます(この情報は `window.location.host` 変数に格納されます)。 サーバークラスの名前(`Chat.Server.cls`)は、サーバー上のリソースのGETリクエストとして、WebSocketの開始URIに含まれます。
WebSocket接続の確立に成功すると `ws.onopen` イベントが発生し、**_接続中_**から**_接続_**に状態が移行します。
```javascript
ws.onopen = function(event){
document.getElementById("headline").innerHTML = "CHAT - CONNECTED";
};
```
このイベントにより、チャットウィンドウの見出しが変更され、クライアントとサーバーが接続されていることが示されるようになります。
### *メッセージの送信*
ユーザーがメッセージを送信するアクションによって、`send` 関数がトリガーされます。 この関数は `ws.send` メソッドを囲むラッパーとして機能し、クライアントのメッセージをWebSocket接続を介してサーバーに送信する仕組みが含まれます。
```javascript
function send() {
var line=$("#inputline").val();
if (line.substr(0,5)=="alias"){
alias=line.split(" ")[1];
if (alias==""){
alias="default";
}
var data = {}
data.User = alias
ws.send(JSON.stringify(data));
} else {
var msg=btoa(line);
var data={};
data.Message=msg;
data.Author=alias;
if (ws && msg!="") {
ws.send(JSON.stringify(data));
}
}
$("#inputline").val("");
}
```
`send` は、サーバーに送信される情報(エイリアスの更新または一般的なメッセージ)をJSONオブジェクトにパッケージ化し、送信される情報の種類に応じたキー/値ペアを定義します。 `btoa` は、一般メッセージの内容を、base-64でエンコードされたASCII文字列に変換します。
### *メッセージの受信*
クライアントがサーバーからメッセージを受信すると、`ws.onmessage` イベントがトリガーされます。
```javascript
ws.onmessage = function(event) {
var d=JSON.parse(event.data);
if (d.Type=="Chat") {
$("#chat").append(wrapmessage(d));
$("#chatdiv").animate({ scrollTop: $('#chatdiv').prop("scrollHeight")}, 1000);
} else if(d.Type=="userlist") {
var ul = document.getElementById("userlist");
while(ul.firstChild){ul.removeChild(ul.firstChild)};
$("#userlist").append(wrapuser(d.Users));
} else if(d.Type=="Status"){
document.getElementById("headline").innerHTML = "CHAT - connected - "+d.WSID;
}
};
```
クライアントが受信するメッセージの種類(「チャット」、「ユーザーリスト」、「ステータス」)に応じて、`onmessage` イベントによって、`wrapmessage` または `wrapuser` が呼び出され、チャットウィンドウの該当するセクションに受信データを取り込みます。 受信メッセージがステータス更新であれば、チャットウィンドウのステータスの見出しがWebSocket IDで更新されます。このIDは、チャットウィンドウに関連付けられた双方向WebSocket接続を識別するものです。
### *その他のクライアントコンポーネント*
クライアントとサーバー間の通信でエラーが発生すると、WebSocketの `onerror` メソッドがトリガーされ、エラーの発生を通知するアラートの発行とページのステータス見出しの更新が行われます。
```javascript
ws.onerror = function(event) {
document.GetElementById("headline").innerHTML = "CHAT - error";
alert("Received error");
};
```
クライアントとサーバー間のWebSocket接続が閉じると、`onclose` メソッドがトリガーされ、ステータスの見出しが更新されます。
```javascript
ws.onclose = function(event) {
ws = null;
document.getElementById("headline").innerHTML = "CHAT - disconnected";
}
```
## サーバー
チャットアプリケーションのサーバー側は、`%CSP.WebSocket` を拡張した `Chat.Server` クラスで実装されます。 サーバークラスは、`%CSP.WebSocket`のプロパティとメソッドを継承しています。これについては以下の方で説明します。 `Chat.Server` は、クライアントからのメッセージを処理するカスタムメソッドと、クライアントにメッセージをブロードキャストするカスタムメソッドも実装します。
### *サーバーの起動前処理*
`OnPreServer()` は、WebSocketサーバーが作成されて `%CSP.WebSocket` クラスから継承される前に実行されます。
```
Method OnPreServer() As %Status
{
set ..SharedConnection=1
if (..WebSocketID '= ""){
set ^Chat.WebSocketConnections(..WebSocketID)=""
} else {
set ^Chat.Errors($INCREMENT(^Chat.Errors),"no websocketid defined")=$HOROLOG
}
Quit $$$OK
}
```
このメソッドは、`SharedConnection` クラスのパラメーターを1に設定し、WebSocket接続が非同期であり、InterSystems IRISインスタンスとWebゲートウェイ間の接続を定義する複数のプロセスでサポートされることを示します。 `SharedConnection` パラメーターは、`OnPreServer()` でしか変更できません。 また、`OnPreServer()` は、クライアントに関連付けられているWebSocket IDを `^Chat.WebSocketConnections` グローバルに格納します。
### *Serverメソッド*
サーバーが実行するロジックの本文は、`Server()` メソッドに含まれます。
```
Method Server() As %Status
{
do ..StatusUpdate(..WebSocketID)
for {
set data=..Read(.size,.sc,1)
if ($$$ISERR(sc)){
if ($$$GETERRORCODE(sc)=$$$CSPWebSocketTimeout) {
//$$$DEBUG("no data")
}
if ($$$GETERRORCODE(sc)=$$$CSPWebSocketClosed){
kill ^Chat.WebSocketConnections(..WebSocketID)
do ..RemoveUser($g(^Chat.Users(..WebSocketID)))
kill ^Chat.Users(..WebSocketID)
quit // Client closed WebSocket
}
} else{
if data["User"{
do ..AddUser(data,..WebSocketID)
} else {
set mid=$INCREMENT(^Chat.Messages)
set ^Chat.Messages(mid)=data
do ..ProcessMessage(mid)
}
}
}
Quit $$$OK
}
```
このメソッドは、クライアントからの受信メッセージを読み取り(`%CSP.WebSockets` クラスの `Read` メソッド)、取得したJSONオブジェクトを `^Chat.Messages` グローバルに追加し、接続されているその他すべてのチャットクライアントにメッセージを転送するための `ProcessMessage()` を呼び出します。 ユーザーがチャットウィンドウを閉じると(つまり、サーバーへのWebSocket接続が終了すると)、`Server()` メソッドの `Read` の呼び出しによって、それが評価するエラーコードが `$$$CSPWebSocketClosed` マクロに返され、メソッドはそれに応じて閉鎖の処理に進みます。
### *メッセージの処理と配信*
`ProcessMessage()` は、受信チャットメッセージにメタデータを追加して `SendData()` を呼び出し、メッセージをパラメーターとして渡します。
```
ClassMethod ProcessMessage(mid As %String)
{
set msg = ##class(%DynamicObject).%FromJSON($GET(^Chat.Messages(mid)))
set msg.Type="Chat"
set msg.Sent=$ZDATETIME($HOROLOG,3)
do ..SendData(msg)
}
```
`ProcessMessage()` は、`^Chat.Messages` グローバルからJSONの書式付きメッセージを取得し、`%DynamicObject` クラスの `%FromJSON` メソッドを使って、そのメッセージをInterSystems IRIS オブジェクトに変換します。 この変換により、メッセージが接続されているすべてのチャットクライアントに転送される前に、データを編集しやすくなります。 `Type` 属性を値「Chat」で追加し、クライアントはこれを使用して、受信メッセージの処理方法を決定しアンス。 `SendData()` は、接続されているその他すべてのチャットクライアントにメッセージを送信します。
```
ClassMethod SendData(data As %DynamicObject)
{
set c = ""
for {
set c = $order(^Chat.WebSocketConnections(c))
if c="" Quit
set ws = ..%New()
set sc = ws.OpenServer(c)
if $$$ISERR(sc) { do ..HandleError(c,"open") }
set sc = ws.Write(data.%ToJSON())
if $$$ISERR(sc) { do ..HandleError(c,"write") }
}
}
```
`SendData()` は、InterSystems IRISオブジェクトをJSON文字列に変換し直し(`data.%ToJSON()`)、すべてのチャットクライアントにメッセージをプッシュします。 `SendData()` は、クライアントとサーバー間のそれぞれの接続に関連付けられたWebSocket IDを `^Chat.WebSocketConnections` グローバルから取得し、そのIDを使って、`%CSP.WebSocket` クラスの `OpenServer` メソッドで、WebSocket接続を開きます。 `OpenServer` メソッドを使ってこの処理を実行できるのは、WebSocket接続が非同期であるからです。IRIS-Webゲートウェイの既存のプールからプロセスをプルし、特定のチャットクライアントへのサーバー接続を識別するWebSocket IDを割り当てています。 最後に、 `Write()` `%CSP.WebSocket` メソッドによって、JSON 文字列に変換されたメッセージがクライアントにプッシュされます。
## まとめ
このチャットアプリケーションでは、クライアントとInterSystems IRISをホストするサーバー間にWebScocket接続を確立する方法が示されています。 InterSystems IRISにおけるプロコルとその実装については、引き続き、「はじめに」セクションに記載されているリンクをご覧ください。
お知らせ
Toshihiko Minamoto · 2021年2月18日
InterSystems API Manager(IAM) バージョン1.5がリリースされました
以前のバージョンからアップグレードできるIAMコンテナはWRCソフトウェア配布サイトのComponents areaからダウンロードすることができます。
ビルド番号はIAM 1.5.0.9-4 です。
InterSystems API Manager 1.5 ではAPIトラフィックの管理や、環境とAPI利用者の統合がさらに簡単になりました。新機能は以下の通りです。
ユーザエクスペリエンスの改善
新たな開発者ポータル
Kafka connectivityのサポート
このリリースは、Kong Enterprise バージョン 1.5.0.9 をベースにしています。これまでのIAMリリースにはKong Enterpriseのホワイトラベルバージョンが入っていましたが、このリリースではホワイトラベルなしバージョンが入っています。この変更で、より頻繁にリリースすることができ、 Kongの提供するドキュメントやその他の資産を効果的に活用できるようになりました。
IAM 1.5のドキュメントはこちらです。このドキュメントはIAM固有の部分のみカバーしています。製品のドキュメントからユーザは直接 Kong Enterpriseのドキュメントを参照できます。
IAM 0.34-1 からのアップグレードはこちらのドキュメントで詳細が記載されている3つの中間リリースを通してアップグレードする必要があります。
IAM はdockerコンテナとして知られるOCI (Open Container Initiative) でのみ動作します。 コンテナイメージはOCIに準拠したLinux x86-64、Linux ARM64対応のランタイムエンジンで動作可能です。詳細はサポートプラットホームを参照してください。
よろしくお願いいたします。
Stefan
記事
Hiroshi Sato · 2022年3月23日
もし現在ご使用のデータベース技術で壁に突き当たっていると感じておられるならば、是非InterSystems IRIS Data Platformへの移行をご検討ください。
(以下IRIS)
IRISに移行するに際して、現行のプログラム資産を全て書き換える必要はありません。
IRISに移行する際には、以下の手順で進めることを推奨しております。
アプリケーションコードをそのまま流用し、動作させるために、現在のデータベースからIRISへの移行を行います。
既存のRDBMSのデータ定義(DDL文で記述されたもの)をIRISに取り込むことで、リレーショナルとオブジェクトの両モデルからアクセスが可能となるため、必要に応じてオブジェクト・アクセスが妥当である処理に対しては、アプリケーションプログラムの修正など、対応策が選択できます。
さらにXMLやJSONなどのドキュメント形式のデータの取り扱いも容易ですので、RestFullなアプリケーション構築にも向いています。
また、IRISには習得が容易でデータベースエンジンと一体化したスクリプト言語「InterSystems ObjectScript」が用意されているので、処理の一部をサーバ側ロジックとしてストアドプロシージャ化することによってデータベース処理を効率化するなど、様々な対応策を検討することができます。
バージョン2021.2からは、Embedded Pythonのサポートが追加され、ObjectScriptと同様に同一プロセス空間からデータベースアクセスが可能となり、Pythonプログラムからのデータベースアクセスが大幅に改善されました。
記事
Hiroshi Sato · 2021年10月19日
これはInterSystems FAQ サイトの記事です。
2つのシステムをつなぐだけだったら、わざわざInterSystems IRIS Data Platform(以下IRISと表記)のようなものを仲介させるのは無駄に思えるかもしれません。
ですが、システムの接続は複数システム間に跨るのが一般的です。
そしてシステムの数が増えるにつれ、その接続は複雑になっていき、接続のタイミング、接続プロジェクトの進行管理などが重荷になっていきます。
また各接続は時が経つにつれ変化するのが一般的で、そういうことが起こると双方のシステムにその都度修正が必要になります。
相互依存性が高まるわけです。
また時が経つにつれ各システムが本来持っている機能と接続に関わる処理が混在するケースが多く、変更の影響範囲が多岐に渡ってしまい、 ちょっとした修正でも影響範囲の特定が困難となり、修正作業が膨大になるケースがあります。
IRISを使ってシステム接続を中継させることにより、接続に関する様々な雑用をIRISが担うようになれば、やがて接続の標準化が促進され、各システムには全く変更を加えることなく接続が可能になり、何か変更があった場合にも影響範囲が限定され、その変更作業に必要な工数を最小化できます。
さらに様々なシステムが生成するデータがIRIS上に流れることになるので、その情報を整理して統合データベースを構築することも簡単に実現できます。
記事
Toshihiko Minamoto · 2022年8月17日
InterSystems IRIS には、暗号化、復号化、およびハッシュ操作の優れたサポートが備わっています。 クラス %SYSTEM.Encryption(https://docs.intersystems.com/iris20212/csp/documatic/%25CSP.Documatic.cls?LIBRARY=%25SYS&PRIVATE=1&CLASSNAME=%25SYSTEM.Encryption)の中には、市場に出回っている主なアルゴリズムのクラスメソッドがあります。
## IRIS アルゴリズムと暗号化/復号化の方式
ご覧のとおり、操作は鍵に基づいており、3 つのオプションが含まれます。
* **対称鍵**: 暗号化と復号化の操作を実行する部分で同じ秘密鍵が使用されます。
* **非対称鍵**: 暗号化と復号化の操作を実行する部分で、暗号化に同じ秘密鍵が使用されますが、 復号化においては、各パートナーが秘密鍵を所有します。 この鍵は身元を証明するものであるため、他人と共有することはできません。
* **ハッシュ**: 暗号化だけが必要で、復号化が不要である場合に使用されます。強力なユーザーパスワードを保存する際に一般的なアプローチです。
## 対称暗号化と非対称暗号化の違い
* 対称暗号化では、メッセージを受信する必要のある人の間で単一の鍵を共有して使用しますが、非対称暗号化では、通信時に公開鍵と秘密鍵のペアを使用してメッセージの暗号化と復号化を行います。
* 対称暗号化は古いテクニックであるのに対し、非対称暗号化は比較的最近のテクニックです。
* 非対称暗号化は、対称暗号化モデルで鍵を共有する必要性に関わる固有の問題を補完するために導入されました。公開鍵と秘密鍵のペアを使用することで、鍵を共有する必要がなくなっています。
* 非対称暗号化には、対称暗号化よりも比較的時間がかかります。
主な違い
対称暗号化
非対称暗号化
暗号文のサイズ
元のプレーンテキストファイルより小さい暗号文。
元のプレーンテキストファイルより大きい暗号文。
データサイズ
ビッグデータの送信に使用される。
スモールデータの送信に使用される。
リソース使用率
対称鍵暗号化は、リソース使用率が低い場合に機能します。
非対称暗号化では、大量のリソースを消費する必要があります。
鍵の長さ
128 または 256 ビットの鍵サイズ。
RSA 2048 ビット以上の鍵サイズ。
セキュリティ
暗号化に単一の鍵を使用するため、セキュリティが低下。
暗号化と復号化を 2 つの異なる鍵で行うため、はるかに安全。
鍵の数
対称暗号化では、暗号化と復号化に単一の鍵を使用する。
非対称暗号化では、暗号化と復号化に 2 つの異なる鍵を使用する。
テクニック
古いテクニック。
最新のテクニック。
機密性
暗号化と復号化に使用される単一の鍵には、その鍵が改ざんされる可能性がある。
暗号化と復号化で個別に 2 つの鍵が作成されるため、鍵を共有する必要がない。
速度
対称暗号化は高速な手法。
非対称暗号化は速度が低下する。
アルゴリズム
RC4、AES、DES、3DES、および QUAD。
RSA、Diffie-Hellman、ECC アルゴリズム。
出典: https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences
## %SYSTEM.Encryption クラスを使用して暗号化、復号化、ハッシュを実行
IRIS の暗号化、復号化、およびハッシュ操作のサポートを使用するには、https://github.com/yurimarx/cryptography-samples にアクセスし、以下の手順に従ってください。
1. リポジトリを任意のローカルディレクトリに Clone/git pull します。
$ git clone https://github.com/yurimarx/cryptography-samples.git
2. このディレクトリで Docker ターミナルを開き、以下を実行します。
$ docker-compose build
3. IRIS コンテナを実行します。
$ docker-compose up -d
4. IRIS ターミナルを開きます。
$ docker-compose exec iris iris session iris -U IRISAPP
IRISAPP>
5. 非対称暗号化の RSA Encrypt を実行するには、以下を実行します。
IRISAPP>Set ciphertext = ##class(dc.cryptosamples.Samples).DoRSAEncrypt("InterSystems")
IRISAPP>Write ciphertext
Ms/eR7pPmE39KBJu75EOYIxpFEd7qqoji61EfahJE1r9mGZX1NYuw5i2cPS5YwE3Aw6vPAeiEKXF
rYW++WtzMeRIRdCMbLG9PrCHD3iQHfZobBnuzx/JMXVc6a4TssbY9gk7qJ5BmlqRTU8zNJiiVmd8
pCFpJgwKzKkNrIgaQn48EgnwblmVkxSFnF2jwXpBt/naNudBguFUBthef2wfULl4uY00aZzHHNxA
bi15mzTdlSJu1vRtCQaEahng9ug7BZ6dyWCHOv74O/L5NEHI+jU+kHQeF2DJneE2yWNESzqhSECa
ZbRjjxNxiRn/HVAKyZdAjkGQVKUkyG8vjnc3Jw==
6. 非対称復号化の RSA Decrypt を実行するには、以下を実行します。
IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext)
IRISAPP>Write plaintext
InterSystems
7. 非対称暗号化の AES CBC Encrypt を実行するには、以下を実行します。
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems")
8sGVUikDZaJF+Z9UljFVAA==
8. 対称暗号化の AES CBC Decrypt を行うには、以下を実行します。
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==")
InterSystems
9. 古いハッシュアプローチの MD5 hash を実行するには、以下を実行します。
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems")
rOs6HXfrnbEY5+JBdUJ8hw==
10. 推奨されるハッシュアプローチの SHA hash を実行するには、以下を実行します。
IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems")
+X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E=
11. ターミナルを終了するには、以下を実行します。
HALT または H を入力(大文字と小文字は区別されません)
##
## ソースコードについて
### 1. 対称鍵について
# 対称暗号化/復号化で使用する
ENV SECRETKEY=InterSystemsIRIS
Dockerfile に、対称操作で秘密鍵として使用される環境鍵が作成されました。
### 2. 非対称鍵について
# 非対称暗号化/復号化で使用する RUN openssl req -new -x509 -sha256 -config example-com.conf -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
Dockerfile に、非対称操作で使用される秘密鍵と公開鍵が生成されました。
### 3. 対称暗号化
// 暗号化するための対称鍵の例
ClassMethod DoAESCBCEncrypt(plaintext As %String) As %Status
{
// utf-8 に変換
Set text=$ZCONVERT(plaintext,"O","UTF8")
// 秘密鍵を設定
Set secretkey = $system.Util.GetEnviron("SECRETKEY")
Set IV = $system.Util.GetEnviron("SECRETKEY")
// テキストを暗号化
Set text = $SYSTEM.Encryption.AESCBCEncrypt(text, secretkey, IV)
Set ciphertext = $SYSTEM.Encryption.Base64Encode(text)
Write ciphertext
}
テキストの暗号化に AES CBC Encrypt 操作が使用されました。
Base64 Encode は、プリティ/読み取り可能なテキストとしてユーザーに結果を返します。
### 4. 対称復号化
// 復号化するための対称鍵の例
ClassMethod DoAESCBCDecrypt(ciphertext As %String) As %Status
{
// 秘密鍵を設定
Set secretkey = $system.Util.GetEnviron("SECRETKEY")
Set IV = $system.Util.GetEnviron("SECRETKEY")
// テキストを復号化
Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV)
Set plaintext=$ZCONVERT(text,"I","UTF8")
Write plaintext
}
テキストの復号化に AES CBC Decrypt 操作が使用されました。
Base64 Decode は、復号化に使用できるように、暗号化されたテキストをバイナリテキストに返します。
**5. 非対称暗号化**
// 暗号化するための非対称鍵の例
ClassMethod DoRSAEncrypt(plaintext As %String) As %Status
{
// 公開鍵証明書を取得
Set pubKeyFileName = "/opt/irisbuild/example-com.cert.pem"
Set objCharFile = ##class(%Stream.FileCharacter).%New()
Set objCharFile.Filename = pubKeyFileName
Set pubKey = objCharFile.Read()
// RSA を使って暗号化
Set binarytext = $System.Encryption.RSAEncrypt(plaintext, pubKey)
Set ciphertext = $SYSTEM.Encryption.Base64Encode(binarytext)
Return ciphertext
}
RSA で暗号化するには、公開鍵ファイルの内容を取得する必要があります。
テキストの暗号化に、RSA Encrypt 操作が使用されました。
### 6. 非対称復号化
// 復号化するための非対称鍵の例
ClassMethod DoRSADecrypt(ciphertext As %String) As %Status
{
// 秘密鍵を取得
Set privKeyFileName = "/opt/irisbuild/example-com.key.pem"
Set privobjCharFile = ##class(%Stream.FileCharacter).%New()
Set privobjCharFile.Filename = privKeyFileName
Set privKey = privobjCharFile.Read()
// 暗号文をバイナリ形式で取得
Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
// RSA を使って復号化
Set plaintext = $System.Encryption.RSADecrypt(text, privKey)
Return plaintext
}
RSA で復号化するには、秘密鍵ファイルの内容を取得する必要があります。
テキストの復号化に、RSA Decrypt 操作が使用されました。
### 7. MD5 を使ったテキストのハッシュ化(古いアプローチ)
// ハッシュの例
ClassMethod DoHash(plaintext As %String) As %Status
{
// utf-8 に変換
Set text=$ZCONVERT(plaintext,"O","UTF8")
// テキストをハッシュ化
Set hashtext = $SYSTEM.Encryption.MD5Hash(text)
Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
// 16 進テキストを以下のベストプラクティスに変換
Set hextext = ..GetHexText(base64text)
// 小文字を使って返す
Write $ZCONVERT(hextext,"L")
}
MD5 Hash 操作でテキストを暗号化すると、それを復号化することはできません。
MD5 を使ったハッシュ化は、安全でないと見なされているため、新しいプロジェクトには推奨されません。 そのため、この方式は SHA に置き換えられています。 InterSystems IRIS は SHA をサポートしています(次の例で紹介します)。
### 8. SHA を使ったテキストのハッシュ化(推奨されるアプローチ)
この例では、SHA-3 Hash 方式を使用します。 InterSystems のドキュメントによると、この方式は、US Secure Hash Algorithm - 3 を使ってハッシュを生成します。 (詳細は、連邦情報処理規格 202 をご覧ください。)
// SHA を使ったハッシュ
ClassMethod DoSHAHash(plaintext As %String) As %Status
{
// utf-8 に変換
Set text=$ZCONVERT(plaintext,"O","UTF8")
// テキストをハッシュ化
Set hashtext = $SYSTEM.Encryption.SHA3Hash(256, text)
Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
// 16 進テキストを以下のベストプラクティスに変換
Set hextext = ..GetHexText(base64text)
// 小文字を使って返す
Write $ZCONVERT(hextext,"L")
}
SHA 方式では、ハッシュ操作で使用するビット長を設定できます。 ビット数が多いほど、ハッシュを解読するのがより困難になりますが、 ハッシュ化の処理速度が低下してしまいます。 この例では、256 ビットが使用されました。 ビット長については以下のオプションを選択できます。
* 224(SHA-224)
* 256(SHA-256)
* 384(SHA-384)
* 512(SHA-512)
記事
Mihoko Iijima · 2023年6月1日
開発者の皆さん、こんにちは。
先日のウェビナーでご紹介した「ワークフローコンポーネント」をお試しいただけるサンプルを公開しました。👉 https://github.com/Intersystems-jp/WorkFlow-DC
《サンプルのテーマ》
店舗で販売している商品に付けるPOPメッセージ候補を予めテーブルに登録できる仕組みが既にある、と仮定しています。
IRISの Interoperability を利用してPOPメッセージ候補が登録されるテーブルに対して一定間隔でSELECT文を実行し、未処理のメッセージを取得します。新たなレコードが存在する場合、ワークフローコンポーネントを利用して担当者に審査を依頼します。
担当者は、ワークフローユーザポータルを使用して、POPメッセージ候補の承認/却下を指示できるようにしています。
ワークフローコンポーネントは、InterSystems IRIS、InterSystems IRIS for Healthでご利用いただけます。
上記サンプルはコンテナを使用していますので、事前に docker 、docker-compose のインストールが必要となりますが、docker-compose up -d の実行だけで準備が整いますのでよろしければお試しください。
なお、サンプルでは、InterSystems IRIS Community edition 2023.1.0 を利用しています。
コミュニティエディションの種類やバージョンについては、InterSystemsコンテナレジストリでご確認いただけます。
サンプルで使用しているDockerfileの1行目にイメージ名を指定していますので、コンテナビルド前に使用されたいイメージにご変更いただければ別のバージョンや IRIS for Health でもお試しいただけます。
InterSystemsコンテナレジストリのご利用方法については、InterSystemsコンテナレジストリ Webユーザインターフェースのお知らせ をご参照ください。
ワークフローコンポーネントでどんなことができるのか?の概要説明については、ウェビナー(オンデマンド再生)をご参照ください。
それでは、サンプルを使用してどのような流れを体験できるか、ご紹介します。
まずは、サンプル(https://github.com/Intersystems-jp/WorkFlow-DC)を git cloneしたら、WorkFlow-DC ディレクトリに移動し、コンテナをビルド+開始します。
docker-compose build
docker-compose up -d
コンテナ開始後、ワークフローユーザポータルで処理できるデータが4件作成されます。
ワークフローユーザポータルにログイン、またはサンプルのWebアプリ(Flaskアプリ版ユーザポータル)を利用して動作をご確認いただけます。
1. ワークフローユーザポータル での確認
管理ポータルでメッセージのトレースを参照される場合は、ワークフローユーザポータルは管理ポータルとは異なるブラウザで開くことをお勧めします。(管理ポータル/ワークフローユーザポータルにアクセスする際、IRIS内ユーザを利用してログインを行うため、ブラウザの種別が同一の場合、毎回ログインしなおす必要があります)
《コンテナ利用時のワークフローユーザポータルのURL》http://localhost:9093/csp/user/_DeepSee.UserPortal.Home.zen?$NAMESPACE=USER&$NAMESPACE=USER&
以下のワークフローユーザでログインしてください。
ユーザ名:ManagerA/パスワード:SYS
2. Flaskアプリ版ユーザポータル での確認
《コンテナ利用時のFlask版アプリのURL》http://localhost:5001
ユーザ名:ManagerA でログインするように作成しています。
このWebアプリケーションでは、開発者コミュニティのサンプル公開サイトであるOpen Echange に公開されている「ワークフローREST API」を利用してワークフロータスク一覧の取得やタスク詳細表示、タスクの処理を行っています。
3. POPメッセージ用テーブルのデータ確認
管理ポータルのSQLメニューを利用します:IRIS管理ポータル SQLメニュー
《コンテナ利用時のURL》http://localhost:9093/csp/sys/exp/%25CSP.UI.Portal.SQL.Home.zen?$NAMESPACE=USER&$NAMESPACE=USER
または、管理ポータル(http://localhost:9093/csp/sys/UtilHome.csp)を開き、[システムエクスプローラ] > [SQL] を開き、ネームスペース:USERを選択します。
管理ポータルには以下のユーザ名/パスワードでログインします。
ユーザ名:SuperUser/パスワード:SYS
以下のSQLで販売商品に対するPOPメッセージの申請登録を確認できます。
SQL画面右側の「クエリ実行」タブに以下SELECT文を入力し、「実行」ボタンをクリックすると結果を確認できます。
SELECT
Product->PID,Product->ProductName,POPID,Status,Message,TO_CHAR(StartDate,'YYYY-MM-DD') As StartDate, Period,RejectedReason, Done
FROM ISJFoods_Tbl.POP
4. メッセージの確認方法
IRISの管理ポータル、プロダクション構成画面は以下URLでアクセスできます。
IRIS管理ポータル
《コンテナ利用時のURL》http://localhost:9093/csp/sys/UtilHome.csp
プロダクション構成画面
《コンテナ利用時のURL》http://localhost:9093/csp/user/EnsPortal.ProductionConfig.zen?$NAMESPACE=USER&$NAMESPACE=USER&
または、管理ポータル(http://localhost:9093/csp/sys/UtilHome.csp)を開き [Interoperability] > USERネームスペース選択 > [構成する] > [プロダクション] をクリックします。
メッセージの確認手順
(1) プロダクション構成画面にアクセスします。 サービス:POPメッセージSQL抽出 の文字の付近をクリックし、画面右の「メッセージ」タブを選択します。
(2) 処理したいメッセージを選択します。
コンテナ開始段階で4件のメッセージが参照できるので、ヘッダ列にある番号をクリックし、メッセージのトレース画面を開きます(以下の図は開いた後の画面です)。
トレースにある[2]のメッセージをクリックした後、画面右の「コンテンツ」タブを開き、 以下タグのデータを確認します。
<_Message></_Message> と <_Subject></_Subject>
この画面は、ワークフローユーザがタスクを処理した後の確認にも使用するため、開いたままとします。
(3) ワークフローユーザポータル、またはFlaskアプリ上で(2)で確認した情報と同じリストを探し処理します。
ワークフローユーザポータルの場合は、対象行を選択します。 Flaskアプリの場合は「審査する」ボタンをクリックします。 承認か却下ボタンをクリックします。
(4) ユーザ指示後のトレースを確認します。
(2)で確認したトレースをリロードします。 待機していた処理がユーザからの指示により、再開していることがわかります。([3]のメッセージをクリックすると画面右の「コンテンツ」タブでユーザが指示したときのボタン情報を確認できます)
✅ POPメッセージ審査完了通知(Teams)をご利用いただく場合
コンテナ開始時点では、POPメッセージ審査完了通知(Teams)は無効になっています。Teamsの任意チャネルに対して「Incoming Webhook」の設定を行ってください。
設定後、以下設定欄に必要な情報をご記入ください。
オペレーション:登録者へ通知 を選択し「設定」タブにある以下設定を作成されたIncoming Webhookに合わせ修正してください。
HTTPサーバ
URL
teams設定にある「token」
続いて、プロセス:POP審査 のエディタを開き、一番下にある「登録者への通知」アクティビティをクリックし、画面右にある「無効」のチェックを外し、コンパイルボタンをクリックします。
5. メモ
もう1度、同じデータを利用してワークフローユーザポータル上で審査したい場合は、IRIS管理ポータル SQLメニューの「クエリ実行」タブで、以下UPDATE文を実行してください。
update ISJFoods_Tbl.POP
set Done=0,Status='pending',RejectedReason=null
UPDATE文実行後、メッセージの確認方法でご確認ください。
次の記事では、上記内容をお手元のIRISでお試しいただく手順についてご紹介します。
記事
Mihoko Iijima · 2021年3月9日
これは InterSystems FAQ サイトの記事です。
INFORMATION_SCHEMA スキーマを使用して取得できます。
INFORMATION_SCHEMA はシステム用スキーマのため、デフォルトでは管理ポータルの SQL メニューに表示されません。
表示させる方法は以下の通りです。
管理ポータル→システムエクスプローラ→SQL メニューを開きます。
スキーマのプルダウン左にある「システム」をチェックします。
スキーマのプルダウンから INFORMATION_SCHEMA を選択します。
指定のテーブル(Test.Person)に対するID、フィールド名(COLUMN_NAME)、データタイプ(DATA_TYPE)、説明(DESCRIPTION)を取得するSQLは以下の通りです。
SELECT ID,COLUMN_NAME,DATA_TYPE,DESCRIPTION
FROM INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA='Test' AND TABLE_NAME='Person'
関連するFAQトピックもご参照ください:「プログラムから、クラス定義に記述されたプロパティ定義を取得する方法はありますか?」
記事
Hiroshi Sato · 2021年10月7日
これは InterSystems FAQ サイトの記事です。ジャーナルレコードの「時間」には、ジャーナルバッファを初期化したときの時間が登録されています。
ジャーナルレコードの時間は、ジャーナルバッファ毎に記録されているため、同じジャーナルバッファ内のジャーナルレコードはすべて同じ時間になります。
なお、ジャーナルバッファは、64KBのサイズで255個存在していて、1つのジャーナルバッファが満杯になった場合、次のジャーナルバッファへレコードを追加するように順番に使用されます。
ジャーナルレコードの時間は、次のバッファへレコードを追加する前に行われる初期化の時間が記録される仕組みになっています。
記事
Megumi Kakechi · 2021年6月7日
これは InterSystems FAQ サイトの記事です。
Question:
IRIS Data Platformは大量のトラフィック処理に耐えられますか?
Answer:
IRIS Data Platformは他のデータベースシステムに比較してデータの処理スピードおよび処理能力の面で優れています。
ESGという外部機関が実際に他社データベース製品とのベンチマークテストを実施した結果に関するレポートを公表しています。
またウルシステムズ社による検証結果も公開されています。
ご参考いただければ幸いです。
ESGによるスピードテストの検証結果
ウルシステムズ社ベンチマーク結果レポート 2022/7/5記事の内容を更新しました。検証結果事例を追加しました。
記事
Makiko Kokubun · 2021年6月30日
*この動画は、2021年2月に開催された「InterSystems Japan Virtual Summit 2021」のアーカイブです。
VSCodeのObjectScript用エクステンションバージョン1.0がリリースされ、GitやDockerなどの標準技術とIRISを手軽に組み合わせて利用できるようになりました。 開発者コミュニティでは、IRISをもっと簡単に操作いただけるようコンテナ版IRISを利用した開発環境テンプレ―トやObjectScriptパッケージマネージャを公開しています。
この動画では「VSCodeからIRISに接続する方法」「開発環境テンプレートの使い方」「パッケージマネージャの使い方」をご紹介します。
この動画の講演資料(PDF)もご用意しました。動画の中でご紹介している技術資料へのURLは、こちらの資料をご活用ください。
記事
Tomoko Furuzono · 2021年12月13日
これは、InterSystems FAQサイトの記事です。
グローバル単位でジャーナルのON/OFF設定を行いたい場合は、グローバルマッピング設定で、 ・ジャーナルしたいグローバル ⇒ ジャーナルONのデータベースにマッピング)と、 ・ジャーナルしたくないグローバル ⇒ ジャーナルOFFのデータベースにマッピングを分けるという方法があります。
例えば、一部のグローバルのみジャーナルしたくない場合には、そのグローバルを IRISTEMP/CACHETEMP データベースにグローバルマッピングすることで、そのグローバルはジャーナルされなくなります。※IRISTEMP/CACHETEMP データベースは、ジャーナル対象外のデータベースであるため。 ただし、IRISTEMP/CACHETEMP データベースの内容は、再起動時にクリアされますのでご注意ください。
記事
Megumi Kakechi · 2022年2月23日
これは、InterSystems FAQサイトの記事です。現ジャーナルファイル名の取得は、ジャーナリング API を利用します。
##class(%SYS.Journal.System).GetCurrentFileName()
現ジャーナルファイルの使用量bytesの取得は、ジャーナリング API を利用します。
##class(%SYS.Journal.System).GetCurrentFileOffset()
実行例は以下の通りです。
%SYS>Write ##class(%SYS.Journal.System).GetCurrentFileName()c:\journal\20110223.001%SYS>Write ##class(%SYS.Journal.System).GetCurrentFileOffset()1213012
あわせて、以下の関連記事も是非ご覧ください。
ジャーナルファイルを削除する方法
ジャーナルファイルが長時間消されずに残ってしまう原因
コマンドでジャーナルファイルにある特定のグローバル変数を検索する方法
誤って削除したグローバルを復旧させる方法
ジャーナルファイルの内容を管理ポータル以外で参照する方法
記事
Tomoko Furuzono · 2022年3月29日
これは、InterSystems FAQサイトの記事です。
%SQL.Util.Proceduresクラスの CSV() プロシジャを使用することにより、実現できます。下記が使用例のコードとなります。(test.csvというファイルが c:\temp にあるという前提)
Set rowtype="Name VARCHAR(50),UID VARCHAR(50), PHONE VARCHAR(50)" Set filename="c:\temp\test.csv" Set result=##class(%SQL.Statement).%ExecDirect(,"call %SQL_Util.CSV(,?,?)",.rowtype,.filename) Set rset =result.%NextResult() // 全件表示したい場合は、do rset.%Display() While rset.%Next() { Write "Name:",rset.%GetData(1)," UID:",rset.%GetData(2)," PHONE:",rset.%GetData(3),! } Set rset="",result="" Quit
上記を実行することにより結果セットとして各行およびフィールドにアクセスできます。実行例:
USER>do ^CSVName UID PHONE山田,太郎 0001 080-1111-1111bbb 0003 090-2222-2222ccc 0009 "050-3333-3333"ddd 0010 0120-17-19724 Rows(s) Affected
%SQL.Util.Proceduresクラスのクラスリファレンスも併せてご確認ください。クラスリファレンス:%SQL.Util.Procedures.CSV()