How To Setup And Use DBMS_CLOUD Package (Doc ID 2748362.1)
今回のAmazon S3にアクセスすることが目的であることもあり、AWS Database Blogの以下の記事に従って作業することにしました。
Use the DBMS_CLOUD package in Amazon RDS Custom for Oracle for direct Amazon S3 integration
Amazon S3バケットを作成する
ポリシーを作成する
{ | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Sid": "OracleFreeS3Policy", | |
"Effect": "Allow", | |
"Action": [ | |
"s3:PutObject", | |
"s3:GetObject", | |
"s3:ListBucket", | |
"s3:DeleteObject" | |
], | |
"Resource": [ | |
"arn:aws:s3:::<your bucket name>", | |
"arn:aws:s3:::<your bucket name>/*" | |
] | |
} | |
] | |
} |
IAMユーザーを作成する
パッケージDBMS_CLOUDをインストールする
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql | |
set verify off | |
-- you must not change the owner of the functionality to avoid future issues | |
define username='C##CLOUD$SERVICE' | |
create user &username no authentication account lock; | |
REM Grant Common User Privileges | |
grant INHERIT PRIVILEGES on user &username to sys; | |
grant INHERIT PRIVILEGES on user sys to &username; | |
grant RESOURCE, UNLIMITED TABLESPACE, SELECT_CATALOG_ROLE to &username; | |
grant CREATE ANY TABLE, DROP ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, | |
CREATE ANY CREDENTIAL, CREATE PUBLIC SYNONYM, CREATE PROCEDURE, ALTER SESSION, CREATE JOB to &username; | |
grant CREATE SESSION, SET CONTAINER to &username; | |
grant SELECT on SYS.V_$MYSTAT to &username; | |
grant SELECT on SYS.SERVICE$ to &username; | |
grant SELECT on SYS.V_$ENCRYPTION_WALLET to &username; | |
grant read, write on directory DATA_PUMP_DIR to &username; | |
grant EXECUTE on SYS.DBMS_PRIV_CAPTURE to &username; | |
grant EXECUTE on SYS.DBMS_PDB_LIB to &username; | |
grant EXECUTE on SYS.DBMS_CRYPTO to &username; | |
grant EXECUTE on SYS.DBMS_SYS_ERROR to &username; | |
grant EXECUTE ON SYS.DBMS_ISCHED to &username; | |
grant EXECUTE ON SYS.DBMS_PDB_LIB to &username; | |
grant EXECUTE on SYS.DBMS_PDB to &username; | |
grant EXECUTE on SYS.DBMS_SERVICE to &username; | |
grant EXECUTE on SYS.DBMS_PDB to &username; | |
grant EXECUTE on SYS.CONFIGURE_DV to &username; | |
grant EXECUTE on SYS.DBMS_SYS_ERROR to &username; | |
grant EXECUTE on SYS.DBMS_CREDENTIAL to &username; | |
grant EXECUTE on SYS.DBMS_RANDOM to &username; | |
grant EXECUTE on SYS.DBMS_SYS_SQL to &username; | |
grant EXECUTE on SYS.DBMS_LOCK to &username; | |
grant EXECUTE on SYS.DBMS_AQADM to &username; | |
grant EXECUTE on SYS.DBMS_AQ to &username; | |
grant EXECUTE on SYS.DBMS_SYSTEM to &username; | |
grant EXECUTE on SYS.SCHED$_LOG_ON_ERRORS_CLASS to &username; | |
grant SELECT on SYS.DBA_DATA_FILES to &username; | |
grant SELECT on SYS.DBA_EXTENTS to &username; | |
grant SELECT on SYS.DBA_CREDENTIALS to &username; | |
grant SELECT on SYS.AUDIT_UNIFIED_ENABLED_POLICIES to &username; | |
grant SELECT on SYS.DBA_ROLES to &username; | |
grant SELECT on SYS.V_$ENCRYPTION_KEYS to &username; | |
grant SELECT on SYS.DBA_DIRECTORIES to &username; | |
grant SELECT on SYS.DBA_USERS to &username; | |
grant SELECT on SYS.DBA_OBJECTS to &username; | |
grant SELECT on SYS.V_$PDBS to &username; | |
grant SELECT on SYS.V_$SESSION to &username; | |
grant SELECT on SYS.GV_$SESSION to &username; | |
grant SELECT on SYS.DBA_REGISTRY to &username; | |
grant SELECT on SYS.DBA_DV_STATUS to &username; | |
alter session set current_schema=&username; | |
REM Create the Catalog objects | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_task_catalog.sql | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_task_views.sql | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_catalog.sql | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_types.sql | |
REM Create the Package Spec | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_core.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_task.plb | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_capability.sql | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_request.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_internal.plb | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud.sql | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_admin_int.plb | |
REM Create the Package Body | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_core_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_task_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_capability_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_request_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_internal_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_body.plb | |
@$ORACLE_HOME/rdbms/admin/prvt_cloud_admin_int_body.plb | |
-- Create the metadata | |
@$ORACLE_HOME/rdbms/admin/dbms_cloud_metadata.sql | |
alter session set current_schema=sys; | |
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql |
[oracle@apexs3 ~]$ . oraenv
ORACLE_SID = [oracle] ? FREE
The Oracle base has been set to /opt/oracle
[oracle@apexs3 ~]$
$ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/[SYSのパスワード] --force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d /home/oracle -l /home/oracle dbms_cloud_install.sql
[oracle@apexs3 ~]$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/****** --force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d /home/oracle -l /home/oracle dbms_cloud_install.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/home/oracle/dbms_cloud_install_catcon_2850.lst]
catcon::set_log_file_base_path: catcon: See [/home/oracle/dbms_cloud_install*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/home/oracle/dbms_cloud_install_*.lst] files for spool files, if any
catcon.pl: completed successfully
[oracle@apexs3 ~]$
column name format a10 | |
column owner format a20 | |
column object_name format a12 | |
column status format a10 | |
set tab off | |
select v.name, o.owner, o.object_name, o.status, o.sharing, o.oracle_maintained | |
from cdb_objects o join v$containers v on o.con_id=v.con_id | |
where o.object_name = 'DBMS_CLOUD' | |
order by name; |
[oracle@apexs3 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Dec 11 13:36:11 2023
Version 23.3.0.23.09
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL> column name format a10
column owner format a20
column object_name format a12
column status format a10
set tab off
select v.name, o.owner, o.object_name, o.status, o.sharing, o.oracle_maintained
from cdb_objects o join v$containers v on o.con_id=v.con_id
where o.object_name = 'DBMS_CLOUD'
order by name;SQL> SQL> SQL> SQL> SQL> SQL> 2 3 4
NAME OWNER OBJECT_NAME STATUS SHARING O
---------- -------------------- ------------ ---------- ------------------ -
CDB$ROOT PUBLIC DBMS_CLOUD VALID METADATA LINK Y
CDB$ROOT C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
CDB$ROOT C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
FREEPDB1 PUBLIC DBMS_CLOUD VALID METADATA LINK Y
FREEPDB1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
FREEPDB1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
6 rows selected.
SQL>
データベースにSSLウォレットを設定する
$ORACLE_HOME/network/admin/sqlnet.oraに以下の1行を追記します。
WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/home/oracle/wallet)))
CDBにACEsを設定する
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql | |
-- SSL Wallet directory | |
define sslwalletdir=/home/oracle/wallet | |
define clouduser=C##CLOUD$SERVICE | |
-- Create New ACL / ACEs | |
begin | |
-- Allow all hosts for HTTP/HTTP_PROXY | |
dbms_network_acl_admin.append_host_ace( | |
host =>'*', | |
lower_port => 443, | |
upper_port => 443, | |
ace => xs$ace_type( | |
privilege_list => xs$name_list('http', 'http_proxy'), | |
principal_name => upper('&clouduser'), | |
principal_type => xs_acl.ptype_db)); | |
-- Allow wallet access | |
dbms_network_acl_admin.append_wallet_ace( | |
wallet_path => 'file:&sslwalletdir', | |
ace => xs$ace_type(privilege_list => | |
xs$name_list('use_client_certificates', 'use_passwords'), | |
principal_name => upper('&clouduser'), | |
principal_type => xs_acl.ptype_db)); | |
end; | |
/ | |
-- Setting SSL_WALLET database property | |
begin | |
if sys_context('userenv', 'con_name') = 'CDB$ROOT' then | |
execute immediate 'alter database property set ssl_wallet=''&sslwalletdir'''; | |
end if; | |
end; | |
/ | |
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql |
[oracle@apexs3 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Dec 11 13:46:24 2023
Version 23.3.0.23.09
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL> @setup_aces.sql
Session altered.
old 9: principal_name => upper('&clouduser'),
new 9: principal_name => upper('C##CLOUD$SERVICE'),
old 14: wallet_path => 'file:&sslwalletdir',
new 14: wallet_path => 'file:/home/oracle/wallet',
old 17: principal_name => upper('&clouduser'),
new 17: principal_name => upper('C##CLOUD$SERVICE'),
PL/SQL procedure successfully completed.
old 3: execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
new 3: execute immediate 'alter database property set ssl_wallet=''/home/oracle/wallet''';
PL/SQL procedure successfully completed.
Session altered.
SQL>
PDBにACEsを設定する
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql | |
-- SSL Wallet directory | |
define sslwalletdir=/home/oracle/wallet | |
define cloudrole=CLOUD_USER_ROLE | |
-- Create New ACL / ACEs | |
begin | |
-- Allow all hosts for HTTP/HTTP_PROXY | |
dbms_network_acl_admin.append_host_ace( | |
host =>'*', | |
lower_port => 443, | |
upper_port => 443, | |
ace => xs$ace_type( | |
privilege_list => xs$name_list('http', 'http_proxy'), | |
principal_name => upper('&cloudrole'), | |
principal_type => xs_acl.ptype_db)); | |
-- Allow wallet access | |
dbms_network_acl_admin.append_wallet_ace( | |
wallet_path => 'file:&sslwalletdir', | |
ace => xs$ace_type(privilege_list => | |
xs$name_list('use_client_certificates', 'use_passwords'), | |
principal_name => upper('&cloudrole'), | |
principal_type => xs_acl.ptype_db)); | |
end; | |
/ | |
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql |
スクリプト名はconfigure_role.sqlとします。
Oracle APEXの環境を手順通りに作成していると、FREEPDB1というPDBにAPEXがインストールされています。
sqlplus / as sysdba
alter session set container=FREEPDB1;
create role CLOUD_USER_ROLE;
@configure_role
[oracle@apexs3 ~]$ sqlplus / as sysdba
SQL*Plus: Release 23.0.0.0.0 - Production on Mon Dec 11 14:05:14 2023
Version 23.3.0.23.09
Copyright (c) 1982, 2023, Oracle. All rights reserved.
Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09
SQL> alter session set container=FREEPDB1;
Session altered.
SQL> create role CLOUD_USER_ROLE;
Role created.
SQL> @configure_role
Session altered.
old 9: principal_name => upper('&cloudrole'),
new 9: principal_name => upper('CLOUD_USER_ROLE'),
old 14: wallet_path => 'file:&sslwalletdir',
new 14: wallet_path => 'file:/home/oracle/wallet',
old 17: principal_name => upper('&cloudrole'),
new 17: principal_name => upper('CLOUD_USER_ROLE'),
PL/SQL procedure successfully completed.
Session altered.
SQL>
ロールCLOUD_USER_ROLEに、ビューDBA_CREDENTIALSのSELECT権限とパッケージDBMS_CLOUDの実行権限を与えます。
SQL> grant execute on dbms_cloud to cloud_user_role;
Grant succeeded.
SQL> grant select on dba_credentials to cloud_user_role;
Grant succeeded.
SQL>
APEXのワークスペースのスキーマに作成したロールを割り当てます。以下ではWKSP_APEXDEVというスキーマが作成済みとしています。
SQL> grant cloud_user_role to wksp_apexdev;
Grant succeeded.
SQL>
以上で、Oracle APEXのSQLコマンドより、パッケージDBMS_CLOUDを呼び出す準備ができました。
DBMS_CLOUDを呼び出す
begin
dbms_cloud.create_credential(
credential_name => 'cred_demouser'
,username => 'アクセスキー'
,password => 'シークレットアクセスキー'
);
end;
declare
l_resp dbms_cloud_types.resp;
l_blob blob;
l_clob clob;
begin
l_clob := 'my first upload';
l_blob := apex_util.clob_to_blob(l_clob);
l_resp := dbms_cloud.send_request(
credential_name => 'cred_demouser'
,uri => 'https://s3.us-east-1.amazonaws.com/myoraclefreebucket/test.txt'
,method => 'PUT'
,body => l_blob
);
end;
select * from dbms_cloud.list_objects(
credential_name => 'cred_demouser'
,location_uri => 'https://s3.us-east-1.amazonaws.com/myoraclefreebucket'
)
declare
l_resp dbms_cloud_types.resp;
l_clob clob;
begin
l_resp := dbms_cloud.send_request(
credential_name => 'cred_demouser'
,uri => 'https://s3.us-east-1.amazonaws.com/myoraclefreebucket/test.txt'
,method => 'GET'
);
l_clob := dbms_cloud.get_response_text(
resp => l_resp
);
dbms_output.put_line(l_clob);
end;
begin
dbms_cloud.send_request(
credential_name => 'cred_demouser'
,uri => 'https://s3.us-east-1.amazonaws.com/myoraclefreebucket/test.txt'
,method => 'DELETE'
);
end;