IRISで Amazon s3(クラウドストレージAPI)を使用する方法
これは InterSystems FAQ サイトの記事です。
ビジネスサービスやビジネスオペレーションで EnsLib.CloudStorage.InboundAdapter アダプタを使用したり、%Net.Cloud.Storage.Client を使用することで、Amazon s3(クラウドストレージAPI)のファイルにアクセスすることが可能です。
いずれの場合も、事前に Javaランタイムをシステムにインストールし、インストールしたJavaランタイムの JAVA_HOME 情報を、管理ポータルにて設定する必要があります(手順は後述します)。
今回は、%Net.Cloud.Storage.Client クラスを使用したサンプルをご紹介します。
手順は以下のようになります。
【手順】
以下のS3パケットにアクセスする手順になります。
(1) 事前に、コマンドプロンプトにて aws コマンドを使用して動作確認をしておきます(S3に存在しているファイル一覧がプロンプトに返ればOKです)。
> aws s3 ls s3://isj-s32025-04-3016:20:52 32 abc.txt
2025-04-3016:14:00 21529 messages.logもしくは
>aws s3 --endpoint-url https://s3.ap-northeast-1.amazonaws.com ls s3://isj-s32025-04-3016:20:5232 abc.txt
2025-04-3016:14:0021529 messages.log
(2) Javaをインストールします
Java Runtime Environment (JRE)s 1.8
(3) 管理ポータルで %Java_Gateway の設定を行います
管理ポータル:
システム管理 > 構成 > 接続性 > 外部言語サーバ > %Java_Server 編集
クラスパス .;C:\InterSystems\iris\dev\java\lib\1.8\intersystems-cloudclient-1.x.x.jar; バージョンにより異なります。
Javaホーム C:\Program Files\Java\jre1.8.0_451\ Javaインストールフォルダ
保存後、%Java_Server を Start ※以下のようなログで起動します
(4) 以下のコマンドをターミナルで実行します。
set region="ap-northeast-1"set credentialsFile=""set endPoint=""set client = ##class(%Net.Cloud.Storage.Client).CreateClient(,0,credentialsFile,region,.tSC,endPoint)読む
set bucketName = "isj-s3"/// Stringset data = client.DownloadBlobToString(bucketName,"abc.txt")
zwrite data
// data="InterSystems Japan"_$c(13,10)_"インターシステムズジャパン"_$c(13,10)// ファイルはBOMなし&UTF-8で保存しています/// Streamset stream = client.DownloadBlobToStream(bucketName, "messages.log")
set i=stream.Read(200) ;; 先頭200バイトzwrite i
//i="07/08/23-08:48:50:868 (14307) 0 [Generic.Event] Allocated 496MB shared memory"_$c(10)_"07/08/23-08:48:50:869 (14307) 0 [Generic.Event] 32MB global buffers, 80MB routine buffers, 64MB journal buffers, 6MB buffe"
書く
setx="あいうえお"_$C(13,10)_"かきくけこ"do client.UploadBlobFromString(bucketName, "abc.txt", x)
閉じる
do client.Close()Comments
お世話になっております。
本稿を参考にS3にファイルアップロード(または書き込み)を行ってみましたが、うまく処理が行えない状態でした。
手順にあります、(1)、(2)*1、(3)については実施済みで問題なく結果を得られております。
*1 手順ではJava1.8ですが、当方環境は Java11
環境としては
[JAVA]
openjdk version "11.0.29" 2025-10-21
OpenJDK Runtime Environment (build 11.0.29+7-post-Ubuntu-1ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.29+7-post-Ubuntu-1ubuntu122.04, mixed mode, sharing)
[IRIS]
IRIS for UNIX (Ubuntu Server 22.04 LTS for x86-64) 2023.1.6 (Build 810_1U) Wed May 28 2025 17:15:01 EDT
となっております。
実際にデバッグした際のログにおいては
<THROW>%DispatchMethod+38^%Net.Remote.Object.1 *%Net.Remote.Exception
<GATEWAY> com.amazonaws.services.s3.model.AmazonS3Exception com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1879)
User: arn:aws:sts::724843235107:assumed-role/AmazonSSMRoleForInstancesQuickSetup/i-07a67a6c7247bcb79 is not authorized to perform:
s3:GetObject on resource: "arn:aws:s3:::xxxxx/abc.txt" because no identity-based policy allows the s3:GetObject action (Servic
のようなものが出ております。
authorized がでていることから何かしらの権限周りでの設定不足なのかと推測しておりますが
本稿の手順外において、何かしら設定しないといけない事はありますでしょうか?
@Kazuma Watanabe さん、こんにちは!
ご質問ありがとうございます。
S3のあるAWS環境外からアクセスする場合には、推測されている通り認証情報が必要になります。
具体的には、記事の手順の (4) で credentialsFile を指定します。
ご使用のS3環境の AWSアクセスキー より、以下のようなファイルを作成します。
[default] aws_access_key_id=xxxx.... aws_secret_access_key=xxxx.... aws_session_token=xxxx....
このファイルを任意の場所に置き、credentialsFile で指定します。
例:
set region=...
set credentialsFile="C:\work\AWS\credentialsFile"
:
こちらで動作するか、ご確認ください。よろしくお願いいたします。