Oracle APEXでOCI ObjectStorageに日本語ファイル名のファイルを置く(前編)
ローコードWeb開発ツールのOracle APEXを使って社内向けシステムを作っていますが、ファイルのアップロードとダウンロードの機能が必要になりました。オブジェクトストレージへのアップロードとダウンロードを行う手順があったので、その手順に従い設定するとアップロードはできるようになりました。
ただし、日本語名のファイルは文字化けしてしまいました。残念。
他の方法を探してみたところ、DBMS_CLOUDパッケージを使うともう少し簡単にできそうだったので試してみました。
Always FreeのAutonomous Databaseインスタンス作成
- なにはともあれOracle APEXが必要です。
- Oracle Cloud Infrastructure(以降OCI)にログインして、Always FreeのAutonomous Databaseインスタンスを作成します。2021/5時点ではAPEXインスタンスが選べるようになっていましたので、そちらを選択しました。Autonomous Transaction ProcessingでもAPEXは使えます。
- ADMINのパスワードはひとまず「T5w!Z9uu+eJ$UENs」としました。
- インスタンスがデプロイされるまで少し待ちます。
APEXワークスペースの準備
- APEXインスタンスがデプロイされたら、APEXの管理ページに移動して先程決めたADMINパスワードを入力してログインします。
- 「Create WorkSpace」というボタンがありますので、押して作成します。
Key | Value |
---|---|
Oracle APEXワークスペース管理者ID | APEXOBJJPN |
パスワード | fe4nxa-89lk05AGA |
Oracle APEXワークスペース名 | APEXOBJJPN |
- ワークスペースが作成されたら、APEXOBJJPNでワークスペースにログインできるのを確認し、一旦Oracle APEXからログアウトしておきます。
Autonomous Databaseの権限付与
オブジェクトストレージへのアクセスはDBMS_CLOUDパッケージの関数を使うと出来ますが、DBMS_CLOUDパッケージを利用するにはDBMS_CLOUDの実行権限を付与しなければなりません。 Oracle Help Center
- Autonomous Databaseインスタンスのページに行き、「ツール」-> 「データベース・アクション」を開きます。
- ユーザ名ADMIN、パスワードはAutonomous Database管理者用パスワード(今回はT5w!Z9uu+eJ$UENs)でログインします。
- 「SQL」を選び、下記SQLを実行します。
GRANT EXECUTE ON DBMS_CLOUD TO APEXOBJJPN;
- これでユーザ「APEXOBJJPN」がDBMS_CLOUDパッケージを利用できるようになりました。
コンパートメントとオブジェクトストレージの準備
APEXインスタンスの他に、保存先となるオブジェクトストレージが必要です。
また、Oracle Cloudにはコンパートメントという単位があり、オブジェクトストレージなどの各種リソースをコンパートメントに所属させることが出来ます。私はリソースのグループ名と理解しています。
- OCIのコンソールに戻り、画面左上のハンバーガー(≡)メニューから、「アイデンティティとセキュリティ」→「コンパートメント」に進みます。
- 「コンパートメントの作成」を押し、コンパートメントを作ります。
Key | Value |
---|---|
名前 | OBJTEST |
説明 | OracleAPEXからのオブジェクトストレージアクセス用 |
- コンパートメントが出来たら、次はオブジェクトストレージをOBJTESTコンパートメント内に作ります。
- ハンバーガーメニュー -> ストレージ -> オブジェクトストレージを開きます。
- 画面左側に「コンパートメント」というコンボボックスがあるので、そこから「OBJTEST」を選びます。
- Oracle APEXからアップロードしたファイルの保管用バケットを一つ作ります。可視性はプライベートのままにしておきます。
Key | Value |
---|---|
バケット名 | BucketForAPEX |
- バケットが出来たら、何でも良いのでファイルを2、3個アップロードしておきます。
- アップロードしたファイルの右側にある団子(︙)をクリックし、「オブジェクト詳細の表示」を表示し、バケットのURLをコピーしておきます。
- 例:https://objectstorage.ap-tokyo-1.oraclecloud.com/n/YourNamespace/b/BucketForAPEX/o/
アップロード用ユーザの作成とポリシーの作成
オブジェクトストレージもバケットを作っただけではアクセスが出来ません。
まずはBucketForAPEXバケットの読み書きができるOracle CloudのIAMユーザを作成します。その後、アクセス権限の付与とOracle APEX側で使う認証トークンの生成を行います。
- ハンバーガーメニュー -> アイデンティティとセキュリティ -> ユーザー を選びます。
- 「ユーザの作成」を押し、ユーザを作ります。
Key | Value |
---|---|
ユーザタイプ | IAMユーザー(OCIでのみ利用できるユーザ) |
名前 | OBJADMIN |
説明 | Oracle APEXからオブジェクトストレージへのアクセス用ユーザ |
- ユーザが作成出来たら、OBJADMINユーザのページに行き、画面左下にある「認証トークン」を選びます。
- 「トークンの作成」ボタンを押します。するとトークンが作成されますので「コピー」を押してクリップボードにコピーし、どこか他の場所に貼り付けて保管しておきます。
Key | Value |
---|---|
OBJADMINのAPEX用認証トークン | O<3WIPd>0<OSrA7>)orA |
- 続いてグループの作成に移ります。ハンバーガーメニューからアイデンティティに移動し、「グループ作成」を押します。
Key | Value |
---|---|
グループ名 | OBJTESTGROUP |
説明 | オブジェクトストレージ管理用グループ |
- グループにOBJADMINユーザを追加します。
- アイデンティティに戻り、今度は「ポリシー」を選びます。
- 画面左下の「コンパートメント」から、「OBJTEST」を選んでおきます。
- 「ポリシーの作成」を押します。
Key | Value |
---|---|
名前 | OBJTEST_ObjectStorageAdmin |
説明 | オブジェクトストレージ管理用ポリシー |
コンパートメント | OBJTEST |
ポリシーユースケース | ストレージ管理 |
共通ポリシー・テンプレート | オブジェクト・ストレージ管理者がバケット及びオブジェクト管理を~ |
グループ | OBJTESTGROUP |
場所 | OBJTEST |
ここまで入力すると、ポリシー・ステートメントに
Allow OBJTESTGROUP to manage buckets in compartment OBJTEST
Allow OBJTESTGROUP to manage objects in compartment OBJTEST
と作られますので、「作成」を押します。OBJTESTGROUPに所属しているユーザであれば、OBJTESTコンパートメント内のバケットを好きなようにできる、という権限になります。
最小権限の原則からみるとManage権限は広すぎますが、今回はそのまま続行します。
認証情報の登録
- Oracle APEXのワークスペース開発画面に移動し、APEXOBJJPNワークスペースにログインします。
- 上の方にあるSQLワークショップ -> SQLコマンドと進みます。
- DBMS_CLOUDパッケージの関数には、引数としてcredential_nameがあります。毎回パスワードを入れるのでは無くデータベースに予め認証情報を保存しておき、それを名前を指定して呼び出す形になっているようです。
- というわけでObject Storage用の認証情報を作成します。
begin
DBMS_CLOUD.create_credential (
credential_name => 'CRED_OBJECTSTORAGE',
username => 'OBJADMIN',
password => 'O<3WIPd>0<OSrA7>)orA'
) ;
end;
/
- 保存した認証情報を使って、Object Storageへアクセスできるか確認してみます。DBMS_CLOUDのLIST_OBJECTSを使います。
select * from DBMS_CLOUD.LIST_OBJECTS(
credential_name => 'CRED_OBJECTSTORAGE',
location_uri =>'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/YourNamespace/b/BucketForAPEX/o/'
);
-- NOTE: URIはご自身の環境に置き換えてください
- ポリシーなどがきちんと設定されていれば、バケットにあるファイルの一覧が表示されます。
と、この後のOracle APEX側のアプリ作成部分も書いたのですが、操作ミスにより消えてしまいました(涙)
というわけでアップロードの部分は後編で!
Discussion